登录
/
注册
首页
论坛
其它
首页
科技
业界
安全
程序
广播
Follow
关于
每日签到
每天签到奖励2圆-6圆
发帖说明
VIP申请
登录
/
注册
账号
自动登录
找回密码
密码
登录
立即注册
搜索
搜索
关闭
CSDN热搜
程序园
精品问答
技术交流
资源下载
本版
帖子
用户
软件
问答
教程
代码
写记录
写博客
VIP申请
VIP网盘
网盘
联系我们
每日签到
道具
勋章
任务
设置
我的收藏
退出
腾讯QQ
微信登录
返回列表
首页
›
业界区
›
业界
›
K8s进阶之Deployment的更新&回滚
K8s进阶之Deployment的更新&回滚
[ 复制链接 ]
嗳诿
2025-6-2 23:09:57
更新概述
更新指的是对 Deployment 所管理应用的配置、镜像版本等进行修改并应用到集群中的过程。通过更新 Deployment,你能够实现应用功能的升级、修复漏洞、调整资源分配等操作。
更新触发条件
镜像版本变更:当需要更新应用的功能或修复已知问题时,通常会使用新的镜像版本。例如,从 nginx:1.14.2 更新到nginx:1.16.1。
配置参数修改:调整应用的环境变量、资源请求与限制等配置信息。比如,增加容器的内存限制。
Pod 模板变更:对 Pod 模板中的标签、注解等元数据进行修改。
Deployment的更新策略
滚动更新(RollingUpdate)
这是 Deployment 的默认更新策略,能够实现零停机更新。它通过逐步替换 Pod 来完成更新,始终保持一定数量的 Pod 在运行,从而确保服务在整个更新过程中都可用。
RollingUpdate工作原理
创建新的 ReplicaSet,使用新的 Pod 模板。
逐步减少旧 ReplicaSet 的 Pod 数量,同时增加新 ReplicaSet 的 Pod 数量。
每个新 Pod 创建后,只有通过健康检查(Readiness Probe)后,才会将旧 Pod 终止。
实现方式
通过定义strategy字段来实现,而strategy字段下有两个核心字段:
maxUnavailable:定义在更新过程中,允许不可用的 Pod 的最大数量或百分比。默认值为 25%。
maxSurge:定义在更新过程中,允许创建的超过期望副本数的 Pod 的最大数量或百分比。默认值为 25%。
重新创建(Recreate)
这种策略会先删除所有旧的 Pod,然后一次性创建所有新的 Pod。更新期间服务会有短暂不可用,因此适用于开发环境或可以容忍短暂中断的场景
Deployment之滚动更新(RollingUpdate)实现
这是 Deployment 的默认更新策略,能够实现零停机更新。它通过逐步替换 Pod 来完成更新,始终保持一定数量的 Pod 在运行,从而确保服务在整个更新过程中都可用。
定义一个旧版本应用
首先创建一个Depoyment,定义Pod的镜像为nginx:1.14.1,然后将nginx的镜像版本升级为nginx:1.16.1
## 定义资源文件
[root@master01 ~/deploy]# cat deploy-nginx.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: deployment-nginx
namespace: default
spec:
# 定义更新策略
strategy:
# 指定类型为RollingUpdate(滚动更新)
type: RollingUpdate
# 当更新策略类型为RollingUpdate时,才会定义该字段,否则会报错
rollingUpdate:
# 定义创建的超过期望副本数的 Pod 的最大数量,这里设置为3,表示最大会创建13个Pod数量
maxSurge: 3
# 定义允许不可用的 Pod 的最大数量,这里设置为2,表示最大不可用的Pod数量为2
maxUnavailable: 2
replicas: 10
selector:
matchLabels:
app: nginx
template:
metadata:
name: pod-nginx
labels:
app: nginx
spec:
containers:
- name: container-nginx
image: nginx:1.14.1
restartPolicy: Always
# 创建deploy
[root@master01 ~/deploy]# kubectl apply -f deploy-nginx.yaml
deployment.apps/deployment-nginx created
# 查看对应的资源创建情况
[root@master01 ~/deploy]# kubectl get deploy
NAME READY UP-TO-DATE AVAILABLE AGE
deployment-nginx 10/10 10 10 6s
[root@master01 ~/deploy]# kubectl get rs
NAME DESIRED CURRENT READY AGE
deployment-nginx-6d84458cd8 10 10 10 11s
[root@master01 ~/deploy]# kubectl get po | grep deploy
deployment-nginx-6d84458cd8-2km57 1/1 Running 0 18s
deployment-nginx-6d84458cd8-dqtsf 1/1 Running 0 18s
deployment-nginx-6d84458cd8-dtsx7 1/1 Running 0 18s
deployment-nginx-6d84458cd8-fr5zg 1/1 Running 0 18s
deployment-nginx-6d84458cd8-hcxz4 1/1 Running 0 18s
deployment-nginx-6d84458cd8-jm68h 1/1 Running 0 18s
deployment-nginx-6d84458cd8-nt8zw 1/1 Running 0 18s
deployment-nginx-6d84458cd8-pjkmd 1/1 Running 0 18s
deployment-nginx-6d84458cd8-tvxxh 1/1 Running 0 18s
deployment-nginx-6d84458cd8-x7vls 1/1 Running 0 18s
复制代码
更新至新版本应用
触发更新Deployment有两种方式:
通过kubectl set来触发(不推荐)
语法:
kubectl set image <type-name> <container-name>=<image:tag>
参数说明:
type-name:指定类型的名称,对应的metadata中的name字段,例如deployment/deploy-nginx
container-name:容器名称,对应的是containers的name字段,例如nginx
image:tag:表示要更新的镜像及版本
复制代码
示例:
kubectl set image deployment/deploy-nginx container-nginx=nginx:1.16.1
复制代码
通过修改资源配置文件来触发(推荐)
我们这里修改其资源配置文件来触发
# 修改配置文件
[root@master01 ~/deploy]# cat deploy-nginx.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: deployment-nginx
namespace: default
spec:
# 定义更新策略
strategy:
# 指定类型为RollingUpdate(滚动更新)
type: RollingUpdate
# 当更新策略类型为RollingUpdate时,才会定义该字段,否则会报错
rollingUpdate:
# 定义创建的超过期望副本数的 Pod 的最大数量,这里设置为3,表示最大会创建13个Pod数量
maxSurge: 3
# 定义允许不可用的 Pod 的最大数量,这里设置为2,表示最大不可用的Pod数量为2
maxUnavailable: 2
replicas: 10
selector:
matchLabels:
app: nginx
template:
metadata:
name: pod-nginx
labels:
app: nginx
spec:
containers:
- name: container-nginx
# 更新镜像版本为1.16.1
image: nginx:1.16.1
restartPolicy: Always
# 重新应用它
[root@master01 ~/deploy]# kubectl apply -f deploy-nginx.yaml
deployment.apps/deployment-nginx configured
复制代码
查看一下Pod及ReplicaSet的变化
查看Pod的变化
# 第一次查看Pod,发现一共有13个Pod。
# 其中超出预期值为3个,我们定义的副本数量为10,maxSurge的值为3
# 其中可用的Pod数量为8个(也就是不可用的Pod数量为2个,对应的maxUnavailable设置)
# 通过AGE字段发现,旧版本的Pod依旧存在
[root@master01 ~/deploy]# kubectl get po | grep deploy
NAME READY STATUS RESTARTS AGE
deployment-nginx-6d84458cd8-2km57 1/1 Running 0 17m
deployment-nginx-6d84458cd8-dqtsf 1/1 Running 0 17m
deployment-nginx-6d84458cd8-fr5zg 1/1 Running 0 17m
deployment-nginx-6d84458cd8-hcxz4 1/1 Running 0 17m
deployment-nginx-6d84458cd8-jm68h 1/1 Running 0 17m
deployment-nginx-6d84458cd8-pjkmd 1/1 Running 0 17m
deployment-nginx-6d84458cd8-tvxxh 1/1 Running 0 17m
deployment-nginx-6d84458cd8-x7vls 1/1 Running 0 17m
deployment-nginx-d8898b99d-5pxt8 0/1 ContainerCreating 0 7s
deployment-nginx-d8898b99d-7z4pf 0/1 ContainerCreating 0 7s
deployment-nginx-d8898b99d-gttz8 0/1 ContainerCreating 0 7s
deployment-nginx-d8898b99d-j55fp 0/1 ContainerCreating 0 7s
deployment-nginx-d8898b99d-jfpdt 0/1 ContainerCreating 0 7s
# 最终查看Pod,发现Pod的最终数量为10,且全部更新成功(通过AGE字段查看)
[root@master01 ~/deploy]# kubectl get po | grep deploy
NAME READY STATUS RESTARTS AGE
deployment-nginx-d8898b99d-2szcx 1/1 Running 0 18s
deployment-nginx-d8898b99d-5pxt8 1/1 Running 0 37s
deployment-nginx-d8898b99d-7k44g 1/1 Running 0 17s
deployment-nginx-d8898b99d-7z4pf 1/1 Running 0 37s
deployment-nginx-d8898b99d-gttz8 1/1 Running 0 37s
deployment-nginx-d8898b99d-j55fp 1/1 Running 0 37s
deployment-nginx-d8898b99d-jfpdt 1/1 Running 0 37s
deployment-nginx-d8898b99d-kdf7x 1/1 Running 0 16s
deployment-nginx-d8898b99d-lvpsw 1/1 Running 0 19s
deployment-nginx-d8898b99d-zfxkf 1/1 Running 0 15s
复制代码
查看ReplicaSet的变化:
# 发现有两个rs资源,其中deployment-nginx-6d84458cd8是旧版本的rs,它的副本数量为0
# deployment-nginx-d8898b99d是新版本的rs,它的副本数量为10,就这可以验证deploy滚动更新是基于rs来实现的
[root@master01 ~/deploy]# kubectl get rs
NAME DESIRED CURRENT READY AGE
deployment-nginx-6d84458cd8 0 0 0 25m
deployment-nginx-d8898b99d 10 10 10 8m46s
复制代码
Deployment之重新创建(Recreate)实现
这种策略会先删除所有旧的 Pod,然后一次性创建所有新的 Pod。更新期间服务会有短暂不可用,因此适用于开发环境或可以容忍短暂中断的场景
定义一个旧版本应用
首先创建一个Depoyment,定义Pod的镜像为tomcat:8.0,然后将tomcat的镜像版本升级为tomcat:9.0
## 定义资源文件
[root@master01 ~/deploy]# cat deploy-tomcat.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: deployment-tomcat
namespace: default
spec:
# 定义更新策略
strategy:
# 指定类型为Recreate(重新创建)
type: Recreate
replicas: 10
selector:
matchLabels:
app: tomcat
template:
metadata:
name: pod-tomcat
labels:
app: tomcat
spec:
containers:
- name: container-tomcat
image: tomcat:8.0
restartPolicy: Always
# 应用它:
[root@master01 ~/deploy]# kubectl apply -f deploy-tomcat.yaml
deployment.apps/deployment-tomcat created
复制代码
查看pod
[root@master01 ~/deploy]# kubectl get po
NAME READY STATUS RESTARTS AGE
deployment-tomcat-85c65466c5-7vsms 1/1 Running 0 84s
deployment-tomcat-85c65466c5-bh9v9 1/1 Running 0 84s
deployment-tomcat-85c65466c5-bvhs9 1/1 Running 0 84s
deployment-tomcat-85c65466c5-czdsb 1/1 Running 0 84s
deployment-tomcat-85c65466c5-glq5m 1/1 Running 0 84s
deployment-tomcat-85c65466c5-k6xk7 1/1 Running 0 84s
deployment-tomcat-85c65466c5-mw8wz 1/1 Running 0 84s
deployment-tomcat-85c65466c5-tqtzb 1/1 Running 0 84s
deployment-tomcat-85c65466c5-wftgj 1/1 Running 0 84s
deployment-tomcat-85c65466c5-xxv2p 1/1 Running 0 84s
复制代码
更新至新版本应用
修改资源配置文件
[root@master01 ~/deploy]# cat deploy-tomcat.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: deployment-tomcat
namespace: default
spec:
# 定义更新策略
strategy:
# 指定类型为Recreate(重新创建)
type: Recreate
replicas: 10
selector:
matchLabels:
app: tomcat
template:
metadata:
name: pod-tomcat
labels:
app: tomcat
spec:
containers:
- name: container-tomcat
# 镜像版本更新至9.0
image: tomcat:9.0
restartPolicy: Always
# 重新应用资源文件
[root@master01 ~/deploy]# kubectl apply -f deploy-tomcat.yaml
deployment.apps/deployment-tomcat configured
复制代码
查看ReplicaSet及Pod的变化
查看Pod
# 发现Pod全部处于ContainerCreating的状态,且没有一个处于Ready,验证了Recreate是将Pod全部删除然后重新创建
[root@master01 ~/deploy]# kubectl get po
NAME READY STATUS RESTARTS AGE
deployment-tomcat-7ddf96c4d8-4dcmh 0/1 ContainerCreating 0 6s
deployment-tomcat-7ddf96c4d8-4w8dd 0/1 ContainerCreating 0 6s
deployment-tomcat-7ddf96c4d8-8z95r 0/1 ContainerCreating 0 6s
deployment-tomcat-7ddf96c4d8-9dgph 0/1 ContainerCreating 0 6s
deployment-tomcat-7ddf96c4d8-9wgr4 0/1 ContainerCreating 0 6s
deployment-tomcat-7ddf96c4d8-kt7nw 0/1 ContainerCreating 0 6s
deployment-tomcat-7ddf96c4d8-lrgfm 0/1 ContainerCreating 0 6s
deployment-tomcat-7ddf96c4d8-mpmb9 0/1 ContainerCreating 0 6s
deployment-tomcat-7ddf96c4d8-vvbtb 0/1 ContainerCreating 0 6s
deployment-tomcat-7ddf96c4d8-w8knq 0/1 ContainerCreating 0 6s
复制代码
查看ReplicaSet
[root@master01 ~/deploy]# kubectl get rs
NAME DESIRED CURRENT READY AGE
deployment-tomcat-7ddf96c4d8 10 10 10 27s
deployment-tomcat-85c65466c5 0 0 0 4m
复制代码
回滚概述
回滚是指在更新过程中出现问题(如应用崩溃、功能异常等)时,将 Deployment 恢复到之前某个稳定版本的操作。Kubernetes 会记录 Deployment 的每次更新历史,方便你随时回滚到指定版本。
回滚也可以理解成Deployment的更新,回滚也会按照我们资源配置文件中相关的配置来进行更新Pod。
回滚操作
查看更新历史:使用 kubectl rollout history deployment 命令查看 Deployment 的更新历史,每个更新都会有一个对应的版本号(Revision)。
回滚到上一个版本:使用 kubectl rollout undo deployment 命令将 Deployment 回滚到上一个稳定版本。
回滚到指定版本:使用 kubectl rollout undo deployment --to-revision= 命令将 Deployment 回滚到指定的版本号。
验证回滚结果:使用 kubectl rollout status 命令查看回滚后的状态,确保回滚操作成功。
回滚示例
以上面Tomcat的为例,将版本回滚至8.0
查看要回滚的Deployment
[root@master01 ~/deploy]# kubectl get deploy
NAME READY UP-TO-DATE AVAILABLE AGE
deployment-tomcat 10/10 10 10 9m46s
复制代码
查看历史版本
在 kubectl rollout history 命令的输出里,版本号越大就代表是越新的版本
[root@master01 ~/deploy]# kubectl rollout history deploy/deployment-tomcat
deployment.apps/deployment-tomcat
#版本 #变更的原因
REVISION CHANGE-CAUSE
1 <none> #旧版本
2 <none> #新版本
复制代码
回滚到指定的版本
[root@master01 ~/deploy]# kubectl rollout undo deployment deployment-tomcat --to-revision=1
deployment.apps/deployment-tomcat rolled back
复制代码
查看回滚的结果
[root@master01 ~/deploy]# kubectl rollout status deploy deployment-tomcat
deployment "deployment-tomcat" successfully rolled out
复制代码
查看Pod
[root@master01 ~/deploy]# kubectl get po
NAME READY STATUS RESTARTS AGE
deployment-tomcat-85c65466c5-5xbcn 1/1 Running 0 42s
deployment-tomcat-85c65466c5-7tb56 1/1 Running 0 42s
deployment-tomcat-85c65466c5-dpklc 1/1 Running 0 42s
deployment-tomcat-85c65466c5-k8sd6 1/1 Running 0 42s
deployment-tomcat-85c65466c5-m5kqt 1/1 Running 0 42s
deployment-tomcat-85c65466c5-rlvrz 1/1 Running 0 42s
deployment-tomcat-85c65466c5-szczs 1/1 Running 0 42s
deployment-tomcat-85c65466c5-vt89t 1/1 Running 0 42s
deployment-tomcat-85c65466c5-xrct9 1/1 Running 0 42s
deployment-tomcat-85c65466c5-xtpt6 1/1 Running 0 42s
复制代码
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
K8s
进阶
Deployment
更新
amp
相关帖子
面试防坑场景(持续更新中)
【LeetCode 114】算法进阶:二叉树展开为链表
StarBlog v1.3.0 新版本,一大波更新以及迁移服务器部署
新的协议bind20,后续更新在微博,有效帮助程序员
多项式入门到进阶超详解
Go 1.25 标准库更新
炼丹心得&调参技巧
我一个写Java的,怎么就开始玩K8s和Jenkins了?!
k9s监控k8s集群工具
高铁采集2404更新zb35破解版采集
vip免费申请,1年只需15美金$
回复
使用道具
举报
提升卡
置顶卡
沉默卡
喧嚣卡
变色卡
千斤顶
照妖镜
相关推荐
安全
面试防坑场景(持续更新中)
0
792
遑盲
2025-08-13
科技
【LeetCode 114】算法进阶:二叉树展开为链表
0
691
辖瑁地
2025-08-15
业界
StarBlog v1.3.0 新版本,一大波更新以及迁移服务器部署
0
585
溧久苟
2025-08-19
安全
新的协议bind20,后续更新在微博,有效帮助程序员
0
714
诈知
2025-08-20
安全
多项式入门到进阶超详解
0
556
马璞玉
2025-08-22
安全
Go 1.25 标准库更新
0
336
嗦或
2025-08-25
科技
炼丹心得&调参技巧
0
921
章海
2025-09-02
业界
我一个写Java的,怎么就开始玩K8s和Jenkins了?!
0
585
役魅肋
2025-09-04
业界
k9s监控k8s集群工具
0
567
庞悦
2025-09-04
软件
高铁采集2404更新zb35破解版采集
0
3
新程序
2025-09-11
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
立即注册
回复
本版积分规则
回帖并转播
回帖后跳转到最后一页
签约作者
程序园优秀签约作者
发帖
嗳诿
2025-6-2 23:09:57
关注
0
粉丝关注
15
主题发布
板块介绍填写区域,请于后台编辑
财富榜{圆}
敖可
9984
杭环
9988
凶契帽
9988
4
氛疵
9988
5
黎瑞芝
9988
6
猷咎
9986
7
里豳朝
9986
8
肿圬后
9986
9
蝓俟佐
9984
10
虽裘侪
9984
查看更多