对于Kubernetes集群来说,一个service可能有多个pod,滚动升级(Rolling update)就是指每次更新部分Pod,而不是在同一时刻将该Service下面的所有Pod shutdown,然后去更新(例如replace --force方案),逐个更新可以避免将业务中断

1. 先查询目前发布的服务版本,可以看到my-dep使用的镜像版本是nginx

2、把Nginx升级到目前最新的1.23.0版本

在yaml文件中添加标粗字段,其中images镜像从Nginx替换成centos-nginx:1.23.0,镜像需要提前通过dockerfile打包load到node节点或者私有仓库中

[root@k8s-master1 ~]# cat nginx-deployment-v2.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-dep
spec:
replicas: 3
minReadySeconds: 30
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1
maxUnavailable: 1
selector:
matchLabels:
app: my-dep
template:
metadata:
labels:
app: my-dep

spec:
containers:
- name: nginx
image: centos-nginx:1.23.0
imagePullPolicy: Never
ports:
- containerPort: 80
restartPolicy: Always

字段解释
minReadySeconds
Kubernetes在等待设置的时间后才进行升级
如果没有设置该值,Kubernetes会假设该容器启动起来后就提供服务了,所以这个可以设置的保守一些,比如我们的服务启动从3-20秒不等,我可以设置成30秒,这样防止pod启动了但是服务还没准备好导致系统不可用。

maxSurge
升级过程中最多可以比原先设置多出的POD数量
例如:maxSurage=1,replicas=3,则表示Kubernetes会先启动1一个新的Pod后才删掉一个旧的POD,整个升级过程中最多会有3+1个POD。

maxUnavaible
升级过程中最多有多少个POD处于无法提供服务的状态,当maxSurge不为0时,该值也不能为0,最好和maxSurge保持一致。
例如:maxUnavaible=1,则表示Kubernetes整个升级过程中最多会有1个POD处于无法服务的状态,可以保证有足够的pod(或者认为是足够的性能)提供服务。

3、开始滚动升级

在执行deployment的操作时,使用了一个--record参数,这个参数是用来告诉apiserver记录update的历史。

在升级过程中,查询pod发现pod先create一个,30s后再删除一个,在重复create操作。和我们在yaml文件中的设定一致

升级过程可以通过status查询升级情况

successfully rolled out表示升级成功

4、查询升级后的版本是否正确

查询rs副本

镜像版本已经升级到1.23.0

也可以在deploy,pod中describe查询对应的镜像版本。describe查询对应的evens事件可以清楚看到pod的升级过程

5、 升级回滚

可以通过如下命令来查看update历史:

kubectl rollout history deployment my-dep

如果前面升级apply的时候没有指定参数--recore,history查询CHANGE-CAUSE就会是<none>

查看指定revision的详细信息:

kubectl rollout history deployment my-dep --revision=8

需要说明的是,在升级完成以后,旧的RS也不会被删除,这些信息都会存储到server端,以方便回滚。

deployment下的pod的回滚操作相当简单,直接执行rollout undo即可将deployment回滚到record中记录的上一个revision:

kubectl rollout undo deployment my-dep

执行如下操作,回滚到指定版本:

kubectl rollout undo deployment my-dep --to-revision=7

6、其他

暂停升级 $ kubectl rollout pause deployment <deployment>

恢复升级 $ kubectl rollout resume deployment <deployment>

最新文章

  1. canvas-渐变文字
  2. SQL-语句实现九九乘法表
  3. 百度地图API 关键字模糊搜索
  4. EETOP中关于Gm仿真的一些帖子的总结
  5. 20150912华为机考1之&quot;输入一个字符串,将其中出现次数最多的字符输出&quot;
  6. Python应用与实践
  7. CThreadPool
  8. 把一个窗体嵌入到WinForm中进行显示,以CMD窗口为例
  9. uva 1476 - Error Curves
  10. 团队工作准则&amp;贡献分配规则
  11. page 简单易懂 分页
  12. 【java】实例化对象的3种方式:new、clone、反射
  13. 爬虫小探-Python3 urllib.request获取页面数据
  14. POJ 1486二分图的必要边
  15. CASE WHEN 及 SELECT CASE WHEN的用法
  16. 读书笔记二 How Does the Internet work?
  17. 一、PHP_OSS使用
  18. React-router4 简单总结
  19. Python - WebDriver 识别登录验证码
  20. Hibernate 的Ehache学习

热门文章

  1. VMware Workstation 虚拟机详细安装教程
  2. 全新升级的AOP框架Dora.Interception[2]: 基于&amp;ldquo;约定&amp;rdquo;的拦截器定义方式
  3. 几种常见的DoS攻击
  4. uipath 如何利用函数split切割换行符?
  5. 记一次 .NET 差旅管理后台 CPU 爆高分析
  6. NC16539 [NOIP2013]表达式求值
  7. C语言求100以内的和的4种方式
  8. SSH 多密钥配置
  9. C#/VB.NET 添加多行文本水印到Word文档
  10. day02-2