Kubernetes之pod控制器

1.  关于pod控制器

    pod控制器由master的kube-controller-manager 组件提供,常见的此类控制器有 Replication、Controller 、 ReplicaSet 、 Deployment 、 DaemonSet StatefulSet 、 Job 和 CronJob 等,它们分别以不同的方式管理 Pod 资源对象

2.  控制器与pod对象

    1.  pod控制器的组成部分

        1.  标签选择器

        2.  期望的副本数

        3.  Pod模板  用于新建pod资源对象的pod模板资源 

    2.  pod模板

        内嵌于控制器中使用,常用于为控制器指定自动创建pod资源对象时所需的配置信息

3.  ReplicaSet控制器

    1.  创建ReplicaSet

        1.  组成

            kind

            apiVersion

            metadata

            spec

              replicas  期望的pod对象副本数

              selector  当前控制器匹配pod对象副本的标签选择器 

              template  用于补足pod副本数量时使用的pod模板资源               

            status

    2.  ReplicaSet管控pod对象

        1.  缺少pod副本

            任何原因导致的相关Pod对象丢失,都会由ReplicaSet控制器自动补足

            1.  删除某个pod  

            2.  修改某个pod的标签选择器

        2.  多出pod副本

            多出的pod资源会被删除 

            1.  修改其它的pod为指定的标签选择器,会被ReplicatSet控制器删除

        3.  查看replicaSet控制器

            kubectl describe replicasets/tomcat-adapter

    3.  更新ReplicaSet控制器

        1.  更改pod模板

            更改pod模板,只影响之后创建的pod对象,对已有的副本不会产生作用

            对新版本的文件执行kubectl apply或者kubectl replace命令

            此时,手动删除控制器现有的Pod对象,并由控制器基于新的Pod模板自动创建出足额的Pod副本,即可完成一次应用的升级

        2.  扩容和缩容

            扩容

              kubectl scale replicasets rs的名称 --replicas=5

            缩容

              kubectl scale replicasets rs的名称 --replicas=3

    4.  删除ReplicaSet控制器资源

        取消级联删除

          kubectl delete replicasets rs的名称 --cascade=false

4.  Deployment控制器        

    构建于ReplicaSet控制器之上                              

    

    1.  创建Deployment

apiVersion : apps/vl
kind : Deployment
metadata :
  name : myapp-deploy
spec :
  replicas: 3
  selector :
    matchLabels :
      app: myapp
  template :
    metadata :
      labels :
        app : myapp
    spec :
      containers :
      - name : myapp
        image : ikubernetes/rnyapp:vl
        ports :
        - containerPort : 80
          name : http

        kubectl apply -f myapp-deploy.yaml

    2.  更新策略

        deployment只需用户在pod模板中修改指定的内容,剩下的步骤由deployment自动完成。Deployment支持两种更新策略:滚动更新和重新创建

        1.  滚动更新

            Deployment控制器的滚动更新操作并非在同一个ReplicaSet控制器对象下删除并创建pod资源,而是将它们分置于两个不同的控制器之下

            

            控制变动的方式和pod对象的数量范围通过spec.strategy.rollingUpdate.maxSurge和spec.strategy.rollingUpdate.maxUnavailable两个属性协同进行定义

              maxSurge:  升级期间存在的总pod对象数量最多可超出期望值的个数,其值可以是0或正整数,也可以是一个期望值的百分比;例如:如果期望值是3,当前的属性值为1,则表示pod对象的总数不能超过4个      

              maxUnavailable:  升级期间正常可用的pod副本数最多不能低于期望数值的个数,其值可以0或正整数,也可以是一个期望值的百分比;默认值为1,该值意味着如果期望值是3,则升级期间至少要有两个pod对象处于正常提供服务的状态 

              这两个值不能同时为0  

              spec.revisionHistoryLimit:  设置控制器可保存的历史版本数量

              spec.minReadySeconds  属性来控制应用升级的速度                       

        2.  重新创建        

            首先删除现有的pod对象,而后由控制器基于新模板重新创建出新版本资源对象

    3.  升级Deployment

        1.  更新deployment的镜像

            kubectl set image deployments myapp-deploy myapp=ikubernetes/myapp:v2

        2.  查看滚动更新过程中的状态信息

            kubectl rollout status deployments myapp-deploy

            kubectl get deployments myapp-deploy --watch

        3.  myapp-deploy控制器会创建一个新的ReplicaSet控制器来管控新版本的pod对象,升级完成后,旧版本的ReplicaSet会保留在历史记录中,但其此前的管控pod对象将会被删除

    4.  金丝雀发布

        金丝雀发布过程通常采用:先添加,再删除,且可用Pod资源对象总数不低于期望值的方式进行。

        1.  将Deployment控制器的maxSurge属性的值设置为1,并将maxUnavailable属性的值设置为0

            kubectl patch deployments myapp-deploy -p '{"spec": {"rollingUpdate": {"maxSurge":1, "maxUnavailable":0}}}}'

        2.  修改对应容器的镜像版本后立即暂停更新进度

            kubectl set image deployments myapp-deploy myapp=ikubernetes/myapp:v3 && kubectl rollout pause deployments myapp-deploy

        3.  查看状态

            kubectl rollout status deployments myapp-deploy

        4.  验证新的pod业务功能使用正常

        5.  继续此前的滚动更新过程

            kubectl rollout resume deployments myapp-deploy

    5.  回滚deployment控制器的应用发布

        1.  回滚

            kubectl rollout undo deployments myapp-deploy

        2.  回滚到指定版本

            kubectl rollout undo deployments myapp-deploy --to-revision=2

        3.  查看历史版本

            kubectl rollout history deployments myapp-deploy

    6.  扩容和缩容

        1.  Deployment控制器是声明式配置,replicas属性的值可直接修改资源配置文件,然后使用kubectl apply进行应用

        2.  使用kubectl edit进行实时修改

        3.  使用kubectl scale专用于扩展某些控制器类型的应用规模的命令  

5.  Daemonset控制器

    用于在集群中的全部节点上同时运行一份指定的pod资源副本,后续新加入集群的工作节点也会自动创建一个相关的pod对象,当从集群移除节点时,此类pod对象也会被自动回收

    1.  应用场景

        1.  运行集群存储的守护进程,如在各个节点上运行glusterd或ceph

        2.  在各个节点上运行日志收集守护进程,如fluentd和logstash

        3.  在各个节点上运行监控系统的代理守护进程,如prometheus node exporter, Datadog agent,Ganglia gmond等

    2.  创建DaemonSet资源对象      

apiVersion: apps/v1
kind: DaemonSet
metadata :
     name : filebeat-ds
     labels:
        app : filebeat
     spec:
        selector :
            matchLabels :
                 app : filebeat
        template :
           metadata :
                labels :
                   app : filebeat
                name: filebeat
           spec :
               containers :
               - name : filebeat
                 image : ikubernetes/filebeat:5.6.5-alpine
                 env :
                 - name : REDIS_HOST
                    value : db.ilinux.io:6379
                 -name : LOG_LEVEL
                    value : info

    3.  更新DaemonSet对象

        配置定义在spec.update-Strategy嵌套字段中

        支持RollingUpdate喝OnDelete两种更新策略,滚动更新为默认的更新策略

        更新过程,以上面的filebeat为例

          kubectl set image daemonsets filebeat-ds filebeat=ikubernetes/filibeat:5.6.6-alpine

6.  Job控制器

    Job控制器用于调配Pod对象运行一次性任务,容器中的进程在正常运行结束后不会对其进行重启,而是将Pod对象置于Completed状态。

    若容器中的进程因错误而终止,则需要依配置确定重启与否,未运行完成的Pod对象因其所在的节点故障而意外终止后会被重新调度。   

    

    1.  创建job对象

        Job控制器的spec字段内嵌的必要字段仅为template

apiVersion: batch/v1
kind: Job
metadata:
     name: job-example
spec:
    template:
        spec:
            containers:
            -  name: myjob
               image: alpine
               command: ["/bin/sh","-c","sleep 120"]
             restartPolicy: Never 

        kubectl create -f job-example.yml

    2.  查看任务状态

        kubectl get jobs job-example

    3.  并行式Job

        spec.parallelism  并行度属性,默认值为1

        spec.completion  总任务数

apiVersion: batch/v1
kind: Job
metadata:
     name: job-multi
spec:
        completions: 5
    template:
        spec:
            containers:
            -  name: myjob
               image: alpine
               command: ["/bin/sh","-c","sleep 120"]
             restartPolicy: OnFailure      

    4.  Job扩容

        kubectl scale jobs job-multi --replicas=2    

    5.  删除Job        

        kubectl delete jobs job-multi

        如果某Job控制器的容器应用总是无法正常结束运行,而其restartPolicy又定为了重启,则它可能一直处于不停地重启和错误的循环当中。

        spec.activeDeadlineSeconds <integer>  指定最大活动事假内插度,超出此时长的作业将被终止,单位为秒

        spec.backoffLimit <integer>  降作业标记为失败状态之前的重试次数     

7.  CronJob控制器

    CronJob控制器用于管理Job控制器资源的运行时间。

    在未来某时间点运行作业一次。

    在指定的时间点重复运行作业。

    CronJob控制器在指定的时间点,?和*的意义相同,都表示任何可用的有效值。

    1.  常用字段    

        CronJob控制器的spec字段可嵌套使用字段

          jobTemplate <Object>  Job控制器模板,用于为CronJob控制器生成Job对象;必选字段

          schedule <string>  Cron格式的作业调度运行时间点;必须字段

          concurrencyPolicy <string>  并发执行策略,可用值有Allow,Forbid,Replace,用于定义前一次作业运行尚未完成时是否以及如何运行后一次的作业

          failedJobHistoryLimit <integer>  为失败的任务执行保留的历史记录数,默认为1

          successfulJobsHistoryLimit <integer>  为成功的任务执行保留的历史记录数,默认为3

          startingDeadlineSeconds <integer>  因各种原因缺乏执行作业的时间点所导致的启动作业错误的超时时长,会被记入错误历史记录

          suspend <boolean>  是否挂起后续的任务执行

    2.  创建CronJob对象

apiVersion : batch/vlbeta1
kind : CronJob
metadata:
     name : cronjob-example
     labels :
        app : mycronjob
spec :
    schedule : " */2 * * * * "
    jobTemplate :
       metadata:
            labels:
               app : mycronjob-jobs
       spec :
           parallelism : 2
           template :
              spec :
                  containers :
                  -   name : myjob
                      image : alpine
                      command :
                      - /bin/sh
                      - -c
                      - date ; echo Hello from the Kubernetes cluster ; sleep 10
                  restartPolicy : OnFailure

        查看CronJob资源对象的状态  kubectl get cronjobs cronjob-example                              

posted @ 2022-05-17 16:20  奋斗史  阅读(59)  评论(0)    收藏  举报