当前位置:   article > 正文

k8s 版本发布与回滚

k8s 版本发布与回滚

一、实验环境准备:

  1. kubectl get pods -o wide
  2. kubectl get nodes -o wide
  3. kubectl get svc

准备两个nginx镜像,版本号一个是V3,一个是V4

二、准备一个nginx.yaml文件

  1. apiVersion: apps/v1
  2. kind: Deployment
  3. metadata:
  4. name: nginx-deploy
  5. labels:
  6. release: v1
  7. spec:
  8. replicas: 1
  9. strategy:
  10. type: RollingUpdate
  11. rollingUpdate:
  12. maxUnavailable: 25%
  13. maxSurge: 25%
  14. selector:
  15. matchLabels:
  16. app: nginx
  17. template:
  18. metadata:
  19. labels:
  20. app: nginx
  21. spec:
  22. containers:
  23. - name: mynginx
  24. image: 192.168.206.137/library/nginx:v3
  25. ports:
  26. - containerPort: 80
  27. ---
  28. apiVersion: v1
  29. kind: Service
  30. metadata:
  31. name: nginxservice
  32. spec:
  33. type: NodePort
  34. ports:
  35. - port: 80
  36. targetPort: 80
  37. nodePort: 30080
  38. selector:
  39. app: nginx1

在这个文件中,定义了:

元数据的名称为:nginx-deploy

副本数量为:1

滚动升级的策略为:RollingUpdate

滚动升级最低保留的副本数量为:25%

镜像为:192.168.206.137/library/nginx:v3

集群内部访问端口为:80

外部访问端口为:30080

三、部署这个yaml,并查看部署状态

kubectl apply -f nginx.yaml

部署状态:

kubectl rollout status deploy nginx-deploy

查看历史升级状态:

kubectl rollout history deploy nginx-deploy

查看历史升级状态为1的详细信息:

kubectl rollout history deploy nginx-deploy  --revision=1

查看发布完成后的svc和pod状态:

kubectl get svc,pods -o wide

此时可以看到,nginx.yaml已经部署完成。

四、更新nginx版本,重新发布

  1. apiVersion: apps/v1
  2. kind: Deployment
  3. metadata:
  4. name: nginx-deploy
  5. labels:
  6. release: v2
  7. spec:
  8. replicas: 2
  9. strategy:
  10. type: RollingUpdate
  11. rollingUpdate:
  12. maxUnavailable: 25%
  13. maxSurge: 25%
  14. selector:
  15. matchLabels:
  16. app: nginx
  17. template:
  18. metadata:
  19. labels:
  20. app: nginx
  21. spec:
  22. containers:
  23. - name: mynginx
  24. image: 192.168.206.137/library/nginx:v4
  25. ports:
  26. - containerPort: 80
  27. ---
  28. apiVersion: v1
  29. kind: Service
  30. metadata:
  31. name: nginxservice
  32. spec:
  33. type: NodePort
  34. ports:
  35. - port: 80
  36. targetPort: 80
  37. nodePort: 30080
  38. selector:
  39. app: nginx2

比较上面的V1版本,V2更新了几点:

副本数量增加为:2

镜像使用:v4

更新发布这个新的版本:

  1. kubectl apply -f nginx.yaml
  2. kubectl rollout status deploy nginx-deploy

跟新后的SVC和POD状态:

可以看到POD增加到了2个

再次查看历史更新记录:

kubectl rollout history deploy nginx-deploy

指定查看V2的详细信息:

kubectl rollout history deploy nginx-deploy  --revision=2

这里可以看到,两次的版本更新操作,这里都有详细记录。但是这里最多只能记录2个。

五、回滚版本到V1:

v1只有一个pod并且镜像使用的是nginx:v3

撤销上一次升级,并查看升级状态:

  1. kubectl rollout undo deploy nginx-deploy
  2. kubectl rollout status deploy nginx-deploy
  3. kubectl get svc,pods -o wide

这里会发现,原本1个的POD,回滚后变成了2个。其实这里是k8s滚动升级的机制导致的。前面设置了最低保留25%的可用性,那么至少也有1个POD。所以K8s首先新增了一个POD,然后再升级版本,最后保持两个POD一致。 

再次查看升级历史信息:

kubectl rollout history deploy nginx-deploy

查看3的详细信息:

kubectl rollout history deploy nginx-deploy  --revision=3

对比2:

kubectl rollout history deploy nginx-deploy  --revision=2

查看当前POD的详细信息:

kubectl describe pods nginx-deploy-6b6f9ff985-xpz94
  1. Name: nginx-deploy-6b6f9ff985-xpz94
  2. Namespace: default
  3. Priority: 0
  4. Node: master/192.168.206.138
  5. Start Time: Sat, 27 Jan 2024 12:56:23 +0800
  6. Labels: app=nginx
  7. pod-template-hash=6b6f9ff985
  8. Annotations: cni.projectcalico.org/containerID: 1b2e98f76f8f8e7da439c4a767ec4b297035ca582bcdd445e816e1c13c3d891a
  9. cni.projectcalico.org/podIP: 10.224.219.80/32
  10. cni.projectcalico.org/podIPs: 10.224.219.80/32
  11. Status: Running
  12. IP: 10.224.219.80
  13. IPs:
  14. IP: 10.224.219.80
  15. Controlled By: ReplicaSet/nginx-deploy-6b6f9ff985
  16. Containers:
  17. mynginx:
  18. Container ID: docker://2e6181cee6a4886c0892af0b92b0f31bde4d3513b0d34a654a9a0e0438274c73
  19. Image: 192.168.206.137/library/nginx:v3
  20. Image ID: docker-pullable://192.168.206.137/library/nginx@sha256:37bb5a5a2078bd67b1be281165e9f82f6f267d6404e0ae11b3a524b8fff8354e
  21. Port: 80/TCP
  22. Host Port: 0/TCP
  23. State: Running
  24. Started: Sat, 27 Jan 2024 12:56:24 +0800
  25. Ready: True
  26. Restart Count: 0
  27. Environment: <none>
  28. Mounts:
  29. /var/run/secrets/kubernetes.io/serviceaccount from default-token-gd949 (ro)
  30. Conditions:
  31. Type Status
  32. Initialized True
  33. Ready True
  34. ContainersReady True
  35. PodScheduled True
  36. Volumes:
  37. default-token-gd949:
  38. Type: Secret (a volume populated by a Secret)
  39. SecretName: default-token-gd949
  40. Optional: false
  41. QoS Class: BestEffort
  42. Node-Selectors: <none>
  43. Tolerations: node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
  44. node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
  45. Events:
  46. Type Reason Age From Message
  47. ---- ------ ---- ---- -------
  48. Normal Scheduled 5m17s Successfully assigned default/nginx-deploy-6b6f9ff985-xpz94 to master
  49. Normal Pulled 5m17s kubelet, master Container image "192.168.206.137/library/nginx:v3" already present on machine
  50. Normal Created 5m17s kubelet, master Created container mynginx
  51. Normal Started 5m17s kubelet, master Started container mynginx

Image这个地方,可以看到当前POD使用的版本号为V3,可以说明撤销成功,已经回退都发布之前的版本。

六、回滚到指定版本:

kubectl rollout history deploy nginx-deplo

目前有两个版本,在使用的是3,可以回滚到指定版本2,镜像回滚到nginx:v4状态,副本数量为2个

  1. kubectl rollout undo deploy nginx-deploy --to-revision=2
  2. kubectl rollout status deploy nginx-deploy
  3. kubectl get svc,pods -o wide
  4. kubectl describe pods nginx-deploy-76d4c4c684-kvtx8

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/article/detail/42411
推荐阅读
相关标签
  

闽ICP备14008679号