Kubernetes
吾八哥学k8s(五):kubernetes滚动更新、回滚
什么是滚动更新?
滚动更新是指允许通过使用新的实例逐步更新 Pod 实例,零停机进行 Deployment 更新。新的 Pod 将在具有可用资源的节点上进行调度,最大好处是零停机,整个更新过程始终有副本在运行,从而保证业务不宕机。
滚动更新允许以下操作:
将应用程序从一个环境提升到另一个环境(通过容器镜像更新)
回滚到以前的版本
持续集成和持续交付应用程序,无需停机
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流水线上才能更好的保障业务的稳定性。
相关文章
- 在Kubernetes里使用openkruise实现服务原地升级功能
- 吾八哥学k8s(十一):kubernetes里Pod的调度机制
- 吾八哥学k8s(十):kubernetes里Service和Ingress
- kubernetes中服务自定义Prometheus的metrics的方法
- k8s集群安装Prometheus监控以及Grafana面板的方法
- kubernetes集群证书过期的解决方法
- kubelet启动失败报failed to find cgroups of kubelet的解决方法
- 吾八哥学k8s(九):kubernetes里持久化存储
- macOs和Linux环境下kubectl命令自动补齐的方法
- 吾八哥学k8s(八):kubernetes里Secret的用法