Kubernetes更新和回滚
如果对Deployment的Pod template部分进行更改,例如更新template 中的 label 和容器镜像时,就会创建出一个新的 revision版本记录,如果想回滚恢复到以前某个版本状态,可以随时进行操作恢复。
1.先创建一个deploy
这里直接用命令创建一个nginx服务的deploy
# kubectl create deploy nginx-deploy --image=nginx:1.19.0 --replicas=2 -n dev
这里用的nginx镜像是1.19.0版本
2.查看revision版本记录
查看nginx的deploy历史版本记录
# kubectl -n dev rollout history deploy nginx-deploy
REVISION CHANGE-CAUSE
1 <none>
第一栏REVISION是记录修改过的历史序列号,如果要回滚可以指定一个序列号来选择恢复到哪个状态。 第二栏CHANGE-CAUSE是记录回滚的一个标注内容,这里显示为,如果想直接显示记录内容,可以在命令后加上–record,也可以用annotate和patch来后期添加
如果前面执行命令没有加–record,也是可以查看revision版本记录的详细信息的。 可以用“–revision=序列号”来查看某个记录的详细信息。
# kubectl -n dev rollout history deploy nginx-deploy --revision=1
deployment.apps/nginx-deploy with revision #1
Pod Template:
Labels: app=nginx-deploy
pod-template-hash=5bcb7bd7ff
Containers:
nginx:
Image: nginx:1.19.0
Port: <none>
Host Port: <none>
Environment: <none>
Mounts: <none>
Volumes: <none>
会显示出Template部分,从这里也能知道这个revision版本的信息。
这个历史记录的条数,可以在deploy的spec中修改revisionHistoryLimit这个值,一般默认是10条。
# kubectl -n dev get deploy nginx-deploy -o yaml
apiVersion: apps/v1
kind: Deployment
metadata:
annotations:
deployment.kubernetes.io/revision: "1"
creationTimestamp: "2023-02-26T15:31:49Z"
generation: 1
labels:
app: nginx-deploy
name: nginx-deploy
namespace: dev
resourceVersion: "7525"
uid: 751913ce-eee1-43a8-a92f-c0704a89f3bd
spec:
progressDeadlineSeconds: 600
replicas: 2
revisionHistoryLimit: 10 #这里
......
3、升级更新
把nginx镜像版本升级到1.19.1,这里在命令后加上–record
# kubectl -n dev set image deploy nginx-deploy nginx=nginx:1.19.1 --record
Flag –record has been deprecated, –record will be removed in the future
我用的是Kubernetes v1.23版本,有提示说–record这个参数在未来不再使用了。Kubernetes一直在更新,所以命令也一直在小变化中。
如果用yaml文件来更新的话,也可以加–record
# kubectl apply -f nginx.yaml --record
更新完,再查看一下历史版本记录信息
# kubectl -n dev rollout history deploy nginx-deploy
REVISION CHANGE-CAUSE
1 <none>
2 kubectl set image deploy nginx-deploy nginx=nginx:1.19.1 --namespace=dev --record=true
可以看到,第二栏中,由于#1执行命令时没有加–record,所以是none,后面#2执行命令时加上了–record就有具体内容显示了。 一般如果用程序或者用脚本来执行更新命令,最好加上–record,这样方便查看和操作。不过前面有说–record这个参数会在未来删除,所以后面可能需要用annotate和patch来添加
4、不指定版本直接回滚
如果直接执行回滚命令,就是会回滚到上一个版本
# kubectl -n dev rollout undo deploy nginx-deploy
查看记录
# kubectl -n dev rollout history deploy nginx-deploy
REVISION CHANGE-CAUSE
2 kubectl set image deploy nginx-deploy nginx=nginx:1.19.1 --namespace=dev --record=true
3 <none>
可以看到,在原先只有两条版本记录的情况下,还原掉了原先的#1,现在最新序列号是#3。
因为#1原先记录内容是none,可以使用命令来查看详细信息进行验证一下
# kubectl -n dev rollout history deploy nginx-deploy --revision=3
deployment.apps/nginx-deploy with revision #3
Pod Template:
Labels: app=nginx-deploy
pod-template-hash=5bcb7bd7ff
Containers:
nginx:
Image: nginx:1.19.0
Port: <none>
Host Port: <none>
Environment: <none>
Mounts: <none>
Volumes: <none>
可以看到,#3这个镜像信息是nginx:1.19.0,就是原先#1的nginx版本号。 当然,也可以直接查看当前deploy的信息来验证。
# kubectl -n dev get deploy nginx-deploy -o yaml
apiVersion: apps/v1
kind: Deployment
metadata:
annotations:
deployment.kubernetes.io/revision: "3"
creationTimestamp: "2023-02-26T15:31:49Z"
5.指定版本回滚
只要在上面的命令后加上“–to-revision=记录序列号”就可以了。
我们再升级一下nginx版本,升级到1.19.2版本,然后再做一个回滚。
# kubectl -n dev set image deploy nginx-deploy nginx=nginx:1.19.2 --record
升级完成。
再查看历史版本信息
# kubectl -n dev rollout history deploy nginx-deploy
REVISION CHANGE-CAUSE
2 kubectl set image deploy nginx-deploy nginx=nginx:1.19.1 --namespace=dev --record=true
3 <none>
4 kubectl set image deploy nginx-deploy nginx=nginx:1.19.2 --namespace=dev --record=true
现在有三条记录了。
现在使用“–to-revision=记录序列号”来进行回滚操作。
# kubectl -n dev rollout undo deploy nginx-deploy --to-revision=2
deployment.apps/nginx-deploy rolled back
这里指定回滚到原先#2版本,也就是nginx版本回滚到1.19.1。
回滚完成,查看历史信息验证
# kubectl -n dev rollout history deploy nginx-deploy
deployment.apps/nginx-deploy
REVISION CHANGE-CAUSE
3 <none>
4 kubectl set image deploy nginx-deploy nginx=nginx:1.19.2 --namespace=dev --record=true
5 kubectl set image deploy nginx-deploy nginx=nginx:1.19.1 --namespace=dev --record=true
原先的#2已经被还原掉了,现在最新记录是#5,nginx版本已经是1.19.1了。