在现网情况下,业务升级常常需要停机,下面我们使用Deployment来进行不停机升级和回滚.
1.先使用创建多个nginx的pod
[root@node-1 pod]# cat nginx_deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.7.9
ports:
- containerPort: 80
[root@node-1 pod]#
[root@node-1 pod]# kubectl create -f nginx_deployment.yaml
[root@node-1 pod]# kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx-deployment-54f57cf6bf-lh2rv 1/1 Running 0 74s
nginx-deployment-54f57cf6bf-psbqx 1/1 Running 0 74s
nginx-deployment-54f57cf6bf-tgtms 1/1 Running 0 74s
2.现在我们对镜像从nginx:1.7.9升级到nginx:1.9.1
方法1:直接使用命令行修改镜像:
[root@node-1 pod]# kubectl set image deployment/nginx-deployment nginx=nginx:1.9.1
deployment.apps/nginx-deployment image updated
方法2:使用kubectl edit deployment命令修改deployment的配置信息
[root@node-1 pod]# kubectl edit deployments.apps nginx-deployment
使用kubectl rollout status查看进度,正在
[root@node-1 pod]# kubectl rollout status deployment nginx-deployment
Waiting for deployment "nginx-deployment" rollout to finish: 2 out of 3 new replicas have been updated...
Waiting for deployment "nginx-deployment" rollout to finish: 2 out of 3 new replicas have been updated...
Waiting for deployment "nginx-deployment" rollout to finish: 2 out of 3 new replicas have been updated...
Waiting for deployment "nginx-deployment" rollout to finish: 1 old replicas are pending termination...
Waiting for deployment "nginx-deployment" rollout to finish: 1 old replicas are pending termination...
deployment "nginx-deployment" successfully rolled out
实际上deployment操作是的rs,nginx-deployment-54f57cf6bf 是旧的rs,nginx-deployment-56f8998dbc是新的deployment
[root@node-1 pod]# kubectl get rs
NAME DESIRED CURRENT READY AGE
centos-56d49f9c64 0 0 0 7d4h
centos-6b68465d79 1 1 1 7d4h
nginx-deployment-54f57cf6bf 0 0 0 11m
nginx-deployment-56f8998dbc 3 3 3 6m58s
3.系统如何升级的说明
更新的过程中,系统会创建临时的deployment对象,先把旧的deployment的replicas减1,新的deployment加1,直到旧的deployment的副本为0,升级完成.
使用kubectl edit deployments命令,你可以看到spec下的strategy一些关于升级的默认策略.
spec:
strategy:
rollingUpdate:
maxSurge: 25% #新旧副本pod的总数不超过配置数的比率,如果100个pod,那么运行中的和升级中的pod总和不超过125.
maxUnavailable: 25% #升级过程中不可用状态pod的上限,意思就是升级过程中确保处于running状态的pod是75%以上,再继续更新.
type: RollingUpdate#以滚动更新的方式逐个更新pod,如果是Recreate,系统会杀死所有的pod,重建pod.
4.回滚
现网中,如果发现新版本存在问题,需要回退,需要一系列的操作还原,还需要进行详细的测试,防止回退时配置错误.
deployment记录了升级前的配置,通过deployment,我们更容易将版本进行回退.
首先查看更新记录
[root@node-1 pod]# kubectl rollout history deployment nginx-deployment
deployment.apps/nginx-deployment
REVISION CHANGE-CAUSE
1 <none>
2 <none>
我们发现没有记录更新信息,原因是因为我们在创建deployment的时候没有配置记录命令.创建的时候加上–record参数
[root@node-1 pod]# kubectl create -f nginx_deployment.yaml --record
deployment.apps/nginx-deployment created
[root@node-1 pod]#
#为了模拟版本的问题,我们升级的镜像选择一个不存在的版本
[root@node-1 pod]# kubectl set image deployment/nginx-deployment nginx=nginx:2020
#查看状态,发现由于找不到镜像,会一直卡在这里
[root@node-1 pod]# kubectl rollout status deployment nginx-deployment
Waiting for deployment "nginx-deployment" rollout to finish: 1 out of 3 new replicas have been updated...
#查看RS状态,发现新的RS一直在创建第一个pod,
[root@node-1 pod]# kubectl get rs
NAME DESIRED CURRENT READY AGE
nginx-deployment-54f57cf6bf 3 3 3 2m47s
nginx-deployment-569cb44c46 1 1 0 80s
#查看pod,发现有一个pod拉取镜像失败.
[root@node-1 pod]# kubectl get pod
NAME READY STATUS RESTARTS AGE
centos-6b68465d79-5w9df 1/1 Running 0 7d5h
nginx-deployment-54f57cf6bf-2dfh8 1/1 Running 0 3m57s
nginx-deployment-54f57cf6bf-57plj 1/