此文为学习《Kubernetes权威指南》的相关笔记
学习笔记:
Deployment具备升级的功能,允许我们在运行过程中升级Deployment到新的运行版本,与之对应的是,在某些情况下(比如新的Deployment不稳定时)可能需要将Deployment回滚到旧版本。
在默认情况下,所有Deployment的发布历史都被保留在系统中,以便我们随时进行回滚。
值得注意的是,只有在Deployment的Pod模板(spec.template)被更改时才会创建新的修订版本。
于此同时,K8s允许暂停(pause)Deployment的更新操作,然后进行配置修改,再进行恢复(resume)。
在后面的实操中可以看到,在恢复之前进行的所有配置修改,都将在同一次升级中完成,归为一个版本上。
这样的设定避免了进行复杂配置修改时,频繁出发更新操作的情况
一、查看kubectl rollout命令使用方法
kubectl rollout命令是回滚、暂停和恢复操作用到的主要命令
查看该命令详情如下
可以看到,该命令的操作的资源对象是:deployments\daemonsets\statefulsets
主要子命令是:
- history:查看历史版本
- pause:暂停更新
- restart:重启资源对象
- resume:恢复暂停的额资源对象
- status:查看资源对象状态
- undo:回滚到一个历史版本
# kubectl rollout -h
Manage the rollout of a resource.
Valid resource types include:* deployments
* daemonsets
* statefulsetsExamples:
# Rollback to the previous deployment
kubectl rollout undo deployment/abc
# Check the rollout status of a daemonset
kubectl rollout status daemonset/fooAvailable Commands:
history View rollout history
pause Mark the provided resource as paused
restart Restart a resource
resume Resume a paused resource
status Show the status of the rollout
undo Undo a previous rolloutUsage:
kubectl rollout SUBCOMMAND [options]Use "kubectl <command> --help" for more information about a given command.
Use "kubectl options" for a list of global command-line options (applies to all commands).
2、测试Deployment的回滚操作
1、创建nginx-deployment
与探究Deployment升级时创建的Deployment相同,创建3个带有nginx:1.7.9容器的Pod副本
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
name: nginx
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.7.9
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
需要注意的时,在创建时添加参数--record,可以在history命令提供的版本列表中看到这次版本更替的操作命令
# kubectl create -f rollback-deployment-test.yaml --record
deployment.apps/nginx-deployment created
创建完成后,查看正在运行的RS和Pods副本
# kubectl get rs
NAME DESIRED CURRENT READY AGE
nginx-deployment-7cccdd79bf 3 3 3 25s
[root@MiWiFi-R4CM-srv learn-pod]# kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-deployment-7cccdd79bf-44f98 1/1 Running 0 35s
nginx-deployment-7cccdd79bf-dbqjs 1/1 Running 0 35s
nginx-deployment-7cccdd79bf-pp8nc 1/1 Running 0 35s
2、给nginx-deployment 的容器做一次正常升级
使用kubectl set image升级容器版本到1.9.1
# kubectl set image deployment/nginx-deployment nginx=nginx:1.9.1
deployment.apps/nginx-deployment image updated
可以看到一个新的RS代替了旧的RS
# kubectl get rs
NAME DESIRED CURRENT READY AGE
nginx-deployment-754b687b4c 3 3 3 34s
nginx-deployment-7cccdd79bf 0 0 0 115s
3、给nginx-deployment 的容器升级一个错误的版本
使用kubectl set image命令使容器升级到一个错误的版本
# kubectl set image deployment/nginx-deployment nginx=nginx:1.91
deployment.apps/nginx-deployment image updated
可以看到由于容器镜像拉取失败,Deployment的更新停滞在第一个新Pod的建立上
# kubectl get rs
NAME DESIRED CURRENT READY AGE
nginx-deployment-5684cbb7f9 1 1 0 20s
nginx-deployment-754b687b4c 3 3 3 76s
nginx-deployment-7cccdd79bf 0 0 0 2m37s
[root@MiWiFi-R4CM-srv learn-pod]# kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-deployment-5684cbb7f9-c5cfc 0/1 ErrImagePull 0 25s
nginx-deployment-754b687b4c-8h8hg 1/1 Running 0 79s
nginx-deployment-754b687b4c-8tk6b 1/1 Running 0 81s
nginx-deployment-754b687b4c-j7zb5 1/1 Running 0 77s
可以使用kubectl rollout status命令查看当前Deployment的停滞状态
# kubectl rollout status deployment nginx-deployment
Waiting for deployment "nginx-deployment" rollout to finish: 1 out of 3 new replicas have been updated...
4、使用kubectl rollout history 命令查看历史版本列表
需要注意的是,只有在每次更新Deployment的时都加上--record参数,才能让CHANGE-CAUSE显示每次更新进行的操作
因为我在操作中没有注意这一点,现在可以看到虽然有3个历史版本,但显示的CHANGE-CAUSE都是创建时的操作
# kubectl rollout history deployment/nginx-deployment
deployment.apps/nginx-deployment
REVISION CHANGE-CAUSE
1 kubectl create --filename=rollback-deployment-test.yaml --record=true
2 kubectl create --filename=rollback-deployment-test.yaml --record=true
3 kubectl create --filename=rollback-deployment-test.yaml --record=true
使用--revision参数指定版本号,可以看到各版本的详细信息,如下可以看到,第2、3两个版本如实进行了预定的更新
# kubectl rollout history deployment/nginx-deployment --revision=3
deployment.apps/nginx-deployment with revision #3
......
nginx:
Image: nginx:1.91
......# kubectl rollout history deployment/nginx-deployment --revision=2
deployment.apps/nginx-deployment with revision #2
......
nginx:
Image: nginx:1.9.1
......
5、使用kubectl rollout undo命令回滚版本
如果不指定回滚的版本号,则默认回滚到上一个版本
# kubectl rollout undo deployment/nginx-deployment
deployment.apps/nginx-deployment rolled back
可以看到,进行回滚后,目标历史版本将被提到最新的位置,原来位置的版本将被删除
# kubectl rollout history deployment nginx-deployment
deployment.apps/nginx-deployment
REVISION CHANGE-CAUSE
1 kubectl create --filename=rollback-deployment-test.yaml --record=true
3 kubectl create --filename=rollback-deployment-test.yaml --record=true
4 kubectl create --filename=rollback-deployment-test.yaml --record=true
查看当前RS列表
观察RS名称不难发现,回滚操作并没有像更新操作一样产生一个新的RS,而是重新使用了回滚目标历史版本已经停用的RS
# kubectl get rs
NAME DESIRED CURRENT READY AGE
nginx-deployment-5684cbb7f9 0 0 0 7m19s
nginx-deployment-754b687b4c 3 3 3 8m15s
nginx-deployment-7cccdd79bf 0 0 0 9m36s
6、使用--to-revision参数指定回滚的版本
# kubectl rollout undo deployment nginx-deployment --to-revision=1
deployment.apps/nginx-deployment rolled back
再次查看版本历史,可以看到第一个历史版本已经作为最新的版本存在
# kubectl rollout history deployment nginx-deployment
deployment.apps/nginx-deployment
REVISION CHANGE-CAUSE
3 kubectl create --filename=rollback-deployment-test.yaml --record=true
4 kubectl create --filename=rollback-deployment-test.yaml --record=true
5 kubectl create --filename=rollback-deployment-test.yaml --record=true
查看RS列表,可以看到最开始创建的RS又被重新用起来
# kubectl get rs
NAME DESIRED CURRENT READY AGE
nginx-deployment-5684cbb7f9 0 0 0 10m
nginx-deployment-754b687b4c 0 0 0 10m
nginx-deployment-7cccdd79bf 3 3 3 12m
可以使用kubectl describe命令查看nginx-deployment更新和回滚的详细信息
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal ScalingReplicaSet 11m deployment-controller Scaled up replica set nginx-deployment-754b687b4c to 1
Normal ScalingReplicaSet 11m deployment-controller Scaled down replica set nginx-deployment-7cccdd79bf to 2
Normal ScalingReplicaSet 11m deployment-controller Scaled up replica set nginx-deployment-754b687b4c to 2
Normal ScalingReplicaSet 11m deployment-controller Scaled down replica set nginx-deployment-7cccdd79bf to 1
Normal ScalingReplicaSet 11m deployment-controller Scaled up replica set nginx-deployment-754b687b4c to 3
Normal ScalingReplicaSet 11m deployment-controller Scaled down replica set nginx-deployment-7cccdd79bf to 0
Normal ScalingReplicaSet 10m deployment-controller Scaled up replica set nginx-deployment-5684cbb7f9 to 1
Normal ScalingReplicaSet 4m5s deployment-controller Scaled down replica set nginx-deployment-5684cbb7f9 to 0
Normal ScalingReplicaSet 76s (x2 over 12m) deployment-controller Scaled up replica set nginx-deployment-7cccdd79bf to 3
Normal ScalingReplicaSet 73s (x5 over 80s) deployment-controller (combined from similar events): Scaled down replica set nginx-deployment-754b687b4c to 0
二、Deployment的暂停和恢复操作
1、重新建立一个新的Deployment,配置信息同样和前文的nginx-depoyment相同
# kubectl create -f pause-deployment-test.yaml --record
deployment.apps/nginx-deployment created
# kubectl get rs
NAME DESIRED CURRENT READY AGE
nginx-deployment-7cccdd79bf 3 3 3 5s
# kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-deployment-7cccdd79bf-2ftqq 1/1 Running 0 10s
nginx-deployment-7cccdd79bf-7xflk 1/1 Running 0 10s
nginx-deployment-7cccdd79bf-8hfbn 1/1 Running 0 10s
2、使用 kubectl rollout pause暂停nginx-deployment的更新
# kubectl rollout pause deployment nginx-deployment
deployment.apps/nginx-deployment paused
3、分别对容器版本和资源配置进行两次更新
更新容器版本
# kubectl set image deployment nginx-deployment nginx=nginx:1.9.1 --record
deployment.apps/nginx-deployment image updated
更新资源配置
# kubectl set resources deployment nginx-deployment -c=nginx --limits=cpu=200m,memory=512Mi --record
deployment.apps/nginx-deployment resource requirements updated
查看nginx-deployment的版本列表,可以看到由于更新的暂停,列表中只存在建立时的版本
# kubectl rollout history deployment nginx-deployment
deployment.apps/nginx-deployment
REVISION CHANGE-CAUSE
1 kubectl create --filename=pause-deployment-test.yaml --record=true
4、使用kubectl rollout resume命令恢复nginx-deployment的更新
# kubectl rollout resume deployment nginx-deployment
deployment.apps/nginx-deployment resumed
再次查看版本列表,可以看到暂停期间的两次更新被合并更新到了一个新版本中
# kubectl rollout history deployment nginx-deployment
deployment.apps/nginx-deployment
REVISION CHANGE-CAUSE
1 kubectl create --filename=pause-deployment-test.yaml --record=true
2 kubectl set resources deployment nginx-deployment --containers=nginx --limits=cpu=200m,memory=512Mi --record=true
在这种情况下,两次更新只需要建立一个新的RS即可完成
# kubectl get rs
NAME DESIRED CURRENT READY AGE
nginx-deployment-7cccdd79bf 0 0 0 7m26s
nginx-deployment-84bf99bbb7 3 3 3 28s
查看新RS的具体信息,可以看到对nginx-deployment的两次更新操作已经被应用起来
# kubectl describe rs nginx-deployment-84bf99bbb7
Name: nginx-deployment-84bf99bbb7
......
Containers:
nginx:
Image: nginx:1.9.1
Port: 80/TCP
Host Port: 0/TCP
Limits:
cpu: 200m
memory: 512Mi
......