论坛
潜水/灌水快乐,沉淀知识,认识更多同行。
ToB圈子
加入IT圈,遇到更多同好之人。
朋友圈
看朋友圈动态,了解ToB世界。
ToB门户
了解全球最新的ToB事件
博客
Blog
排行榜
Ranklist
文库
业界最专业的IT文库,上传资料也可以赚钱
下载
分享
Share
导读
Guide
相册
Album
记录
Doing
应用中心
搜索
本版
文章
帖子
ToB圈子
用户
免费入驻
产品入驻
解决方案入驻
公司入驻
案例入驻
登录
·
注册
账号登录
立即注册
找回密码
用户名
Email
自动登录
找回密码
密码
登录
立即注册
首页
找靠谱产品
找解决方案
找靠谱公司
找案例
找对的人
专家智库
悬赏任务
圈子
SAAS
qidao123.com技术社区-IT企服评测·应用市场
»
论坛
›
容器及微服务
›
容器及微服务
›
K8s进阶之Deployment的更新&回滚
K8s进阶之Deployment的更新&回滚
老婆出轨
论坛元老
|
7 天前
|
显示全部楼层
|
阅读模式
楼主
主题
1945
|
帖子
1945
|
积分
5835
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要
登录
才可以下载或查看,没有账号?
立即注册
x
更新概述
更新指的是对 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
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
继续阅读请点击广告
回复
使用道具
举报
0 个回复
倒序浏览
返回列表
快速回复
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
or
立即注册
本版积分规则
发表回复
回帖并转播
回帖后跳转到最后一页
发新帖
回复
老婆出轨
论坛元老
这个人很懒什么都没写!
楼主热帖
1000套安卓(Android)毕业设计(带论 ...
【Linux学习】网络基础 和 SOCKET套接 ...
在工作中离屏真的不重要吗,代码优化就 ...
设计模式必知必会系列终章
牛客SQL刷题第三趴——SQL大厂面试真题 ...
记一次线上问题 → Deadlock 的分析与 ...
Git + Jenkins 自动化 NGINX 发布简易 ...
MySQL完整版详解
亚马逊云科技Build On-Amazon Neptune ...
SRC基础抓包
标签云
国产数据库
集成商
AI
运维
CIO
存储
服务器
快速回复
返回顶部
返回列表