吾八哥博客

您现在的位置是:首页 > 云原生 > Kubernetes > 正文

Kubernetes

吾八哥学k8s(五):kubernetes滚动更新、回滚

吾八哥2020-04-19Kubernetes2977

什么是滚动更新?

滚动更新是指允许通过使用新的实例逐步更新 Pod 实例,零停机进行 Deployment 更新。新的 Pod 将在具有可用资源的节点上进行调度,最大好处是零停机,整个更新过程始终有副本在运行,从而保证业务不宕机。

v2-232d0bd7f74bbf380e0d4f83f4a3bbc9_b.gif

滚动更新允许以下操作:

  • 将应用程序从一个环境提升到另一个环境(通过容器镜像更新)

  • 回滚到以前的版本

  • 持续集成和持续交付应用程序,无需停机

Replication Controller 和 ReplicaSet

Replication Controller用来确保容器应用的副本数始终保持在用户定义的副本数,即如果有容器异常退出,会自动创建新的Pod来替代;而如果异常多出来的容器也会自动回收。ReplicaSet和Replication Controller唯一的区别是ReplicaSet支持标签选择器,一般推荐使用Deployment来自动管理ReplicaSet。

Deployment部署

Deployment为Pod和ReplicaSet提供声明式更新,来方便的管理应用。

准备yaml文件

这里依然采用前面学习的时候的yaml文件进行测试验证,这里准备两份文件,为什么方便区分,两个yaml文件的内容区别如下:

k8s-demo-v1.yaml文件里:

...
replicas: 1
image: www.5bug.wang/docker/k8s-demo:1.1

k8s-demo-v1.yaml文件里:

...
replicas: 2
image: www.5bug.wang/docker/k8s-demo:1.2

这里的区别是v1是1一个副本,v2是两个副本,镜像的1.1和1.2版本的区别可以找个接口返回不一样的内容即可区分。

创建Deployment

5bug-MacBook:~/codes/projects/k8s-demo$ kubectl apply -f k8s-demo-v1.yaml --record
deployment.apps/k8s-demo created
service/k8s-demo-svc created
ingress.extensions/k8s-demo-ingress created

查看部署状态

5bug-MacBook:~/codes/projects/k8s-demo$ kubectl rollout status deployment/k8s-demo
deployment "k8s-demo" successfully rolled out

等待执行完成,即完成了部署过程。

查看deployment状态

5bug-MacBook:~/codes/projects/k8s-demo$ kubectl get deploy
NAME       READY   UP-TO-DATE   AVAILABLE   AGE
k8s-demo   1/1     1            1           37s

查看Replicaset

5bug-MacBook:~/codes/projects/k8s-demo$ kubectl get rs
NAME                 DESIRED   CURRENT   READY   AGE
k8s-demo-7c857879c   1         1         1       108s

更新Deployment

命令式更新,例如更新镜像版本为1.2:

kubectl set image deployment k8s-demo k8s-demo=www.5bug.wang/docker/k8s-demo:1.2 --record

实际上CI/CD过程中,一般都需要保留每个版本部署的完整的yaml文件,方便问题追溯和回滚,所以这里的更新我们还是采用yaml文件的形式去更新

5bug-MacBook:~/codes/projects/k8s-demo$ kubectl apply -f k8s-demo-v2.yaml --record
deployment.apps/k8s-demo configured
service/k8s-demo-svc configured
ingress.extensions/k8s-demo-ingress configured

此时查询部署状态,可以看到一个滚动部署的过程(由于pod副本数量少,所以敲打命令的时候要快一些):

5bug-MacBook:~/codes/projects/k8s-demo$ kubectl rollout status deployment/k8s-demo
Waiting for deployment "k8s-demo" rollout to finish: 1 of 2 updated replicas are available...
Waiting for deployment "k8s-demo" rollout to finish: 1 of 2 updated replicas are available...
deployment "k8s-demo" successfully rolled out
5bug-MacBook:~/codes/projects/k8s-demo$ kubectl get deploy
NAME       READY   UP-TO-DATE   AVAILABLE   AGE
k8s-demo   2/2     2            2           29m

同时副本数量也变为2个了,符合预期,pod迭代的过程是按照一定比例进行更新替换的,这个比例的控制在我们部署使用的yaml里也有描述:

...
strategy:  # 更新策略
type: RollingUpdate # 滚动更新
rollingUpdate:
maxSurge: 1  #可选 可以超过期望值的最大pod数 默认为25%,maxSurge、maxUnavailable不能同时为0,都可以设置为数字或百分比
maxUnavailable: 1  #可选 在更新时最大不可用的pod数量 默认为25% 
...

查询部署历史

5bug-MacBook:~/codes/projects/k8s-demo$ kubectl rollout history deployment/k8s-demo
deployment.apps/k8s-demo
REVISION  CHANGE-CAUSE
1         kubectl apply --filename=k8s-demo-v1.yaml --record=true
2         kubectl apply --filename=k8s-demo-v2.yaml --record=true

这里需要注意一个问题,如果你的yaml里image版本是一样的,这里的history只会显示同一个版本的最后一次的记录的。

回滚到指定版本

5bug-MacBook:~/codes/projects/k8s-demo$ kubectl rollout undo deployment/k8s-demo --to-revision=1
deployment.apps/k8s-demo rolled back

指定revision版本即可,请注意这里的回滚只回滚image的版本,其他的配置信息是不会进行回滚,例如副本数量等配置。

部署暂停/继续

5bug-MacBook:~/codes/projects/k8s-demo$ kubectl rollout pause deployment/k8s-demo
deployment.apps/k8s-demo paused
5bug-MacBook:~/codes/projects/k8s-demo$ kubectl rollout resume deployment/k8s-demo
deployment.apps/k8s-demo resumed

这里只是简单的学习下kubernetes部署回滚命令的使用,在实际生产业务使用的时候我们需要将这些操作封装为api接口,同时存储记录每一次的操作行为,这样在devops流水线上才能更好的保障业务的稳定性。