K8s进阶之Deployment的更新&回滚

打印 上一主题 下一主题

主题 1945|帖子 1945|积分 5835

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
更新概述

更新指的是对 Deployment 所管理应用的设置、镜像版本等进行修改并应用到集群中的过程。通过更新 Deployment,你能够实现应用功能的升级、修复毛病、调整资源分配等操作。
更新触发条件


  • 镜像版本变更:当需要更新应用的功能或修复已知题目时,通常会使用新的镜像版本。例如,从 nginx:1.14.2 更新到nginx:1.16.1。
  • 设置参数修改:调整应用的环境变量、资源请求与限制等设置信息。好比,增加容器的内存限制。
  • Pod 模板变更:对 Pod 模板中的标签、注解等元数据进行修改。
Deployment的更新策略

滚动更新(RollingUpdate)

这是 Deployment 的默认更新策略,能够实现零停机更新。它通过逐步替换 Pod 来完成更新,始终保持一定数量的 Pod 在运行,从而确保服务在整个更新过程中都可用。
RollingUpdate工作原理


  • 创建新的 ReplicaSet,使用新的 Pod 模板。
  • 逐步减少旧 ReplicaSet 的 Pod 数量,同时增加新 ReplicaSet 的 Pod 数量。
  • 每个新 Pod 创建后,只有通过康健检查(Readiness Probe)后,才会将旧 Pod 终止。
实现方式

通过界说strategy字段来实现,而strategy字段下有两个核心字段:

  • maxUnavailable:界说在更新过程中,允许不可用的 Pod 的最大数量或百分比。默认值为 25%。
  • maxSurge:界说在更新过程中,允许创建的超过期望副本数的 Pod 的最大数量或百分比。默认值为 25%。
重新创建(Recreate)

这种策略会先删除所有旧的 Pod,然后一次性创建所有新的 Pod。更新期间服务会有短暂不可用,因此适用于开辟环境或可以容忍短暂中断的场景
Deployment之滚动更新(RollingUpdate)实现

这是 Deployment 的默认更新策略,能够实现零停机更新。它通过逐步替换 Pod 来完成更新,始终保持一定数量的 Pod 在运行,从而确保服务在整个更新过程中都可用。
界说一个旧版本应用

起首创建一个Depoyment,界说Pod的镜像为nginx:1.14.1,然后将nginx的镜像版本升级为nginx:1.16.1
  1. ## 定义资源文件
  2. [root@master01 ~/deploy]# cat deploy-nginx.yaml
  3. apiVersion: apps/v1
  4. kind: Deployment
  5. metadata:
  6.   name: deployment-nginx
  7.   namespace: default
  8. spec:
  9.   # 定义更新策略
  10.   strategy:
  11.     # 指定类型为RollingUpdate(滚动更新)
  12.     type: RollingUpdate
  13.     # 当更新策略类型为RollingUpdate时,才会定义该字段,否则会报错
  14.     rollingUpdate:
  15.       # 定义创建的超过期望副本数的 Pod 的最大数量,这里设置为3,表示最大会创建13个Pod数量
  16.       maxSurge: 3
  17.       # 定义允许不可用的 Pod 的最大数量,这里设置为2,表示最大不可用的Pod数量为2
  18.       maxUnavailable: 2
  19.   replicas: 10
  20.   selector:
  21.     matchLabels:
  22.       app: nginx
  23.   template:
  24.     metadata:
  25.       name: pod-nginx
  26.       labels:
  27.         app: nginx
  28.     spec:
  29.       containers:
  30.       - name: container-nginx
  31.         image: nginx:1.14.1
  32.       restartPolicy: Always
  33. # 创建deploy
  34. [root@master01 ~/deploy]# kubectl apply -f deploy-nginx.yaml
  35. deployment.apps/deployment-nginx created
  36. # 查看对应的资源创建情况
  37. [root@master01 ~/deploy]# kubectl get deploy
  38. NAME               READY   UP-TO-DATE   AVAILABLE   AGE
  39. deployment-nginx   10/10   10           10          6s
  40. [root@master01 ~/deploy]# kubectl get rs
  41. NAME                          DESIRED   CURRENT   READY   AGE
  42. deployment-nginx-6d84458cd8   10        10        10      11s
  43. [root@master01 ~/deploy]# kubectl get po | grep deploy
  44. deployment-nginx-6d84458cd8-2km57   1/1     Running            0               18s
  45. deployment-nginx-6d84458cd8-dqtsf   1/1     Running            0               18s
  46. deployment-nginx-6d84458cd8-dtsx7   1/1     Running            0               18s
  47. deployment-nginx-6d84458cd8-fr5zg   1/1     Running            0               18s
  48. deployment-nginx-6d84458cd8-hcxz4   1/1     Running            0               18s
  49. deployment-nginx-6d84458cd8-jm68h   1/1     Running            0               18s
  50. deployment-nginx-6d84458cd8-nt8zw   1/1     Running            0               18s
  51. deployment-nginx-6d84458cd8-pjkmd   1/1     Running            0               18s
  52. deployment-nginx-6d84458cd8-tvxxh   1/1     Running            0               18s
  53. deployment-nginx-6d84458cd8-x7vls   1/1     Running            0               18s
复制代码
更新至新版本应用

触发更新Deployment有两种方式:

  • 通过kubectl set来触发(不推荐)
    语法:
  1. kubectl set image <type-name> <container-name>=<image:tag>
  2. 参数说明:
  3. type-name:指定类型的名称,对应的metadata中的name字段,例如deployment/deploy-nginx
  4. container-name:容器名称,对应的是containers的name字段,例如nginx
  5. image:tag:表示要更新的镜像及版本
复制代码
示例:
  1. kubectl set image deployment/deploy-nginx container-nginx=nginx:1.16.1
复制代码

  • 通过修改资源设置文件来触发(推荐)
我们这里修改其资源设置文件来触发
  1. # 修改配置文件
  2. [root@master01 ~/deploy]# cat deploy-nginx.yaml
  3. apiVersion: apps/v1
  4. kind: Deployment
  5. metadata:
  6.   name: deployment-nginx
  7.   namespace: default
  8. spec:
  9.   # 定义更新策略
  10.   strategy:
  11.     # 指定类型为RollingUpdate(滚动更新)
  12.     type: RollingUpdate
  13.     # 当更新策略类型为RollingUpdate时,才会定义该字段,否则会报错
  14.     rollingUpdate:
  15.       # 定义创建的超过期望副本数的 Pod 的最大数量,这里设置为3,表示最大会创建13个Pod数量
  16.       maxSurge: 3
  17.       # 定义允许不可用的 Pod 的最大数量,这里设置为2,表示最大不可用的Pod数量为2
  18.       maxUnavailable: 2
  19.   replicas: 10
  20.   selector:
  21.     matchLabels:
  22.       app: nginx
  23.   template:
  24.     metadata:
  25.       name: pod-nginx
  26.       labels:
  27.         app: nginx
  28.     spec:
  29.       containers:
  30.       - name: container-nginx
  31.         # 更新镜像版本为1.16.1
  32.         image: nginx:1.16.1
  33.       restartPolicy: Always
  34. # 重新应用它
  35. [root@master01 ~/deploy]# kubectl apply -f deploy-nginx.yaml
  36. deployment.apps/deployment-nginx configured
复制代码
查看一下Pod及ReplicaSet的变化

查看Pod的变化
  1. # 第一次查看Pod,发现一共有13个Pod。
  2. # 其中超出预期值为3个,我们定义的副本数量为10,maxSurge的值为3
  3. # 其中可用的Pod数量为8个(也就是不可用的Pod数量为2个,对应的maxUnavailable设置)
  4. # 通过AGE字段发现,旧版本的Pod依旧存在
  5. [root@master01 ~/deploy]# kubectl get po | grep deploy
  6. NAME                               READY   STATUS             RESTARTS           AGE
  7. deployment-nginx-6d84458cd8-2km57   1/1     Running             0                17m
  8. deployment-nginx-6d84458cd8-dqtsf   1/1     Running             0                17m
  9. deployment-nginx-6d84458cd8-fr5zg   1/1     Running             0                17m
  10. deployment-nginx-6d84458cd8-hcxz4   1/1     Running             0                17m
  11. deployment-nginx-6d84458cd8-jm68h   1/1     Running             0                17m
  12. deployment-nginx-6d84458cd8-pjkmd   1/1     Running             0                17m
  13. deployment-nginx-6d84458cd8-tvxxh   1/1     Running             0                17m
  14. deployment-nginx-6d84458cd8-x7vls   1/1     Running             0                17m
  15. deployment-nginx-d8898b99d-5pxt8    0/1     ContainerCreating   0                7s
  16. deployment-nginx-d8898b99d-7z4pf    0/1     ContainerCreating   0                7s
  17. deployment-nginx-d8898b99d-gttz8    0/1     ContainerCreating   0                7s
  18. deployment-nginx-d8898b99d-j55fp    0/1     ContainerCreating   0                7s
  19. deployment-nginx-d8898b99d-jfpdt    0/1     ContainerCreating   0                7s
  20. # 最终查看Pod,发现Pod的最终数量为10,且全部更新成功(通过AGE字段查看)
  21. [root@master01 ~/deploy]# kubectl get po | grep deploy
  22. NAME                               READY   STATUS             RESTARTS          AGE
  23. deployment-nginx-d8898b99d-2szcx   1/1     Running            0                 18s
  24. deployment-nginx-d8898b99d-5pxt8   1/1     Running            0                 37s
  25. deployment-nginx-d8898b99d-7k44g   1/1     Running            0                 17s
  26. deployment-nginx-d8898b99d-7z4pf   1/1     Running            0                 37s
  27. deployment-nginx-d8898b99d-gttz8   1/1     Running            0                 37s
  28. deployment-nginx-d8898b99d-j55fp   1/1     Running            0                 37s
  29. deployment-nginx-d8898b99d-jfpdt   1/1     Running            0                 37s
  30. deployment-nginx-d8898b99d-kdf7x   1/1     Running            0                 16s
  31. deployment-nginx-d8898b99d-lvpsw   1/1     Running            0                 19s
  32. deployment-nginx-d8898b99d-zfxkf   1/1     Running            0                 15s
复制代码
查看ReplicaSet的变化:
  1. # 发现有两个rs资源,其中deployment-nginx-6d84458cd8是旧版本的rs,它的副本数量为0
  2. # deployment-nginx-d8898b99d是新版本的rs,它的副本数量为10,就这可以验证deploy滚动更新是基于rs来实现的
  3. [root@master01 ~/deploy]# kubectl get rs
  4. NAME                          DESIRED   CURRENT   READY   AGE
  5. deployment-nginx-6d84458cd8   0         0         0       25m
  6. deployment-nginx-d8898b99d    10        10        10      8m46s
复制代码
Deployment之重新创建(Recreate)实现

这种策略会先删除所有旧的 Pod,然后一次性创建所有新的 Pod。更新期间服务会有短暂不可用,因此适用于开辟环境或可以容忍短暂中断的场景
界说一个旧版本应用

起首创建一个Depoyment,界说Pod的镜像为tomcat:8.0,然后将tomcat的镜像版本升级为tomcat:9.0
  1. ## 定义资源文件
  2. [root@master01 ~/deploy]# cat deploy-tomcat.yaml
  3. apiVersion: apps/v1
  4. kind: Deployment
  5. metadata:
  6.   name: deployment-tomcat
  7.   namespace: default
  8. spec:
  9.   # 定义更新策略
  10.   strategy:
  11.     # 指定类型为Recreate(重新创建)
  12.     type: Recreate
  13.   replicas: 10
  14.   selector:
  15.     matchLabels:
  16.       app: tomcat
  17.   template:
  18.     metadata:
  19.       name: pod-tomcat
  20.       labels:
  21.         app: tomcat
  22.     spec:
  23.       containers:
  24.       - name: container-tomcat
  25.         image: tomcat:8.0
  26.       restartPolicy: Always
  27. # 应用它:
  28. [root@master01 ~/deploy]# kubectl apply -f deploy-tomcat.yaml
  29. deployment.apps/deployment-tomcat created
复制代码
查看pod
  1. [root@master01 ~/deploy]# kubectl get po
  2. NAME                                 READY   STATUS    RESTARTS   AGE
  3. deployment-tomcat-85c65466c5-7vsms   1/1     Running   0          84s
  4. deployment-tomcat-85c65466c5-bh9v9   1/1     Running   0          84s
  5. deployment-tomcat-85c65466c5-bvhs9   1/1     Running   0          84s
  6. deployment-tomcat-85c65466c5-czdsb   1/1     Running   0          84s
  7. deployment-tomcat-85c65466c5-glq5m   1/1     Running   0          84s
  8. deployment-tomcat-85c65466c5-k6xk7   1/1     Running   0          84s
  9. deployment-tomcat-85c65466c5-mw8wz   1/1     Running   0          84s
  10. deployment-tomcat-85c65466c5-tqtzb   1/1     Running   0          84s
  11. deployment-tomcat-85c65466c5-wftgj   1/1     Running   0          84s
  12. deployment-tomcat-85c65466c5-xxv2p   1/1     Running   0          84s
复制代码
更新至新版本应用

修改资源设置文件
  1. [root@master01 ~/deploy]# cat deploy-tomcat.yaml
  2. apiVersion: apps/v1
  3. kind: Deployment
  4. metadata:
  5.   name: deployment-tomcat
  6.   namespace: default
  7. spec:
  8.   # 定义更新策略
  9.   strategy:
  10.     # 指定类型为Recreate(重新创建)
  11.     type: Recreate
  12.   replicas: 10
  13.   selector:
  14.     matchLabels:
  15.       app: tomcat
  16.   template:
  17.     metadata:
  18.       name: pod-tomcat
  19.       labels:
  20.         app: tomcat
  21.     spec:
  22.       containers:
  23.       - name: container-tomcat
  24.         # 镜像版本更新至9.0
  25.         image: tomcat:9.0
  26.       restartPolicy: Always
  27. # 重新应用资源文件
  28. [root@master01 ~/deploy]# kubectl apply -f deploy-tomcat.yaml
  29. deployment.apps/deployment-tomcat configured
复制代码
查看ReplicaSet及Pod的变化

查看Pod
  1. # 发现Pod全部处于ContainerCreating的状态,且没有一个处于Ready,验证了Recreate是将Pod全部删除然后重新创建
  2. [root@master01 ~/deploy]# kubectl get po
  3. NAME                                 READY   STATUS              RESTARTS   AGE
  4. deployment-tomcat-7ddf96c4d8-4dcmh   0/1     ContainerCreating   0          6s
  5. deployment-tomcat-7ddf96c4d8-4w8dd   0/1     ContainerCreating   0          6s
  6. deployment-tomcat-7ddf96c4d8-8z95r   0/1     ContainerCreating   0          6s
  7. deployment-tomcat-7ddf96c4d8-9dgph   0/1     ContainerCreating   0          6s
  8. deployment-tomcat-7ddf96c4d8-9wgr4   0/1     ContainerCreating   0          6s
  9. deployment-tomcat-7ddf96c4d8-kt7nw   0/1     ContainerCreating   0          6s
  10. deployment-tomcat-7ddf96c4d8-lrgfm   0/1     ContainerCreating   0          6s
  11. deployment-tomcat-7ddf96c4d8-mpmb9   0/1     ContainerCreating   0          6s
  12. deployment-tomcat-7ddf96c4d8-vvbtb   0/1     ContainerCreating   0          6s
  13. deployment-tomcat-7ddf96c4d8-w8knq   0/1     ContainerCreating   0          6s
复制代码
查看ReplicaSet
  1. [root@master01 ~/deploy]# kubectl get rs
  2. NAME                           DESIRED   CURRENT   READY   AGE
  3. deployment-tomcat-7ddf96c4d8   10        10        10      27s
  4. deployment-tomcat-85c65466c5   0         0         0       4m
复制代码
回滚概述

回滚是指在更新过程中出现题目(如应用崩溃、功能非常等)时,将 Deployment 规复到之前某个稳定版本的操作。Kubernetes 会记录 Deployment 的每次更新历史,方便你随时回滚到指定版本。
回滚也可以理解成Deployment的更新,回滚也会按照我们资源设置文件中相关的设置来进行更新Pod。
回滚操作


  • 查看更新历史:使用 kubectl rollout history deployment  命令查看 Deployment 的更新历史,每个更新都会有一个对应的版本号(Revision)。
  • 回滚到上一个版本:使用 kubectl rollout undo deployment  命令将 Deployment 回滚到上一个稳定版本。
  • 回滚到指定版本:使用 kubectl rollout undo deployment  --to-revision= 命令将 Deployment 回滚到指定的版本号。
  • 验证回滚结果:使用 kubectl rollout status  命令查看回滚后的状态,确保回滚操作成功。
回滚示例

以上面Tomcat的为例,将版本回滚至8.0
查看要回滚的Deployment
  1. [root@master01 ~/deploy]# kubectl get deploy
  2. NAME                READY   UP-TO-DATE   AVAILABLE   AGE
  3. deployment-tomcat   10/10   10           10          9m46s
复制代码
查看历史版本

在 kubectl rollout history 命令的输出里,版本号越大就代表是越新的版本
  1. [root@master01 ~/deploy]# kubectl rollout history deploy/deployment-tomcat
  2. deployment.apps/deployment-tomcat
  3. #版本      #变更的原因
  4. REVISION  CHANGE-CAUSE
  5. 1         <none>  #旧版本
  6. 2         <none>  #新版本
复制代码
回滚到指定的版本
  1. [root@master01 ~/deploy]# kubectl rollout undo deployment deployment-tomcat --to-revision=1
  2. deployment.apps/deployment-tomcat rolled back
复制代码
查看回滚的结果
  1. [root@master01 ~/deploy]# kubectl rollout status deploy deployment-tomcat
  2. deployment "deployment-tomcat" successfully rolled out
复制代码
查看Pod
  1. [root@master01 ~/deploy]# kubectl get po
  2. NAME                                 READY   STATUS    RESTARTS   AGE
  3. deployment-tomcat-85c65466c5-5xbcn   1/1     Running   0          42s
  4. deployment-tomcat-85c65466c5-7tb56   1/1     Running   0          42s
  5. deployment-tomcat-85c65466c5-dpklc   1/1     Running   0          42s
  6. deployment-tomcat-85c65466c5-k8sd6   1/1     Running   0          42s
  7. deployment-tomcat-85c65466c5-m5kqt   1/1     Running   0          42s
  8. deployment-tomcat-85c65466c5-rlvrz   1/1     Running   0          42s
  9. deployment-tomcat-85c65466c5-szczs   1/1     Running   0          42s
  10. deployment-tomcat-85c65466c5-vt89t   1/1     Running   0          42s
  11. deployment-tomcat-85c65466c5-xrct9   1/1     Running   0          42s
  12. deployment-tomcat-85c65466c5-xtpt6   1/1     Running   0          42s
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
继续阅读请点击广告
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

老婆出轨

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表