暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Kubernetes系列之Deployment控制器使用

程序员同行者 2019-03-26
324


名词解析



Deployment(ds)为Pod和ReplicaSet提供了一个声明式定义(declarative)方法,用来替代以前的ReplicationController来方便的管理应用。简单的说就是升级版的ReplicationController,包含rc的所有功能,并加了很多牛逼的功能。

典型的应用场景包括:

- 定义Deployment来创建Pod和ReplicaSet

- 滚动升级和回滚应用

- 扩容和缩容

- 暂停和继续Deployment


简单定义

    apiVersion: extensions/v1beta1
    kind: Deployment
    metadata:
      name: nginx-deployment
    spec:
      replicas: 3
      template:
        metadata:
          labels:
            app: nginx
        spec:
          containers:
          - name: nginx
            image: nginx:1.14.2
            ports:
            - containerPort: 80

    命令行创建一个deploy

      [root@master-01 ~]# kubectl  run ngi --image=nginx
      deployment.apps/ngi created

      Replica Set的名字总是<Deployment的名字>-<pod template的hash值。

      Replica Set将保证总是有N个的pod存在。

        [root@master-01 ~]# kubectl  get rs
        NAME                       DESIRED   CURRENT   READY   AGE
        ngi-76db489f79             1         1         1       34s
        [root@master-01 ~]# kubectl  get deploy
        NAME             READY   UP-TO-DATE   AVAILABLE   AGE
        ngi 1/1 1 1 74s

        如果创建的时候不指定副本数,默认将为1


        更新deploy(滚动更新)

        这种模式会等新的pod准备完成,才会删除旧的pod,默认它会确保至少有比期望的Pod数量少一个的Pod是up状态(最多一个不可用)。保障服务不间断更新。

          [root@master-01 ~]# kubectl  set image deploy ngi  ngi=bitnami/nginx
          deployment.extensions/ngi image updated

          查看更新状态

            [root@master-01 ~]# kubectl  rollout status deploy ngi
            deployment "ngi" successfully rolled out


            [root@master-01 ~]# kubectl  get deploy ngi -o yaml
            。。。
                  - image: bitnami/nginx
            。。。

            可以看到镜像被替换了。


            查看升级策略

              [root@master-01 ~]#kubectl edit deployment ngi
              ...
              strategy:
                  rollingUpdate:
                    maxSurge: 25%
                    maxUnavailable: 25%
              ...


              弹性伸缩

              加上–record参数可以在注解中记录历史命令

                [root@master-01 ~]# kubectl  scale deploy ngi --replicas=2 --record
                deployment.extensions/ngi scaled

                可以看到副本数变为2了

                  [root@master-01 ~]# kubectl  get po|grep ngi
                  ngi-585d46b946-c546l             1/1     Running   0          17m
                  ngi-585d46b946-hrdnl 1/1 Running 0 4m12s


                  autoscale自动伸缩

                  如果启用了horizontal pod autoscaling,就可以给Deployment设置一个autoscaler,基于当前Pod的CPU利用率选择最少和最多的Pod数。

                    [root@master-01 ~]# kubectl autoscale deploy ngi --min=10 --max=15 --cpu-percent=80
                    deployment "ngi" autoscaled

                    查看记录

                      [root@master-01 ~]# kubectl  rollout history deploy ngi
                      deployment.extensions/ngi 
                      REVISION  CHANGE-CAUSE
                      1         <none>       因为之前run nginx没开启record没有记录命令
                      2         kubectl scale deploy ngi --replicas=2 --record=true
                      查看单个revision详细信息
                      [root@master-01 ~]# kubectl  rollout history deploy ngi --revision=2
                      deployment.extensions/ngi with revision #2
                      Pod Template:
                        Labels:  pod-template-hash=585d46b946
                        run=ngi
                        Annotations:  kubernetes.io/change-cause: kubectl scale deploy ngi --replicas=2 --record=true
                        Containers:
                         ngi:
                          Image:  bitnami/nginx
                          Port:  <none>
                          Host Port:  <none>
                          Environment:  <none>
                          Mounts:  <none>
                        Volumes:  <none>

                      修改资源配额

                        [root@master-01 ~]# kubectl  set resources deploy ngi -c=ngi --limits=cpu=100m,memory=300m
                        deployment.extensions/ngi resource requirements updated


                        查看详情

                        可以看到资源信息已经更改了。

                          [root@master-01 ~]# kubectl  rollout history deploy ngi --revision=3
                          deployment.extensions/ngi with revision #4
                          Pod Template:
                            Labels:  pod-template-hash=5d78f7f8c4
                            run=ngi
                            Annotations:  kubernetes.io/change-cause: kubectl scale deploy ngi --replicas=2 --record=true
                            Containers:
                             ngi:
                              Image:  bitnami/nginx
                              Port:  <none>
                              Host Port:  <none>
                              Limits:
                                cpu:  100m
                                memory:  200m
                              Environment:  <none>
                              Mounts:  <none>
                            Volumes:  <none>

                          回退版本

                          不指定 --to-revision就是回退到上一个版本,反之就是回退到指定版本

                            [root@master-01 ~]# kubectl  rollout undo deploy ngi --to-revision=2
                            deployment.extensions/ngi rolled back
                            # 查看状态
                            [root@master-01 ~]# kubectl  get po
                            NAME                   READY   STATUS    RESTARTS   AGE
                            ngi-585d46b946-c546l   1/1     Running   0          83m


                            暂停和恢复Deployment

                            可以一次或多次更新前暂停一个Deployment,然后再恢复它。这样就能多次暂停和恢复Deployment,在此期间进行一些修复工作,而不会出发不必要的rollout。


                            例如使用刚刚创建Deployment:

                              [root@master-01 ~]# kubectl  get deploy
                              NAME   READY   UP-TO-DATE   AVAILABLE   AGE
                              ngi    1/1     1            1           103m
                              [root@master-01 ~]# kubectl  get rs
                              NAME             DESIRED   CURRENT   READY   AGE
                              ngi-585d46b946 1 1 1 91m


                              暂停Deploy

                                [root@master-01 ~]# kubectl  rollout pause deploy ngi
                                deployment.extensions/ngi paused

                                更新镜像地址

                                  [root@master-01 ~]# kubectl  set image deploy ngi ngi=nginx:1.13.1
                                  deployment.extensions/ngi image updated

                                  扩容实例数

                                    [root@master-01 ~]# kubectl  scale deploy ngi  --replicas=2
                                    deployment.extensions/ngi scaled

                                    更新资源配额

                                      [root@master-01 ~]# kubectl set resources deploy  ngi -c=ngi --limits=cpu=200m,memory=512Mi
                                      deployment.extensions/ngi resource requirements updated

                                      只要这个Deploy是暂停的,就可以进行多次更新,不会影响目前正在运行的Deploy


                                      恢复Deploy


                                        [root@master-01 ~]# kubectl  rollout resume deploy ngi
                                        deployment.extensions/ngi resumed


                                        查看更新后的deploy

                                          [root@master-01 ~]# kubectl  describe  deploy ngi 
                                          Name:                   ngi
                                          Namespace:              default
                                          CreationTimestamp:      Sun, 24 Mar 2019 10:39:05 +0800
                                          Labels:                 run=ngi
                                          Annotations:            deployment.kubernetes.io/revision: 9
                                                                  kubernetes.io/change-cause: kubectl scale deploy ngi --replicas=2 --record=true
                                          Selector:               run=ngi
                                          Replicas:               2 desired | 2 updated | 2 total | 2 available | 0 unavailable
                                          StrategyType:           RollingUpdate    滚动更新
                                          MinReadySeconds:        0
                                          RollingUpdateStrategy:  25% max unavailable, 25% max surge
                                          Pod Template:
                                            Labels:  run=ngi
                                            Containers:
                                             ngi:
                                              Image:      nginx:1.13.1    镜像更新了
                                              Port:       <none>
                                              Host Port:  <none>
                                              Limits:
                                                cpu:        200m
                                                memory:     512Mi   资源更新了
                                              Environment:  <none>
                                              Mounts:       <none>
                                            Volumes:        <none>
                                          Conditions:
                                            Type           Status  Reason
                                            ----           ------  ------
                                            Available      True    MinimumReplicasAvailable
                                            Progressing    True    NewReplicaSetAvailable
                                          OldReplicaSets:  <none>
                                          NewReplicaSet:   ngi-74544db97c (2/2 replicas created)    实例数更新了
                                          Events:
                                            Type    Reason             Age                  From                   Message
                                          ...

                                          查看pod

                                            [root@master-01 ~]# kubectl  get rs
                                            NAME             DESIRED   CURRENT   READY   AGE
                                            ngi-6b4b797b76   0         0         0       59m
                                            ngi-74544db97c   2         2         2       10m
                                            [root@master-01 ~]# kubectl  get po
                                            NAME                   READY   STATUS    RESTARTS   AGE
                                            ngi-74544db97c-qz5sn   1/1     Running   0          9m49s
                                            ngi-74544db97c-v9qkz 1/1 Running 0 11m

                                            注意: 在恢复 Deployment 之前您无法回退一个已经暂停的 Deployment。

                                            END

                                            如果您觉得不错,请别忘了转发、分享、点赞让更多的人去学习, 您的举手之劳,就是对小编最好的支持,非常感谢!


                                            文章转载自程序员同行者,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                                            评论