一、实验环境准备:
kubectl get pods -o wide
kubectl get nodes -o wide
kubectl get svc
准备两个nginx镜像,版本号一个是V3,一个是V4

二、准备一个nginx.yaml文件
apiVersion: apps/v1
kind: Deployment
metadata:name: nginx-deploylabels:release: v1
spec:replicas: 1strategy:type: RollingUpdaterollingUpdate:maxUnavailable: 25%maxSurge: 25%selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- name: mynginximage: 192.168.206.137/library/nginx:v3ports:- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:name: nginxservice
spec:type: NodePortports:- port: 80targetPort: 80nodePort: 30080selector: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版本,重新发布
apiVersion: apps/v1
kind: Deployment
metadata:name: nginx-deploylabels:release: v2
spec:replicas: 2strategy:type: RollingUpdaterollingUpdate:maxUnavailable: 25%maxSurge: 25%selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- name: mynginximage: 192.168.206.137/library/nginx:v4ports:- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:name: nginxservice
spec:type: NodePortports:- port: 80targetPort: 80nodePort: 30080selector:app: nginx2
比较上面的V1版本,V2更新了几点:
副本数量增加为:2
镜像使用:v4
更新发布这个新的版本:
kubectl apply -f nginx.yaml
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
撤销上一次升级,并查看升级状态:
kubectl  rollout undo deploy  nginx-deploy
kubectl rollout status deploy nginx-deploy
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-xpz94Name:         nginx-deploy-6b6f9ff985-xpz94
Namespace:    default
Priority:     0
Node:         master/192.168.206.138
Start Time:   Sat, 27 Jan 2024 12:56:23 +0800
Labels:       app=nginxpod-template-hash=6b6f9ff985
Annotations:  cni.projectcalico.org/containerID: 1b2e98f76f8f8e7da439c4a767ec4b297035ca582bcdd445e816e1c13c3d891acni.projectcalico.org/podIP: 10.224.219.80/32cni.projectcalico.org/podIPs: 10.224.219.80/32
Status:       Running
IP:           10.224.219.80
IPs:IP:           10.224.219.80
Controlled By:  ReplicaSet/nginx-deploy-6b6f9ff985
Containers:mynginx:Container ID:   docker://2e6181cee6a4886c0892af0b92b0f31bde4d3513b0d34a654a9a0e0438274c73Image:          192.168.206.137/library/nginx:v3Image ID:       docker-pullable://192.168.206.137/library/nginx@sha256:37bb5a5a2078bd67b1be281165e9f82f6f267d6404e0ae11b3a524b8fff8354ePort:           80/TCPHost Port:      0/TCPState:          RunningStarted:      Sat, 27 Jan 2024 12:56:24 +0800Ready:          TrueRestart Count:  0Environment:    <none>Mounts:/var/run/secrets/kubernetes.io/serviceaccount from default-token-gd949 (ro)
Conditions:Type              StatusInitialized       TrueReady             TrueContainersReady   TruePodScheduled      True
Volumes:default-token-gd949:Type:        Secret (a volume populated by a Secret)SecretName:  default-token-gd949Optional:    false
QoS Class:       BestEffort
Node-Selectors:  <none>
Tolerations:     node.kubernetes.io/not-ready:NoExecute op=Exists for 300snode.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:Type    Reason     Age    From             Message----    ------     ----   ----             -------Normal  Scheduled  5m17s                   Successfully assigned default/nginx-deploy-6b6f9ff985-xpz94 to masterNormal  Pulled     5m17s  kubelet, master  Container image "192.168.206.137/library/nginx:v3" already present on machineNormal  Created    5m17s  kubelet, master  Created container mynginxNormal  Started    5m17s  kubelet, master  Started container mynginx

Image这个地方,可以看到当前POD使用的版本号为V3,可以说明撤销成功,已经回退都发布之前的版本。
六、回滚到指定版本:
kubectl rollout history deploy nginx-deplo

目前有两个版本,在使用的是3,可以回滚到指定版本2,镜像回滚到nginx:v4状态,副本数量为2个
kubectl rollout undo deploy nginx-deploy --to-revision=2
kubectl rollout status deploy nginx-deploy
kubectl get svc,pods -o wide
kubectl describe pods nginx-deploy-76d4c4c684-kvtx8