Kubernetes(九)Deployment滚动更新

article/2025/10/11 12:44:10

小知识点

kubectl  get pods podA -n NAMEAPSCE -o yaml --export如果'不带上--export'  生成文件会有'很多无用的内容'备注: 可以换成'其它系列'的资源注意: 新版本已经'废弃'-->1.18.4有,1.19.3已经废弃了

一    Deployment理解

Deployment 是'Workload'中的一种 --> '无状态应用'滚动更新 --> 理解为'灰度发布一种',只是'粒度'不一样+++++++++++++++滚动更新: 比如我们应用更新了,我们只需要'更新我们的容器镜像',然后修改 Deployment 里面的 'Pod 模板镜像',那么 Deployment 就会用'滚动更新(Rolling Update)'的方式来升级现在的 Pod明确滚动更新'触发的表现形式' --> 'set image'、'path字段'、'修改后直接apply'而 Deployment '这个能力的实现',依赖的' ReplicaSet 这个资源对象',实际上我们可以通俗的理解就是'每个 ReplicaSet' 就对应集群中的'一次部署'

(1)本章节的示例代码

apiVersion: apps/v1
kind: Deployment  
metadata:name:  nginx-deploynamespace: default
spec:replicas: 3  '期望的 Pod 副本数量'selector:  Label Selector,'必须匹配 Pod 模板中的标签'matchLabels:app: nginxtemplate:    'Pod 模板'metadata:labels:app: nginxspec:containers:- name: nginximage: nginxports:- containerPort: 80
+++++++++++++ '重点知识'1)dp通过'控制rs'来'控制pod'2)目前'更新应用'-->通过'镜像版本'来标识3)ds的'名字发生变化'--> 由于'修改template中的属性了'

1)deployment部署,然后查看pod状态 

2)思考ds

结果: 这个 'Pod 的控制器'是一个 ReplicaSet 对象啊,我们'不是创建的一个 Deployment 吗'?为什么 Pod 会'被 RS 所控制呢'?

3)看下这个对应的 RS 对象的详细信息

意思就是我们的'Pod 依赖的控制器'--> 'RS 实际上被我们的 'Deployment 控制着'

4) deployment、replicaset、pod之间的关系

ReplicaSet '明确调整 Pod 的个数',而 Deployment 是通过管理 ReplicaSet 的'数量和属性'来实现'水平扩展/收缩'以及'滚动更新'两个功能的

Deployment

二    滚动更新理解

如果只是'水平扩展/收缩'这两个功能,就完全'没必要设计 Deployment 这个资源对象了',Deployment 最突出的一个功能是'支持滚动更新'说明: ReplicSet也能完成'水平扩展/收缩'

(1)滚动更新的方案

1)Recreate      -->'先删除所有'已存在的pod,'重新创建新的';2)RollingUpdate -->'滚动升级','逐步替换-->灰度替换'的策略,同时滚动升级时,支持更多的'附加参数';例如设置'最大不可用'pod数量,'最小升级间隔'时间等等

(2)Recreate

apiVersion: apps/v1
kind: Deployment
metadata:name:  nginx-deploynamespace: default
spec:replicas: 3  # 期望的 Pod 副本数量,默认值为1selector:  # Label Selector,必须匹配 Pod 模板中的标签matchLabels:app: nginxstrategy:type: Recreate '关注这个字段'template:  # Pod 模板metadata:labels:app: nginxspec:containers:- name: nginximage: nginxports:- containerPort: 80

注意: 滚动更新的时候加上'--record参数',使用此参数将'记录后续创建对象的操作-->记录当时滚动更新的命令',方便'管理'与'问题追溯'备注: 后续我们通过'其它策略'让滚动更新时记录的'CHANGE-CAUSR' -->变得'更有意义'

(3)RollingUpdate

minReadySeconds'含义'当'新的'pod启动'多少秒'后,再kill'掉旧'的pod这里需要估一个'比较合理'的值-->从容器启动到'应用正常提供服务'

     maxSurge: 升级过程中,比目标pod'多出的'pod数量('某个时刻') -->'绝对值和百分比'(默认是25%)maxUnavailable:  最大'不能提供'服务的pod策略:  先创建'maxSurge'个,然后删除'maxUnavailable'个

滚动更新的三种方式

1)修改配置文件 -->最好做'版本控制',每次通过'不同的文件-->不同文件标识不同的配置'或者'相同的文件名-->即使record记录了,但是也毫无意义'2)path修改字段 --> 以'补丁的形式'修改-->'set image'也算是patch中特殊的一种3)set image   --> '直截了当,record看到当前对应更新的原因'

修改yaml文件中的镜像信息准备滚动更新

'3+1+1' -->先创建一个('过程'-->'最大4个pod')-->删除一个(最多一个'不能提供服务')
apiVersion: apps/v1
kind: Deployment
metadata:name:  nginx-deploynamespace: default
spec:replicas: 3  # 期望的 Pod 副本数量,默认值为1selector:  # Label Selector,必须匹配 Pod 模板中的标签matchLabels:app: nginxstrategy:rollingUpdate:maxSurge: 1          '理解含义'  -->'百分比向上取整'maxUnavailable: 1    '理解含义'template:  # Pod 模板metadata:labels:app: nginxspec:containers:- name: nginximage: nginx  '1.18-->latest'ports:- containerPort: 80
~                           

查看滚动更新的过程1) get pods -w          -->'查看过程'2) rollout status       -->'查看详细信息的滚动过程'3) describle deployment -->'看到详细的信息'-->更'推荐'

上面过程: '先启动'一个'新'的 Pod,'杀掉'一个'旧'的 Pod,然后再启动一个新的 Pod,这样滚动更新下去,直到全都变成新的 Pod

思考:如果replicas和images同时改变,如何滚动更新

例如: replica '4-->3'; image  --> 'nginx:1.18 --> nginx:latest'所以 Deployment 控制器首先是将'old-->之前控制'的 nginx-deploy-7848d4b86f 这个 RS 资源对象'先进行缩容'操作,然后'滚动更新'开始了

Deployment RollingUpdate

思考:rs的名称组成

rs名称 = 'deployment名称' + 'yaml文件的哈希数值-->随机字符串'思考:随机字符串'如何生成的'pod名字: 'deployment名字'-'replicaset模板hash名字'-'pod模板hash名字'

需求:暂停过程发现有小问题

滚动更新  '暂停'kubectl rollout 'pause' deployment app备注: '此时的状态' -->混合达到'预期'的数目吗?

需求:发现没有问题,滚动更新继续

kubectl rollout 'resume' deploy app

需求:想查看滚动更新的历史

kubectl rollout history deployment nginx-deployCHANGE CAUSE -->'需要滚动更新的时候加上 --record参数' --> 把'执行的命令记录'下来 --> '上面讲解了记录的方式'思考:如何让'CHANGE CAUSE更有意义' --> kubectl set image deployment/nginx nginx=nginx:1.16 --record形式:  'image' (-f FILENAME | TYPE NAME) 'CONTAINER_NAME_1'=CONTAINER_IMAGE_1 ... CONTAINER_NAME_N=CONTAINER_IMAGE_N

需求:升级发现有大问题,如何回滚到指定版本

回滚'undo'到'指定'版本 --> 类似git的'回退'kubectl 'rollout undo' deployment app --to-revision=1备注: 如果'没有指定'具体版本,默认是'最近的一个历史'版本每次更新应用的时候都会'记录下当前的配置',保存为一个'revision',这样就可以'回滚到某个特定的'revision备注: 'deploy配置'和'revision'是一一对应的简单原理: undo '某个revision' --> 查看对应'rs中匹配的'revision --> 按照'rs模板'创建
备注: 这种'文件形式',可以'多处改动',纳入'git版本控制'更好 --> 通过'yaml文件'的版本控制进行滚动更新注意: record仅仅'一条记录信息(保证意义)',而不是按照'该条指令'去滚动更新 -->例如'文件形式',回滚的时候'当前目录没有这个文件',还是可以'成功的'目的: 让'滚动更新有意义',能够'记录'滚动的版本信息!

(4)revisionHistoryLimit

思考

上面的结果可以看出在执行Deployment升级的时候最好带上record参数,便于查看历史版本信息

默认情况下,所有通过kubectl xxxx --record都会被kubernetes记录到etcd进行持久化,这无疑会占用资源,最重要的是,时间久了,当你kubectl get rs时,会有成百上千的垃圾RS返回给你,那时你可能就眼花缭乱了

生产环境:我们最好通过设置Deployment的.spec.revisionHistoryLimit来限制最大保留的revision number

比如15个版本,回滚的时候一般只会回滚到最近的几个版本就足够了,系统默认是记录最近的10个更新记录,一般10个就不少了

 

++++++++++++  '深层次思考'  ++++++++++++滚动更新的过程'没有完成',又继续进行滚动更新,导致'rollout history'记录的信息不准确'换句话说': 上次滚动更新没有完成,'又进行'滚动更新导致现象: revisionHistoryLimit超过'预设'的数值代码分析原因: 回滚'删除revision与否',是通过'判断rs下面的pod数量是否为0',如果pod不为0,则不会删除该revision+++++++++++++++++++++ '分割线'revisorHIstoryLimit:3 --> 当前rs'没有pod'才会删除做法:没有等到滚动更新完成,又'修改参数'进行滚动更新rs是否能够真正的被删除的'标准' -->'没有副本的时候才可以删除','换句话说'滚动更新的过程中'只能删除没有pod的rs'rollout history 读取的是rs

(5)滚动更新的原理

Deployment

首先: 在前面我们'知道deploy是通过控制rs来控制pod的副本',通过'滚动更新'我们看到'产生了许多rs'

rollout history中'记录的revision个数'都和'ReplicaSets'一一对应

验证:手动delete某个ReplicaSet,对应的rollout history是否会被删除

结论: 一旦'手动删除rs',ectd中就'没有记录了',对应的rollout history中'记录的record会被删除',后续无法'回滚到这个revison了'后续: '本地缓存'是否会影响可以'回滚的原因':rs保存了'当前资源的信息'(-o yaml导出)、只是'这个rs下面没有pod'

后续1:查询etcd中存储的

后续2:直接做滚动更新,导致请求丢失,如何避免0宕机,引出Service


http://chatgpt.dhexx.cn/article/s9iDBw5N.shtml

相关文章

【腾讯Bugly干货分享】Android Patch 方案与持续交付

本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/57a31921ac3a1fb613dd40f3 Android 不仅系统版本众多,机型众多,而且各个市场都各有各的政策和审核速度&#xff…

160多个android开源代码汇总

第一部分 个性化控件(View) 主要介绍那些不错个性化的View,包括ListView、ActionBar、Menu、ViewPager、Gallery、GridView、ImageView、ProgressBar、TextView、ScrollView、TimeView、TipView、FlipView、ColorPickView、GraphView、UI Style等等。 、其他 一、Li…

chenyuntc/simple-faster-r-cnn的代码详细讲解

chenyuntc/simple-faster-r-cnn的代码详细讲解 datadata/voc_dataset.pydata/util.pydata/dataset.py micsconvet_caffe_pretraintrain_fast.py utilsarray_tool.py_config.pyeval_tool.pyvis_tool.py modelutilsnmsbuild_.py_nms_gpu_post_py.pynon_maximum_suppression.py_nm…

android开源代码

Android开源项目--分类汇总 转自:https://github.com/Trinea/android-open-project Android开源项目第一篇——个性化控件(View)篇 包括ListView、ActionBar、Menu、ViewPager、Gallery、GridView、ImageView、ProgressBar、TextView、其他 Android开源项目第二篇—…

Android Studio Flamingo | 2022.2.1 Patch 1(火烈鸟版本)

版本概况 Android Studio Flamingo | 2022.2.1 Patch 1 Build #AI-222.4459.24.2221.9971841, built on April 20, 2023 Runtime version: 17.0.60-b2043.56-9586694 amd64 VM: OpenJDK 64-Bit Server VM by JetBrains s.r.o. Windows 11 10.0 GC: G1 Young Generation, G1 Old…

代码审查 本地测试经验汇总

软件测试虽然辛苦,但是掌握了一定的技巧之后将使你事半功倍。 (1) 边界测试,测试用户输入框中的数值的最大数和最小数,以及为空时的情况。 (2) 非法测试,例如在输入数字的地方输入字…

【Unity】优化UGUI 滚动条ScrollRect(高效复用)

最近忙于性能优化,深切体会到二八法则真是指导高(tou)效(lan)工作的有力武器。这个礼拜花了几天解决了一个实际问题:UGUI的ScrollRect加载太多物体的时候,第一次弹出界面会非常卡顿,而且不在界面里的内容依然会参与绘制(毫无意义的…

vue 切换页面没有改变滚动条_Vue真是太好了 壹万多字的Vue知识点 超详细!

1⃣️、Vue和其他两大框架的区别 Angular 学习成本太高React 代码可读性差Vue 学习成本较低 很容易上手VUE官方: https://cn.vuejs.org/v2/guide/comparison.html ️2⃣️、Vue是什么 Vue是一套用于构建用户界面的渐进式框架 "前端框架"让程序员脱离自己操作DOM 专注…

前端低代码平台腾讯云微搭使用文档

腾讯云微搭 调研报告 之前作者有写过一个同类低代码平台调研报告 H5-Dooring 点击查看,这次我们去尝试使用腾讯系低代码平台,文中也会增加两者之间的差异对比和使用体验上的区别。 1. 简介 1.1 概述 腾讯云微搭低代码是一个高性能的低代码开发平台&a…

Android Patch方案与持续交付

Android 不仅系统版本众多,机型众多,而且各个市场都各有各的政策和审核速度,每次发布一个版本对于开发同学来讲都是一种漫长的煎熬。相比于 iOS 两三天就能达到 80% 的覆盖速度而言,Android 应用版本升级至少需要两周才能达到 80%…

element-ui el-table组件添加height属性后滚动条被顶下去一截

el-table 组件添加了height属性,数据行数超标,出现滚动条; 同时给table中的一列添加了 fixed“right” 这个属性,然后又在项目里自定义了滚动条样式,这个滚动条跟固定列会被挤下去,造成错位的bug。建议去掉…

已解决:element Table 滚动条首次进入不显示、偶尔切换页面后不显示,刷新当前页或改变窗口才显示

记录一下在项目中遇到的问题,困扰了几天最终解决了。 一、问题:element Table 滚动条首次进入不显示、偶尔切换页面后不显示,刷新当前页或改变窗口才显示。 1、首次进入的效果 可以看到滚动条并没有渲染出来,但是刷新页面或者改…

Android Patch 方案与持续交付

Android 不仅系统版本众多,机型众多,而且各个市场都各有各的政策和审核速度,每次发布一个版本对于开发同学来讲都是一种漫长的煎熬。相比于 iOS 两三天就能达到 80% 的覆盖速度而言,Android 应用版本升级至少需要两周才能达到 80%…

js表格冻结列滚动条同步滚动

用div css写的table表格怎么实现冻结某列&#xff0c;同时实现数据滚动条滚动的时候&#xff0c;表头也跟着滚动呢&#xff1f; 效果图&#xff1a; 代码&#xff1a; <!DOCTYPE html> <html> <head><meta charset"utf-8"><style>.f…

损失函数分类

损失函数 机器学习模型关于单个样本的预测值与真实值的差称为损失。损失越小&#xff0c;模型越好&#xff0c;如果预测值与真实值相等&#xff0c;就是没有损失。 损失函数&#xff08;Loss function&#xff09;是用来估量模型的预测值 f(x) 与真实值 Y 的不一致程度&#x…

损失函数总结

1. 概况 损失函数一般分为&#xff1a;0-1 损失函数&#xff0c;HingeLoss&#xff0c;绝对值损失函数&#xff0c;Huber Loss, 平方损失函数&#xff0c;对数损失函数&#xff0c;指数损失。 1. 0-1损失函数(zero-one loss) 0-1损失是指预测值和目标值不相等为1&#xff0…

matlab的损失函数mse,MSELoss损失函数

MSELoss损失函数中文名字就是&#xff1a;均方损失函数&#xff0c;公式如下所示&#xff1a; 这里 loss, x, y 的维度是一样的&#xff0c;可以是向量或者矩阵&#xff0c;i 是下标。 很多的 loss 函数都有 size_average 和 reduce 两个布尔类型的参数。因为一般损失函数都是直…

损失函数Loss Fuction

说说代价函数的作用&#xff1f; 1.为得到训练模型的参数&#xff0c;需要一个代价函数&#xff0c;通过训练代价函数来得到参数。    2.用于找到最优解的目的函数。 说说代价函数为什么要非负&#xff1f; 因为目标函数存在下界&#xff0c;在优化过程当中&#xff0c;如果优…

常用的损失函数

来自 机器学习成长之路公众号 本文将常用的损失函数分为了两大类&#xff1a;分类和回归。然后又分别对这两类进行了细分和讲解&#xff0c;其中回归中包含了一种不太常见的损失函数&#xff1a;平均偏差误差&#xff0c;可以用来确定模型中存在正偏差还是负偏差。 从学习任务…