K8s进阶之Deployment的更新&回滚
更新概述
更新指的是对 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-name>
命令查看 Deployment 的更新历史,每个更新都会有一个对应的版本号(Revision)。回滚到上一个版本:使用
kubectl rollout undo deployment <deployment-name>
命令将 Deployment 回滚到上一个稳定版本。回滚到指定版本:使用
kubectl rollout undo deployment <deployment-name> --to-revision=<revision-number>
命令将 Deployment 回滚到指定的版本号。验证回滚结果:使用
kubectl rollout status <deployment-name>
命令查看回滚后的状态,确保回滚操作成功。
回滚示例
以上面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的更新&回滚的更多相关文章
- kubernetes deployment升级和回滚
a.创建deployment pod kubectl run mynginx --image=docker.io/nginx: --record 准备svc文件 apiVersion: v1 kind ...
- docker swarm实现java项目的发布/滚动更新/回滚/镜像管理
使用docker swarm滚动更新java项目,部署集群,这一切的前提是使用Jenkins+maven进行项目打包,分发等功能 具体可以参考我的另外三篇文章 https://www.cnblogs. ...
- k8s deployment 金丝雀发布 更新的 暂停 恢复 回滚
假设现在有业务需求,计划将所有的nginx 从镜像版本1.14更新到1.15,这一次发布不紧需要平滑发布,还需要 金丝雀发布,及确认其中一个Pod没有问题后在进行剩余的更新. 暂停与恢复也可以使用ym ...
- 回滚Deployment控制器下的应⽤发布
若因各种原因导致滚动更新⽆法正常进⾏,如镜像⽂件获取失败."⾦丝雀"遇险等,则应该将应⽤回滚到之前的版本,或者回滚到由⽤户指定的历史记录中的版本. Deployment控制器的回滚 ...
- linux运维、架构之路-K8s滚动更新及回滚
一.滚动更新 应用程序一次只更新一小部分副本,更新成功后,再更新更多的副本,最终完成所有副本的更新. 滚动更新的优点:零停机,整个更新过程始终有副本在运行,从而保证了业务的连续性. 1. ...
- k8s-控制器deployment弹性扩容,更新镜像,回滚,DaemonSet,StatufluSet
目录 1.控制器deployment,DaemonSet,StatufluSet 2.控制器-deployment 弹性扩容 方式1-修改配置清单 方式2-打标签 方式3-scale 更新镜像 方式1 ...
- deployment控制pod进行滚动更新以及回滚
更新pod镜像两种方式: 方式一:kubectl set image deployment/${deployment name} ${container name}=${image} 例: kubec ...
- 浅入Kubernetes(12):Deployment 的升级、回滚
目录 更新 上线 会滚 缩放 Deployment 直接设置 Pod 水平自动缩放 比例缩放 暂停 Deployment 上线 本篇内容讨论 Pod 的更新和回滚,内容不多. 更新 打开 https: ...
- 9.2 k8s结合Jenkins与gitlab实现代码升级与回滚
1.部署Jenkins 1.1 安装jdk # apt 安装jdk11 apt install openjdk-11-jdk # 查看 root@jenkins:~# java -version op ...
- Docker Kubernetes 容器更新与回滚
Docker Kubernetes 容器更新与回滚 环境: 系统:Centos 7.4 x64 Docker版本:18.09.0 Kubernetes版本:v1.8 管理节点:192.168.1.79 ...
随机推荐
- Luogu P11036 GCD 与 LCM 问题 [ 绿 ] [ 构造 ] [ 数论 ] [ adhoc ]
Luogu P11036 GCD 与 LCM 问题:梦熊的题真是又神又逆天. 思路 观察到有个奇数的特殊性质,我们尝试从奇数构造入手. 先来尝试带入极端数据,对于 \(\gcd\),我们可以把 \(b ...
- Linux驱动---LED
目录 一.pinctrl子系统 二.GPIO子系统 三.GPIO操作步骤 3.1.获取GPIO描述符 3.2.设置方向 3.3.读写值 四.编写LED驱动 4.1.硬件原理图 4.2.修改设备树 4. ...
- [THUSC2015] 异或运算 题解
学到新思路了:求解 \(k\) 大值时,可以将所有元素放一块一起跑. 考虑到 \(n,q\) 奇小无匹,我们便可以制造一个 \(O(qn\log V)\) 的代码. 那么对于我们不想在时间复杂度中出现 ...
- intellij debug模式提示 Method breakpoints may dramatically slow down debugging 解决办法
直接上图........ 点击图中按钮 或者 快捷键(Ctrl - Shift -F8 ) 出现下图
- css的度量单位:px、em、rem、vh、vw、vmin、vmax、百分比
css的度量单位 px,像素数量,适用于比较固定的场景,比如边框宽度,分割线宽度 em em:是描述相对于应用在当前元素的字体尺寸,所以它也是相对长度单位.一般浏览器字体大小默认为16px,则2em ...
- Azkaban的job从创建到执行
单一 job Step1: 创建 job 描述文件 xxx.job: job 的描述文件 type = command command = echo 'hello, this is my firs ...
- c++经典卡常
1.展开函数 如下代码: void lowbit(int x) { return x&(-x); } signed main() { cout << lowbit(12345); ...
- pytest 框架使用规则
使用pytest 注意 有时候常常会调用时文件未执行,就是没注意命名规范 如何调用-命令行调用 pytest 批量运行测试用例 单个用例调试成功后,接下来我们要进行所有脚本统一执行 我要执行testc ...
- 【Unit3】社交系统模拟(JML规格化设计)-作业总结
第三单元作业难度在OO课程中当属最低.原因在于最复杂多变(贻害无穷)的设计环节被作业接口和JML规格描述限定,我们不再需要考虑整体的构架(抽象出那些类,设置哪些方法等),唯一的能动性仅在具体实现和复杂 ...
- 鸿蒙开发 HarmonyOS DevEco Studio 常用快捷键
前言 做 HarmonyOS 鸿蒙开发离不开 DevEco Studio 开发工具, DevEco Studio 是基于 IntelliJ IDEA Community 开源版本打造,所以默认的快捷键 ...