Kubernetes实践之深入掌握Pod——Pod的升级和回滚

薛正华 2020-05-28

Pod的升级和回滚

Deployment的升级

apiVersion: apps/v1beta1
kind: Deployment
metadata:
  name: nginx-deployment
  namespace: test
spec:
  replicas: 3
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.7.9
        ports:
        - containerPort: 80
[ test]# kubectl get pod -n test
NAME                                READY   STATUS    RESTARTS   AGE
nginx-deployment-5754944d6c-6x2zq   1/1     Running   0          59s
nginx-deployment-5754944d6c-9cncj   1/1     Running   0          59s
nginx-deployment-5754944d6c-wx5k4   1/1     Running   0          59s

 方式1

现在Pod镜像需要被更新为Nginx:1.9.1,我们可以通过kubectl set image命令为Deployment设置新的镜像名称

[ test]# kubectl set image deployment/nginx-deployment nginx=nginx:1.9.1 -n test
deployment.extensions/nginx-deployment image updated
[ test]# kubectl describe  pod -n test | grep Image
    Image:          nginx:1.9.1

方式2

[ test]# kubectl edit deployment/nginx-deployment -n test
deployment.extensions/nginx-deployment edited

 查看滚动状态

[ test]# kubectl rollout status deployment/nginx-deployment -n test
deployment "nginx-deployment" successfully rolled out

[ test]# kubectl describe  pod -n test | grep Image
    Image:          nginx:1.7.9

[ test]# kubectl get  rs -n test
NAME                          DESIRED   CURRENT   READY   AGE
nginx-deployment-5754944d6c   3         3         3       17m
nginx-deployment-7448597cd5   0         0         0       11m

 滚动更新时两个主要参数

  • spec.strategy.rollingUpdate.maxUnavailable:用于指定 Deployment在更新过程中不可用状态的Pod数量的上限
  • spec.strategy.rollingUpdate.maxSurge:用于指定在Deployment 更新Pod的过程中Pod总数超过Pod期望副本数部分的最大值

Deployment的回滚

假设在更新Deployment镜像时,将容器镜像名误设置成 Nginx:1.91(一个不存在的镜像)

[ test]# kubectl set image deployment/nginx-deployment nginx=nginx:1.91 -n test

 查看创建的Pod,会发现新的ReplicaSet创建的1个Pod被卡在镜像拉取过程中

[ test]#  kubectl get pod -n test
NAME                                READY   STATUS         RESTARTS   AGE
nginx-deployment-5754944d6c-kmfg7   1/1     Running        0          55m
nginx-deployment-5754944d6c-plgs9   1/1     Running        0          55m
nginx-deployment-5754944d6c-qmd2f   1/1     Running        0          55m
nginx-deployment-7ff84c8bc9-2z8hs   0/1     ErrImagePull   0          27s

 回滚方式

首先,用kubectl rollout history命令检查这个Deployment部署的历史 记录

[ test]# kubectl rollout history deployment/nginx-deployment -n test
deployment.extensions/nginx-deployment 
REVISION  CHANGE-CAUSE
2         
3         
4         
[ test]# kubectl rollout history deployment/nginx-deployment --revision=3 -n test
deployment.extensions/nginx-deployment with revision #3
Pod Template:
  Labels:       app=nginx
        pod-template-hash=5754944d6c
  Containers:
   nginx:
    Image:      nginx:1.7.9
    Port:       80/TCP
    Host Port:  0/TCP
    Environment:        
    Mounts:     
  Volumes:

 注意,在创建Deployment时使用--record参数,就可以在CHANGE- CAUSE列看到每个版本使用的命令了。

默认回退到上个版本

[ test]# kubectl rollout undo deployment/nginx-deployment -n test
deployment.extensions/nginx-deployment rolled back

 指定版本

[ test]# kubectl rollout undo deployment/nginx-deployment --to-revision=3 -n test 
deployment.extensions/nginx-deployment rolled back

暂停和恢复Deployment的部署操作

对于一次复杂的Deployment配置修改,为了避免频繁触发 Deployment的更新操作,可以先暂停Deployment的更新操作,然后进行配置修改,再恢复Deployment,一次性触发完整的更新操作,就可以避 免不必要的Deployment更新操作了

 通过kubectl rollout pause命令暂停Deployment的更新操作

[ test]# kubectl rollout pause  deployment/nginx-deployment -n test
deployment.extensions/nginx-deployment paused
[ test]# kubectl set image deployment/nginx-deployment nginx=nginx:1.9.1 -n test
deployment.extensions/nginx-deployment image updated

 查看Deployment的历史记录,发现并没有触发新的Deployment部署操作

[ test]# kubectl rollout history deployment/nginx-deployment -n test

在暂停Deployment部署之后,可以根据需要进行任意次数的配置更新。例如,再次更新容器的资源限制

[ test]# kubectl set resources deployment nginx-deployment -c=nginx --limits=cpu=200m,memory=512Mi -n test

 最后,恢复这个Deployment的部署操作

[ test]# kubectl rollout resume deploy nginx-deployment -n test
deployment.extensions/nginx-deployment resumed
[ test]# kubectl describe deploy nginx-deployment -n test

 DaemonSet的更新策略

目前DaemonSet的升级策略包括两种:OnDelete和RollingUpdate。
(1)OnDelete:DaemonSet的默认升级策略,与1.5及以前版本的 Kubernetes保持一致。当使用OnDelete作为升级策略时,在创建好新的 DaemonSet配置之后,新的Pod并不会被自动创建,直到用户手动删除 旧版本的Pod,才触发新建操作。
(2)RollingUpdate:从Kubernetes 1.6版本开始引入。当使用 RollingUpdate作为升级策略对DaemonSet进行更新时,旧版本的Pod将被 自动杀掉,然后自动创建新版本的DaemonSet Pod。整个过程与普通 Deployment的滚动升级一样是可控的。不过有两点不同于普通Pod的滚 动升级:一是目前Kubernetes还不支持查看和管理DaemonSet的更新历 史记录;二是DaemonSet的回滚(Rollback)并不能如同Deployment一 样直接通过kubectl rollback命令来实现,必须通过再次提交旧版本配置 的方式实现。

Pod的扩缩容

apiVersion: apps/v1beta1
kind: Deployment
metadata:
  name: nginx-deployment
  namespace: test
spec:
  replicas: 3
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.7.9
        ports:
        - containerPort: 80

通过kubectl scale命令可以将Pod副本数量从初始的3个更新为5个

扩容

[ test]# kubectl scale deploy nginx-deployment --replicas 5 -n test
deployment.extensions/nginx-deployment scaled
[ test]# kubectl get pod -n test
NAME                                READY   STATUS    RESTARTS   AGE
nginx-deployment-7576c67d77-dfmhp   1/1     Running   0          17m
nginx-deployment-7576c67d77-m6pbq   1/1     Running   0          53s
nginx-deployment-7576c67d77-v82l9   1/1     Running   0          17m
nginx-deployment-7576c67d77-z6v4h   1/1     Running   0          53s
nginx-deployment-7576c67d77-z6xgj   1/1     Running   0          17m

 缩容

[ test]# kubectl scale deploy nginx-deployment --replicas 2 -n test
deployment.extensions/nginx-deployment scaled

相关推荐