ToB企服应用市场:ToB评测及商务社交产业平台

标题: Kubernetes(K8S) Deployment 升级和回滚 [打印本页]

作者: 一给    时间: 2022-10-19 22:36
标题: Kubernetes(K8S) Deployment 升级和回滚
创建部署详见 Kubernetes(K8S) Deployment 部署 Pod
传统应用升级,一般是V1.0的jar包,有一个应对 1.0 的 shell 启动脚本。升级时,传 2.0 的 jar包,配置 2.0 的 shell 脚本。
执行顺序为,停1.0的服务,启2.0的服务,有问题时,把2.0停掉再执行 1.0的shell脚本,手动恢复到1.0 版本,服务多的情况下,就很崩溃,而且服务会中断不可用。
高并发、高可用系统普及的今天,服务的升级更新至少要做到“业务不中断”。而滚动更新(Rolling-update)恰是满足这一需求的一种系统更新升级方案。对于Kubernetes集群部署的Service来说,Rolling update就是指一次仅更新一个Pod,然后逐个进行更新,而不是在同一时刻将该Service下面的所有Pod shutdown,然后去更新,逐个更新可以避免将业务中断;
RollingUpdate命令:通过自动扩缩容实现自动滚动升级
指令格式:kubectl rolling-update 旧控制器 新控制器 --image=新镜像
1. 发布新版到阿里云镜像仓库
  1. Last login: Tue Oct 18 16:39:53 2022 from 172.16.0.66
  2. [root@localhost ~]# cd /opt/demo/
  3. [root@localhost demo]# ll
  4. 总用量 17160
  5. -rw-r--r--. 1 root root 17566582 10月 19 11:50 demojenkins.jar
  6. -rw-r--r--. 1 root root      126 10月 18 17:56 Dockerfile
  7. [root@localhost demo]# docker login --username=hiXXXXXX@aliyun.com registry.cn-shanghai.aliyuncs.com
  8. Password:
  9. WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
  10. Configure a credential helper to remove this warning. See
  11. https://docs.docker.com/engine/reference/commandline/login/#credentials-store
  12. Login Succeeded
  13. [root@localhost demo]# docker build -t demo:2.0 .
  14. Sending build context to Docker daemon  17.57MB
  15. Step 1/4 : FROM openjdk:8-jdk-alpine
  16. ---> a3562aa0b991
  17. Step 2/4 : VOLUME /tmp
  18. ---> Using cache
  19. ---> a98cf1fbeb9d
  20. Step 3/4 : ADD ./demojenkins.jar demojenkins.jar
  21. ---> 12bfc15e5295
  22. Step 4/4 : ENTRYPOINT ["java","-jar","/demojenkins.jar", "&"]
  23. ---> Running in 2908dd94dfa7
  24. Removing intermediate container 2908dd94dfa7
  25. ---> 3041db93b6df
  26. Successfully built 3041db93b6df
  27. Successfully tagged demo:2.0
  28. [root@localhost demo]# docker images
  29. REPOSITORY                                          TAG            IMAGE ID       CREATED              SIZE
  30. demo                                                2.0            3041db93b6df   About a minute ago   122MB
  31. demo                                                1.0            1952e02daef9   19 hours ago         122MB
  32. openjdk                                             8-jdk-alpine   a3562aa0b991   3 years ago          105MB
  33. java                                                8              d23bdf5b1b1b   5 years ago          643MB
  34. [root@localhost demo]# docker tag 3041db93b6df registry.cn-shanghai.aliyuncs.com/vipsoft/vipsoft:2.0
  35. [root@localhost demo]# docker push registry.cn-shanghai.aliyuncs.com/vipsoft/vipsoft:2.0
  36. The push refers to repository [registry.cn-shanghai.aliyuncs.com/vipsoft/vipsoft]
  37. c38fa2e9a247: Pushed
  38. ceaf9e1ebef5: Layer already exists
  39. 9b9b7f3d56a0: Layer already exists
  40. f1b5933fe4b5: Layer already exists
  41. 2.0: digest: sha256:785c4707e7e629d22b5609310d8f945c107b277b94925cc0dbebdb3621b size: 1159
  42. [root@localhost demo]#
复制代码

2. 查看现有Pod信息(升级后对比用)
  1. # 查看创建的 Deployment 对象
  2. [root@k8smaster ~]# kubectl get deployments
  3. NAME        READY   UP-TO-DATE   AVAILABLE   AGE
  4. javademo1   3/3     3            3           19h
  5. nginx       1/1     1            1           5d21h
  6. # 查看 Deployment 上线状态
  7. [root@k8smaster ~]# kubectl rollout status deployment/javademo1
  8. deployment "javademo1" successfully rolled out
  9. # 查看 Deployment 对象创建的 ReplicaSet:
  10. [root@k8smaster ~]# kubectl get rs
  11. NAME                   DESIRED   CURRENT   READY   AGE
  12. javademo1-84dd5c9485   3         3         3       4h25m
  13. nginx-f89759699        1         1         1       5d21h
  14. # 查看 Deployment 对象操作 ReplicaSet 创建的 Pod,并显示生成的标签:
  15. [root@k8smaster ~]# kubectl get pods --show-labels
  16. NAME                         READY   STATUS    RESTARTS   AGE     LABELS
  17. javademo1-84dd5c9485-7vgkr   1/1     Running   0          4h20m   app=javademo1,pod-template-hash=84dd5c9485
  18. javademo1-84dd5c9485-8ckk6   1/1     Running   0          4h26m   app=javademo1,pod-template-hash=84dd5c9485
  19. javademo1-84dd5c9485-8hfmd   1/1     Running   0          4h20m   app=javademo1,pod-template-hash=84dd5c9485
  20. nginx-f89759699-5hkdw        1/1     Running   0          5d21h   app=nginx,pod-template-hash=f89759699
  21. #查看当前运行的 Pod
  22. [root@k8smaster ~]# kubectl get pods
  23. NAME                         READY   STATUS    RESTARTS   AGE
  24. javademo1-84dd5c9485-7vgkr   1/1     Running   0          4h31m
  25. javademo1-84dd5c9485-8ckk6   1/1     Running   0          4h37m
  26. javademo1-84dd5c9485-8hfmd   1/1     Running   0          4h31m
  27. nginx-f89759699-5hkdw        1/1     Running   0          5d21h
  28. # 查看 Deployeement 详情
  29. [root@k8smaster ~]# kubectl describe deployment/javademo1
  30. Name:                   javademo1
  31. Namespace:              default
  32. CreationTimestamp:      Tue, 18 Oct 2022 18:51:25 +0800
  33. Labels:                 app=javademo1
  34. Annotations:            deployment.kubernetes.io/revision: 2
  35. Selector:               app=javademo1
  36. Replicas:               3 desired | 3 updated | 3 total | 3 available | 0 unavailable
  37. StrategyType:           RollingUpdate
  38. MinReadySeconds:        0
  39. RollingUpdateStrategy:  25% max unavailable, 25% max surge
  40. Pod Template:
  41.   Labels:  app=javademo1
  42.   Containers:
  43.    vipsoft:
  44.     Image:        registry.cn-shanghai.aliyuncs.com/vipsoft/vipsoft:1.0
  45.     Port:         <none>
  46.     Host Port:    <none>
  47.     Environment:  <none>
  48.     Mounts:       <none>
  49.   Volumes:        <none>
  50. Conditions:
  51.   Type           Status  Reason
  52.   ----           ------  ------
  53.   Progressing    True    NewReplicaSetAvailable
  54.   Available      True    MinimumReplicasAvailable
  55. OldReplicaSets:  <none>
  56. NewReplicaSet:   javademo1-84dd5c9485 (3/3 replicas created)
  57. Events:          <none>
复制代码
Deployment, kubectl get deployments 所显示的字段有:
ReplicaSet, kubectl get rs 输出中包含以下字段:
3. Deployment 升级

方法1
  1. # 查看 Deployeement 详情 里可以看到 Containers 内容
  2. [root@k8smaster ~]# kubectl set image deployment/javademo1 vipsoft=registry.cn-shanghai.aliyuncs.com/vipsoft/vipsoft:2.0
  3. deployment.apps/javademo1 image updated
  4. [root@k8smaster ~]# kubectl rollout status deployment/javademo1
  5. deployment "javademo1" successfully rolled out
  6. [root@k8smaster ~]#
复制代码
方法2
  1. # Containers:
  2. #   vipsoft:
  3. #    Image:        registry.cn-shanghai.aliyuncs.com/vipsoft/vipsoft:1.0  #将 :1.0 改成 2.0
  4. # 一旦镜像名(或 Pod 定义)发生了修改,则触发 k8s 系统完成 Deployment 所有运行 Pod 的滚动升级操作
  5. [root@k8smaster ~]# kubectl edit deployment/javademo1
  6. deployment "javademo1" edited
复制代码
查看已更新的 Deployment 的信息
  1. [root@k8smaster ~]# kubectl get deployments
  2. NAME        READY   UP-TO-DATE   AVAILABLE   AGE
  3. javademo1   3/3     3            3           20h
  4. nginx       1/1     1            1           5d22h
  5. # 扩容了3个副本,将旧的 ReplicaSet 缩容到了 0 个副本,完成了Pod的升级
  6. [root@k8smaster ~]# kubectl get rs
  7. NAME                   DESIRED   CURRENT   READY   AGE
  8. javademo1-5476dc8d7d   3         3         3       11m
  9. javademo1-84dd5c9485   0         0         0       5h17m
  10. nginx-f89759699        1         1         1       5d22h
  11. #只有最新的  5476dc8d7d 信息
  12. [root@k8smaster ~]# kubectl get pods
  13. NAME                         READY   STATUS    RESTARTS   AGE
  14. javademo1-5476dc8d7d-bf6m5   1/1     Running   0          11m
  15. javademo1-5476dc8d7d-ttt5b   1/1     Running   0          11m
  16. javademo1-5476dc8d7d-zd4c7   1/1     Running   0          11m
  17. nginx-f89759699-5hkdw        1/1     Running   0          5d22h
  18. [root@k8smaster ~]# kubectl describe deployment/javademo1
  19. Name:                   javademo1
  20. Namespace:              default
  21. CreationTimestamp:      Tue, 18 Oct 2022 18:51:25 +0800
  22. Labels:                 app=javademo1
  23. Annotations:            deployment.kubernetes.io/revision: 3
  24. Selector:               app=javademo1
  25. Replicas:               3 desired | 3 updated | 3 total | 3 available | 0 unavailable
  26. StrategyType:           RollingUpdate
  27. MinReadySeconds:        0
  28. RollingUpdateStrategy:  25% max unavailable, 25% max surge
  29. Pod Template:
  30.   Labels:  app=javademo1
  31.   Containers:
  32.    vipsoft:
  33.     Image:        registry.cn-shanghai.aliyuncs.com/vipsoft/vipsoft:2.0
  34.     Port:         <none>
  35.     Host Port:    <none>
  36.     Environment:  <none>
  37.     Mounts:       <none>
  38.   Volumes:        <none>
  39. Conditions:
  40.   Type           Status  Reason
  41.   ----           ------  ------
  42.   Available      True    MinimumReplicasAvailable
  43.   Progressing    True    NewReplicaSetAvailable
  44. OldReplicaSets:  <none>
  45. NewReplicaSet:   javademo1-5476dc8d7d (3/3 replicas created)
  46. Events:
  47.   Type    Reason             Age   From                   Message
  48.   ----    ------             ----  ----                   -------
  49.   Normal  ScalingReplicaSet  12m   deployment-controller  Scaled up replica set javademo1-5476dc8d7d to 1
  50.   Normal  ScalingReplicaSet  11m   deployment-controller  Scaled down replica set javademo1-84dd5c9485 to 2
  51.   Normal  ScalingReplicaSet  11m   deployment-controller  Scaled up replica set javademo1-5476dc8d7d to 2
  52.   Normal  ScalingReplicaSet  11m   deployment-controller  Scaled down replica set javademo1-84dd5c9485 to 1
  53.   Normal  ScalingReplicaSet  11m   deployment-controller  Scaled up replica set javademo1-5476dc8d7d to 3
  54.   Normal  ScalingReplicaSet  11m   deployment-controller  Scaled down replica set javademo1-84dd5c9485 to 0
  55. [root@k8smaster ~]#
复制代码

上面 Events: 可以看出,先 up javademo1-5476dc8d7d to 1,再停 javademo1-84dd5c9485 to 2,Pod 逐个 滚动式更新,如下图:

Deployment 更新策略
在 Deployment 的定义中,可以通过 spec.strategy 指定 Pod 的更新策略,目前支持两种更新策略:
Recreate(重建):设置 spec.strategy.type=Recreate,表示 Deployment 在更新 Pod 时,会先杀掉所有正在运行的 Pod,然后创建新的 Pod。
RollingUpdate(滚动更新):设置 spec.strategy.type=RollingUpdate,表示 Deployment 会以滚动更新的方式来逐个更新 Pod。同时,可以通过设置 spec.strategy.rollingUpdate 下的两个参数(maxUnavailable 和 maxSurge)来控制滚动更新的过程。
4. Deployment 回滚
  1. # 查看 Deployment 部署历史, CHANGE-CAUSE 里没有值,需要在创建 Deployment 时,使用 --record 参数,就可以在 CHANGE-CAUSE 列看到每个版本使用的命令了
  2. [root@k8smaster ~]# kubectl rollout history deployment/javademo1
  3. deployment.apps/javademo1
  4. REVISION  CHANGE-CAUSE
  5. 1         <none>
  6. 2         <none>
  7. # 查看版本 2 的信息:
  8. [root@k8smaster ~]# kubectl rollout history deployment/javademo1 --revision=2
  9. deployment.apps/javademo1 with revision #2
  10. Pod Template:
  11.   Labels:       app=javademo1
  12.         pod-template-hash=84dd5c9485
  13.   Containers:
  14.    vipsoft:
  15.     Image:      registry.cn-shanghai.aliyuncs.com/vipsoft/vipsoft:1.0
  16.     Port:       <none>
  17.     Host Port:  <none>
  18.     Environment:        <none>
  19.     Mounts:     <none>
  20.   Volumes:      <none>
  21. # kubeetl rollout undo deployment/javademo1 --to-revision=2  加上参数,回滚到指定版本
  22. # 这边没加参加,回滚到上一个版本
  23. [root@k8smaster ~]# kubectl rollout undo deployment/javademo1
  24. deployment.apps/javademo1 rolled back
  25. [root@k8smaster ~]# kubectl describe deployment/javademo1
  26. Name:                   javademo1
  27. Namespace:              default
  28. CreationTimestamp:      Tue, 18 Oct 2022 18:51:25 +0800
  29. Labels:                 app=javademo1
  30. Annotations:            deployment.kubernetes.io/revision: 4
  31. Selector:               app=javademo1
  32. Replicas:               3 desired | 3 updated | 3 total | 3 available | 0 unavailable
  33. StrategyType:           RollingUpdate
  34. MinReadySeconds:        0
  35. RollingUpdateStrategy:  25% max unavailable, 25% max surge
  36. Pod Template:
  37.   Labels:  app=javademo1
  38.   Containers:
  39.    vipsoft:
  40.     Image:        registry.cn-shanghai.aliyuncs.com/vipsoft/vipsoft:1.0
  41.     Port:         <none>
  42.     Host Port:    <none>
  43.     Environment:  <none>
  44.     Mounts:       <none>
  45.   Volumes:        <none>
  46. Conditions:
  47.   Type           Status  Reason
  48.   ----           ------  ------
  49.   Available      True    MinimumReplicasAvailable
  50.   Progressing    True    NewReplicaSetAvailable
  51. OldReplicaSets:  <none>
  52. NewReplicaSet:   javademo1-84dd5c9485 (3/3 replicas created)
  53. Events:
  54.   Type    Reason             Age                  From                   Message
  55.   ----    ------             ----                 ----                   -------
  56.   Normal  ScalingReplicaSet  51m                  deployment-controller  Scaled up replica set javademo1-5476dc8d7d to 1
  57.   Normal  ScalingReplicaSet  50m                  deployment-controller  Scaled down replica set javademo1-84dd5c9485 to 2
  58.   Normal  ScalingReplicaSet  50m                  deployment-controller  Scaled up replica set javademo1-5476dc8d7d to 2
  59.   Normal  ScalingReplicaSet  50m                  deployment-controller  Scaled up replica set javademo1-5476dc8d7d to 3
  60.   Normal  ScalingReplicaSet  50m                  deployment-controller  Scaled down replica set javademo1-84dd5c9485 to 1
  61.   Normal  ScalingReplicaSet  50m                  deployment-controller  Scaled down replica set javademo1-84dd5c9485 to 0
  62.   Normal  ScalingReplicaSet  20s (x2 over 5h57m)  deployment-controller  Scaled up replica set javademo1-84dd5c9485 to 1
  63.   Normal  ScalingReplicaSet  17s                  deployment-controller  Scaled down replica set javademo1-5476dc8d7d to 2
  64.   Normal  ScalingReplicaSet  17s                  deployment-controller  Scaled up replica set javademo1-84dd5c9485 to 2
  65.   Normal  ScalingReplicaSet  15s                  deployment-controller  Scaled down replica set javademo1-5476dc8d7d to 1
  66.   Normal  ScalingReplicaSet  14s (x2 over 5h51m)  deployment-controller  Scaled up replica set javademo1-84dd5c9485 to 3
  67.   Normal  ScalingReplicaSet  9s                   deployment-controller  Scaled down replica set javademo1-5476dc8d7d to 0
  68. [root@k8smaster ~]#
复制代码
history 中 CHANGE-CAUSE 里没有值,需要在创建 Deployment 时,使用 --record 参数,就可以在 CHANGE-CAUSE 列看到每个版本使用的命令了


看了很多贴子,这篇不错:Pod 的升级和回滚

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4