k8s pod 升级与回滚
创始人
2025-05-28 20:43:07
0

当集群中的某个服务需要升级时,我们需要停止目前与该服务相关的所有pod,然后下载新版本镜像并创建新的pod。如果集群规模比较大,则这个工作变成了一个挑战,而且先全部停止然后逐步升级的方式会导致较长时间的服务不可用。

kubernetes提供了滚动升级功能来解决上述问题。

如果pod是通过Deployment创建的,则用户可以在运行时修改Deployment的pod定义(spec.template)或镜像名称,并应用到Deployment对象上,系统即可完成Deployment的rollout动作,rollout可被视为Deployment的自动更新或者自动部署动作,如果在更新过程中发生了错误,则还可以通过回滚操作恢复pod的版本

二、Deployment升级

下面以nginx的deployment为例:

apiversion: apps/v1kind: Deploymentmetadata:    name: nginx-deployment spec:  selector:    matchLabels:        app: nginx  replicas: 3  template:    metadata:      labels:          app: nginx  spec    containers:    - name: nginx      image: nginx:1.7.9      ports:      - containerPort: 80

可以看到已运行的副本数有3个:

那么如果想升级nginx的版本为1.9.1,该如何操作呢?

1. 升级方式

方式一:set image命令

可以通过kubectl set image命令为Deployment设置新的镜像名称:


方式一:edit命令

另一种更新的方法是使用kubectl edit命令修改Deployment的配置,将 spec.template.spec.containers[0].image从nginx: 1.7.9更改为nginx:1.9.1:

2. 查看过程

镜像名(或pod定义)一旦发生了修改,则将触发系统完成Deployment所有运行pod的滚动升级操作。

可以使用 kubectl rollout status 命令查看Deployment的更新过程:

查看当前运行的pod,名称已经更新了:

查看pod使用的镜像,已经更新为Nginx:1.9.1了:

3. 升级原理

Deployment升级pod的流程如下:

step1:初始创建Deployment时,系统创建了一个ReplicaSet (nginx--deployment-4o87004473),并按用户的需求创建了3个Pod副本;
step2:更新Deployment时,系统创建了一个新的ReplicaSet(nginx-deployment- 3599678771),并将其副本数量扩展到1,然后将旧的ReplicaSet缩减为2;
step3:之后,系统继续按照相同的更新策略对新旧两个ReplicaSet进行逐个调整;
step4:最后,新的ReplicaSet运行了3个新版本的Pod副本,旧的ReplicaSet副本数量则缩减为0

我们可以使用kubectl describe deployments/nginx-deployment命令仔细观察Deployment的更新过程:

运行kubectl get rs命令,查看两个ReplicaSet的最终状态:

在整个升级过程中,系统会保证至少有两个pod可用,并且最多同时运行4个pod,这是Deployment通过复杂的算法完成的。

Deployment需要确保在整个更新 过程中只有一定数量的pod可能处于不可用状态。在默认情况下,Deployment确保可用的pod总数量至少为所需的副本数量(DESIRED)减1,也就是最多1个不可用(maxUnavailables=1)。

Deploymenti还需要确保在整个更新过程中pod的总数量不会超过所需的副本数量太多。在默认情况下,Deployment确保pod的总数量最多比所需的pod数量多1个,也就是最多1个浪涌值(maxSurge=-1)。

Kubernetes从1.6版本开始,maxUnavailable和maxSurgef的默认值将从1、1更新为 所需副本数量的25%、25%。这样,在升级过程中,Deployment就能够保证服务不中断,并且副本数量始终维持为用户指定的数量(DESIRED)。

三、Deployment回滚

如果在Deployment升级过程中出现意外,比如写错新镜像的名称、新镜像还没被放入镜像仓库里、新镜像的配置文件发生不兼容性改变、新镜像的启动参数不对,以及因可能更复杂的依赖关系而导致升级失败等,就需要回退到之前的旧版本,这时就可以用到Deploymentl的回滚功能了。

1. 回滚方式

我们将Deployment回滚到之前的版本时,只有Deployment的pod模板部分会被修改,在默认情况下,所有Deployment的发布历史记录都被保留在系统中(可以配置历史记录数量),以便于我们随时进行回滚操作。

注意,在创建Deployment时使用-record参数,就可以在CHANGE-CAUSE列看到每个版本使用的命令了,如果需要查看特定版本的详细信息,则可以加上-revision-=参数:

现在我们决定撤销本次发布并回滚到上一个部署版本:

kubectl rollout undo deployment/nginx-deployment deployment "nginx-deployment" rolled back

这样,该Deployment就回滚到之前的稳定版本了,可以从Deployment的事件信息中查看到回滚到版本2的操作过程:

四、其它

1. 暂停和恢复Deployment的部署操作

通过kubectl rollout pause命令暂停Deployment的更新操作:

kubectl rollout pause deployment/nginx-deployment deployment "nginx-deployment" paused

然后修改Deployment的镜像信息:

kubectl set image deploy/nginx-deployment nginx=nginx:1.9.1deployment "nginx-deployment"image updated

查看Deployment的历史记录,发现并没有触发新的Deployment部署操作:

最后,恢复这个Deployment的部署操作:

$ kubectl rollout resume deploy nginx-deployment deployment "nginx-deployment"resumed

可以看到一个新的ReplicaSet被创建出来了:

2.DaemonSet的更新策略

目前DaemonSet的升级策略(updateStrategy)包括两种:

升级策略

描述

OnDelete

DaemonSet的默认升级策略,与1.5及之前版本的Kubernetes保持一致。当使用OnDelete作为升级策略时,在创建好新的DaemonSeti配置之后,新的Pod并不会被自动创建,直到用户手动删除旧版本的Pod,才触发新建操作,即只有手工删除了DaemonSet创建的Pod副本,新的Pod 副本才会被创建出来。如果不设置updateStrategy的值,则在Kubernetes 1.6之后的版本中会被作为updateStrategyl的默认设置

RollingUpdate

从Kubernetes1.6版本开始引入。当使用RollingUpdate作为升级策略对DaemonSeti进行更新时,旧版本的Pod将被自动"杀 掉",然后自动创建新版本的DaemonSet Pod。整个过程与普通Deployment的滚动升级一样是可控的。不过有两点不同于普通Pod的滚动升级:一是目前Kubernetes还不支持查看和管理DaemonSetl的更新历史记录;二是DaemonSet的 回滚(Rollback)并不能如同Deployment一样直接通过kubectl rollback命令来实现,必须通过再次提交旧版本配置的方式实现

下面是DaemonSet采用RollingUpdate升级策略的YAML定义:

apiversion: apps/v1kind: DaemonSetmetadata: name: goldpingerspec:updatestrategy:type: RollingUpdate

3.StatefulSet的更新策略

StatefulSet实现了RollingUpdate、OnDelete和Partitioned这几种策略,以保证StatefulSet中各Pod有序地、逐个地更新,并且能够保留更新历史,也能回滚到某个历史版本(如果用户未设置updateStrategy字段,则系统默认使用RollingUpdate策略):

策略

描述

RollingUpdate

StatefulSet Controller会删除并创建StatefulSet:相关的每个Pod对象,其处理顺序与StatefulSet终止Pod的顺序一致,即从序号最大的Pod开始重建,每次更新一个Pod

OrderedReady

可能在更新过程中发生一些意外,从而导致StatefulSet陷入奔溃状态,此时需要用户手动修 复

OnDelete

StatefulSet Controller并不会自动更新StatefulSet中的Pod实例,而是需要用户手动删除这些Pod并触发StatefulSet Controller创建新的Pod实例来弥补,因此这其实是一种手动升级模式

Partitioned

在这种模式下, 用户指定一个序号,StatefulSet中序号大于等于此序号的Pod实例会全部被升级, 小于此序号的Pod实例则保留旧版本不变,即使这些Pod被删除、重建,也仍然保 持原来的旧版本。这种分区升级策略通常用于按计划分步骤的系统升级过程中。

相关内容

热门资讯

vue基于vant封装可精确到... 前言 在移动开发中,时间选择的控件比比皆是,但却鲜有类似的组件可以精确...
商城县:建设旅游、养老、宜居现... 原标题:立足红绿资源优势建设旅游、养老、宜居现代化县城豫东南,大别山以北,三山环绕,商城县就在峰峦叠...
暴利行业系列:1小时3000,... 她现在经常会变化各种角色,去融入到“第三者”的生活中,这行最难的事是约见“第三者”,一般打十多个电话...
四川首次整体推出农民工及企业家... 7月1日,从省农民工服务中心获悉,我省首次整体端出投资总额达亿元的130个项目,欢迎农民工及企业家返...
AI智能体“潮涌” 大浪淘沙考... 去医院看病,从挂号、咨询、检查、诊断、开处方、康复到随访,整个流程全部由AI智能体(AI Agent...
新基建风起,智慧城市迎机遇:5... 虽然“智慧城市”的概念已经提出了有一段时间,但近年来在AI、物联网、大数据、云计算、5G等新技术的加...
目前的新兴行业 目前的新兴行业... 原标题:新兴行业就业前景看好“互联网+”各大传统行业迎来了重要的发展机遇。就目前而言,互联网行业的需...
2025年“云岭最美科技人”发... 转自:云南日报5月29日,2025年“云岭最美科技人”发布式在昆明举行,我省向社会发布2025年“云...
黑龙江省女大学生创业项目计划书... >>>>>>>>>>更多热图、社会新闻请点击→3岁男童患绝症生命最后时刻说“妈妈不哭”21岁女子与丈...
如何把大学生创业计划书写好? ... 正处于大学的人,除了把课程学好,考取一个好成绩之外,还有什么事情值得大家去挑战呢?可以说创业肯定是一...
年轻人回农村创业做什么好?哪些... 如果你家位于旅游名胜风景区附近,或位于去风景区必经之路,家庭住房宽敞闲置,可考虑开办一家家庭旅店。以...
回乡养殖什么最赚钱?农村小本创... 养殖业什么最赚钱:野兔养殖野兔肉蛋白质比瘦猪肉高出50%,比羊肉高出一倍,脂肪仅为猪肉的1/16、羊...
小行星的“身份证号” 原标题:小行星的“身份证号”◎本报记者 付毅飞每颗小行星被发现时,国际天文学联合会都会给它一个临时编...
C++ | 对比inline内... 文章目录一、前言二、宏的优缺点分析1、概念回顾2、宏的缺点3、宏的优点三、inline内联函数1、概...
【头条评论】船闸收费取消!物流... 据5月26日《人民日报》报道,江苏一口气取消了101座船闸收费,预计每年给跑船的、运货的省下2个亿。...
前4个月上海出口值增长13.8... 转自:光明网  光明日报上海5月29日电(记者孟歆迪)29日,记者在上海海关召开的新闻通气会上了解到...
RuntimeError: T... 问题 今天模型训练,遇到了个bug 先是在dataloder那报了这样一个错 Runt...
关于景顺长城保守养老目标一年持... 为更好地满足广大投资者的理财需求,根据景顺长城基金管理有限公司(以下简称“本公司”)与宁波银行股份有...
端午图里的节俗故事 转自:光明日报    《端阳故事图》之《射粉团》(局部)     (清)徐扬/绘    《端阳故事图...
端午将至 小心雷雨 转自:成都日报锦观端午将至 小心雷雨 本报讯 (成都日报锦观新闻记者 谢夏冬) 端午假期即将...