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了。