使用Deployment声明式升级应用

镜像来源:https://github.com/luksa/kubernetes-in-action/blob/master/Chapter09

{“内容”: ["应用滚动升级","应用回滚","阻止出错版本的滚动升级"]}

一、应用滚动升级
1.发布应用、服务

[root@m-xxx ~]# kubectl create -f kubia-deployment-v1.yaml --record  # 该选项是记录历史版本号
---
apiVersion: apps/v1beta1
kind: Deployment
metadata:
  name: kubia
spec:
  replicas: 3
  template:
    metadata:
      name: kubia
      labels:
        nginx: kubia
    spec:
      containers:
      - image: kubia:v1
        name: nodejs
        imagePullPolicy: IfNotPresent       
---
apiVersion: v1
kind: Service
metadata:
  name: kubia
spec:
  type: NodePort
  selector:
    app: kubia
  ports:
  - port: 80
    targetPort: 8080

2.展示Deployment滚动过程中的状态

[root@m-xxx ~]# kubectl rollout status deployment kubia          
deployment "kubia" successfully rolled out
[root@m-xxx~]# kubectl  get deployment                
NAME           READY   UP-TO-DATE   AVAILABLE   AGE
kubia          3/3     3            3           4m9s
[root@m-xxx ~]# kubectl  get rs
NAME                      DESIRED   CURRENT   READY   AGE
kubia-5957c597b9          3         3         3       4m41s
[root@m-xxx ~]# kubectl  get pods
NAME                            READY   STATUS    RESTARTS   AGE
kubia-5957c597b9-5zf7r          1/1     Running   0          5m3s
kubia-5957c597b9-dvh76          1/1     Running   0          5m3s
kubia-5957c597b9-h5j5p          1/1     Running   0          5m3s

3.触发滚动升级

[root@m-xxx ~]# kubectl set image deployment kubia nodejs=kubia:v2
deployment.extensions/kubia image updated

4.列出新旧rs,其过程是deployment控制新旧rs扩缩容,直至到0:期望值

[root@m-xxx ~]# kubectl get rs
NAME                      DESIRED   CURRENT   READY   AGE
kubia-5957c597b9          0         0         0       55m
kubia-88f66b894           3         3         3       6m7s

二、应用回滚
v3版本存在一个bug,程序只能正确请求前面四个请求,镜像源看文章头部引用。
1.部署v3版本应用

[root@m-xxx ~]# kubectl set image deployment kubia nodejs=kubia:v3
[root@m-xxx ~]# kubectl rollout status deployment kubia
Waiting for deployment "kubia" rollout to finish: 1 old replicas are pending termination...
Waiting for deployment "kubia" rollout to finish: 1 old replicas are pending termination...
deployment "kubia" successfully rolled out

2.访问观察

[root@xxx ~]# while true;do curl 任意节点ip:30275;sleep 0.5;done
This is v3 running in pod kubia-bf846cc6c-8xb4m
... ...
This is v3 running in pod kubia-bf846cc6c-9rkhr
Some internal error has occurred! This is pod kubia-bf846cc6c-8xb4m
... ...
Some internal error has occurred! This is pod kubia-bf846cc6c-9rkhr

3.回滚到上一版本,也可在滚动升级过程中执行,会直接停止滚动升级

[root@m-xxx ~]# kubectl rollout undo deployment kubia  # 回滚到上一版本
deployment.extensions/kubia rolled back
[root@m-xxx ~]# kubectl rollout status deployment kubia
Waiting for deployment "kubia" rollout to finish: 1 out of 3 new replicas have been updated...
Waiting for deployment "kubia" rollout to finish: 1 out of 3 new replicas have been updated...
Waiting for deployment "kubia" rollout to finish: 1 out of 3 new replicas have been updated...
Waiting for deployment "kubia" rollout to finish: 2 out of 3 new replicas have been updated...
Waiting for deployment "kubia" rollout to finish: 2 out of 3 new replicas have been updated...
Waiting for deployment "kubia" rollout to finish: 2 out of 3 new replicas have been updated...
Waiting for deployment "kubia" rollout to finish: 2 out of 3 new replicas have been updated...
Waiting for deployment "kubia" rollout to finish: 1 old replicas are pending termination...
Waiting for deployment "kubia" rollout to finish: 1 old replicas are pending termination...
Waiting for deployment "kubia" rollout to finish: 1 old replicas are pending termination...
deployment "kubia" successfully rolled out

4.显示滚动升级历史

[root@m-xxx ~]# kubectl rollout history deployment kubia
deployment.extensions/kubia 
REVISION  CHANGE-CAUSE
1         kubectl create --filename=kubia-deployment-v1.yaml --record=true
3         kubectl create --filename=kubia-deployment-v1.yaml --record=true
4         kubectl create --filename=kubia-deployment-v1.yaml --record=true

5.回滚特定版本

[root@m-xxx ~]# kubectl rollout undo deployment kubia --to-revision=1

6.暂停滚动升级(金丝雀发布)

[root@m-xxx ~]# kubectl set image deployment kubia nodejs=kubia:v4
deployment.extensions/kubia image updated
[root@m-xxx ~]# kubectl  rollout pause deployment kubia
deployment.extensions/kubia paused

7.恢复滚动升级

[root@m-xxx~]# kubectl rollout resume deployment kubia

三、阻止出错版本的滚动升级
使用minReadySeconds和就绪探针自动避免错误版本升级
1.使用apply更新Deployment

[root@m-xxx ~]# kubectl apply -f kubia-deployment-v3-with-readinesscheck.yaml 
---
kind: Deployment
apiVersion: apps/v1beta1
metadata:
  name: kubia
spec:
  replicas: 3
  template:
    metadata:
      name: kubia
      labels:
        nginx: kubia
    spec:
      containers:
      - name: nodejs
        image: kubia:v3
        imagePullPolicy: IfNotPresent
        readinessProbe:
          periodSeconds: 1  # 每一秒钟执行一次
          httpGet:
            path: /
            port: 8080
  strategy:
    type: RollingUpdate  # 滚动升级策略,另外一个是Recreate(全部杀死再升级)
    rollingUpdate:  # 控制一次替换多少个pod
      maxUnavailable: 0  # 升级过程中,至少replicas-0可用,不可理解为最多0个不可用
      maxSurge: 1  # 升级过程中,副本实例可超1
  minReadySeconds: 30 # 新建pod正确运行30秒后才视为可用
  revisionHistoryLimit: 2 #保存2个历史版本号
  progressDeadlineSeconds: 600 # 默认10分钟滚动升级未完成,则自动取消滚动升级 
[root@m-xxx ~]# kubectl rollout status deployment kubia                       
Waiting for deployment "kubia" rollout to finish: 0 of 3 updated replicas are available...

2.取消出错版本的滚动升级

[root@m-xxx ~]# kubectl rollout undo deployment kubia 

你可能感兴趣的:(Kubernetes)