zoukankan      html  css  js  c++  java
  • 第7章:深入理解常用控制器

    7.1 Pod与controller的关系

    • controllers:在集群上管理和运行容器的对象。有时也称为工作负载(workload)

    • 通过label-selector相关联,如下图所示。

    • Pod通过控制器实现应用的运维,如伸缩,滚动升级等

    pod-controller

    7.2 无状态应用部署控制器 Deployment

    Deployment功能:

    • 部署无状态应用(无状态应用简单来讲,就是Pod可以漂移任意节点,而不用考虑数据和IP变化)

    • 管理Pod和ReplicaSet(副本数量管理控制器)

    • 具有上线部署、副本设定、滚动升级、回滚等功能

    • 提供声明式更新,例如只更新一个新的Image

    应用场景:Web服务,微服务

    下图是Deployment 标准YAML,通过标签与Pod关联。

    deployment-yaml

    使用YAML部署一个java应用:

    # kubectl create deployment web --image=lizhenliang/java-demo -o yaml --dry-run > web-deploy.yaml

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      labels:
        app: web
      name: web
      namespace: default
    spec:
      replicas: 3    # 设置3个副本
      selector:
        matchLabels:
          app: web   # deployment控制器关联pod的标签,与下面pod的标签名称相同,否则deployment控制器无法管理pod
      template:      # pod模板
        metadata:
          labels:
            app: web # pod的标签名称
        spec:
          containers:
          - image: lizhenliang/java-demo
            name: java-demo
        
    # kubectl apply -f web-deploy.yaml

    将这个java应用暴露到集群外部访问:

    # kubectl expose deployment/web --port=80 --target-port=8080 --name web --type=NodePort -o yaml --dry-run > web-expose.yaml

    apiVersion: v1
    kind: Service
    metadata:
      labels:
        app: web
      name: web
      namespace: default
    spec:
      ports:
      - port: 80             # 集群内容访问应用端口
        protocol: TCP
        targetPort: 8080     # 容器镜像端口
        nodePort: 30008      # 对外暴露的端口
      selector:
        app: web             # 该标签名称必须与deployment控制器中关联pod的标签名称相同,否则无法连暴露pod
      type: NodePort
     
    # kubectl apply -f web-expose.yaml

    查看资源:

    # kubectl get deploy,pods,svc,ep -o wide -n default

    image-20210504004105351

    浏览器输入:http://NodeIP:30008 即可访问到该应用。

    1 升级项目,即更新最新镜像版本,这里换一个nginx镜像为例
    kubectl set image deployment/web java-demo=tomcat --record
    # 查看升级状态
    # kubectl rollout status deployment/web
    Waiting for deployment "web" rollout to finish: 2 out of 3 new replicas have been updated...
    Waiting for deployment "web" rollout to finish: 2 out of 3 new replicas have been updated...
    Waiting for deployment "web" rollout to finish: 2 out of 3 new replicas have been updated...
    Waiting for deployment "web" rollout to finish: 1 old replicas are pending termination...
    Waiting for deployment "web" rollout to finish: 1 old replicas are pending termination...
    deployment "web" successfully rolled out

    2 如果该版本发布失败想回滚到上一个版本可以执行
    # 回滚最新版本
    kubectl rollout undo deployment/web
    # 也可以回滚到指定发布记录
    # 查看发布记录
    kubectl rollout history deployment/web
    # 回滚指定版本
    kubectl rollout undo deployment/web --to-revision=1
    kubectl rollout status deployment/web

    3 扩容/缩容
    # 将pod扩容到5个
    kubectl scale deployment web --replicas=5
    # --replicas 设置比现在值大就是扩容,反之就是缩容。
    kubectl rollout status deployment/web

    4 查看扩容后的状态
    # kubectl get rs,deploy
    NAME                             DESIRED   CURRENT   READY   AGE
    replicaset.apps/web-787b446885   0         0         0       22m
    replicaset.apps/web-7c65cbbdfd   0         0         0       26m
    replicaset.apps/web-844f79f54c   5         5         5       40m

    NAME                 READY   UP-TO-DATE   AVAILABLE   AGE
    deployment.apps/web   5/5     5           5           40m

    kubectl set image 会触发滚动更新,即分批升级Pod。

    滚动更新原理其实很简单,利用新旧两个replicaset,例如副本是3个,首先Scale Up增加新RS副本数量为1,准备就绪后,Scale Down减少旧RS副本数量为2,以此类推,逐渐替代,最终旧RS副本数量为0,新RS副本数量为3,完成本次更新。这个过程可通过 kubectl describe deployment web 看到。

    rolling-update

    7.3 守护进程控制器 DaemonSet

    DaemonSet功能:

    • 在每一个Node上运行一个Pod

    • 新加入的Node也同样会自动运行一个Pod

    应用场景:Agent,例如监控采集工具,日志采集工具

    daemonset

    # cat daemonset-busybox.yaml

    apiVersion: apps/v1
    kind: DaemonSet
    metadata:
      labels:
        app: busybox
      name: busybox
      namespace: default
    spec:
      selector:
        matchLabels:
          app: busybox
      template:
        metadata:
          labels:
            app: busybox
        spec:
          containers:
          - image: busybox
            name: busybox

    7.4 批处理 Job & CronJob

    Job:一次性执行

    应用场景:离线数据处理,视频解码等业务

    apiVersion: batch/v1
    kind: Job
    metadata:
      name: pi
    spec:
      template:
        spec:
          containers:
          - name: pi
            image: perl
            command: ["perl",  "-Mbignum=bpi", "-wle", "print bpi(2000)"]
          restartPolicy: Never   # 作业失败后会不再尝试创建新的Pod
      backoffLimit: 4            # .spec.backoffLimit字段限制重试次数。默认情况下,这个字段默认值是6。

    上述示例中将π计算到2000个位置并将其打印出来。完成大约需要10秒。

    查看任务:

    # kubectl get job,pod -o wide

    image-20210504001155195

    CronJob:定时任务,像Linux的Crontab一样。

    应用场景:通知,备份

    apiVersion: batch/v1beta1
    kind: CronJob
    metadata:
      name: hello
    spec:
      schedule: "*/1 * * * *"
      jobTemplate:
        spec:
          template:
            spec:
              containers:
              - name: hello
                image: busybox
                args:
                - /bin/sh
                - -c
                - date; echo Hello from the Kubernetes cluster
              restartPolicy: OnFailure  # 作业失败并返回状态码非0时,尝试创建新的Pod运行任务

    上述示例中将每分钟打印一次Hello。

    查看任务:

    # kubectl get cronjob,pod -o wide

    image-20210504001528077


  • 相关阅读:
    C语言I博客作业04
    解决@ResponseBody注解返回的json中文乱码问题
    自定义 Helper Method
    webapi 学习1
    分布式事务TransactionOptions及设置msdtc
    了解websocket是什么
    用postman 来实现post方式返回json数据
    异步 Controller
    asp.net mvc Filter
    asp.net mvc Controller Factory
  • 原文地址:https://www.cnblogs.com/LiuChang-blog/p/14729333.html
Copyright © 2011-2022 走看看