镜像来源: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