【Kubernetes】Pod学习(十五)Deployment部署的回滚、暂停和恢复

此文为学习《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
  *  statefulsets

Examples:
  # Rollback to the previous deployment
  kubectl rollout undo deployment/abc
 
  # Check the rollout status of a daemonset
  kubectl rollout status daemonset/foo

Available 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 rollout

Usage:
  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

......

发布了27 篇原创文章 · 获赞 0 · 访问量 946

猜你喜欢

转载自blog.csdn.net/qq_38093301/article/details/103606703