最新要闻
- 信息:邹城旅游景点有哪些_邹城旅游
- 花旦是什么意思饭圈 花旦是什么意思_环球热头条
- 完全自游四川一本就GO
- 香港财政司司长:全力拼经济、谋发展
- 微动态丨天龙八部私服取消打怪验证(天龙八部sf情缘辅助)
- 环球速讯:电脑ip怎么看
- 全球快资讯丨京东消暑商品销量暴增 手动刨冰机成交额同比增超200%
- 全球最新:我们的生活充满阳光原唱(送给喜欢的你)
- 环球焦点!仲量联行:经济复苏和通关带动下 香港甲级写字楼空置情况好转
- 天天日报丨大棚养殖林蛙年赚百万(创新养殖模式让林蛙成为绿色食品)
- “九莲”跨锦江 四川首个多场景莲叶造型慢行桥主桥合龙 今日热搜
- 中马传动:公司产品没有应用于机器人 微头条
- 环球热资讯!公司装修费用计入哪里(公司装修费用计入什么科目)
- 外卖小哥骑车摔倒被雨棚刺脖身亡:擅自加装极其危险 北京已禁止_当前热议
- 【全球速看料】女孩考上清华:家人放烟花前向邻居报备 收到满满祝福
- 希捷发布首款PCIe 5.0 SSD:残血10GB/s但写不死!1TB只需1300元 天天即时
手机
消息称谷歌眼镜项目终止,将专注开发“AR 版安卓”平台
怎样开通微信服务_怎样开通飞信|观热点
- 消息称谷歌眼镜项目终止,将专注开发“AR 版安卓”平台
- 怎样开通微信服务_怎样开通飞信|观热点
- 每日速读!七七事变爆发于哪一年_1937年34
- 重点聚焦!怎么避免盲目跑步怎么注意跑步的节律
- 环球精选!something用于什么句(something的用法)
- 热门看点:海拔4600米,这里有群“追光者”
家电
k8s 深入篇———— 编排[八]_全球播资讯
前言
简单整理一下编排。
(相关资料图)
正文
一个deployment 例子:
apiVersion: apps/v1kind: Deploymentmetadata: name: nginx-deploymentspec: selector: matchLabels: app: nginx replicas: 2 template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.7.9 ports: - containerPort: 80
然后看下结果:
出现了两个pod。
这个 Deployment 定义的编排动作非常简单,即:确保携带了 app=nginx 标签的 Pod 的个数,永远等于 spec.replicas 指定的个数,即 2 个。
这就意味着,如果在这个集群中,携带 app=nginx 标签的 Pod 的个数大于 2 的时候,就会有旧的 Pod 被删除;反之,就会有新的 Pod 被创建。
究竟是 Kubernetes 项目中的哪个组件,在执行这些操作呢?
我在前面介绍 Kubernetes 架构的时候,曾经提到过一个叫作 kube-controller-manager 的组件。
实际上,这个组件,就是一系列控制器的集合。我们可以查看一下 Kubernetes 项目的 pkg/controller 目录:
这个目录下面的每一个控制器,都以独有的方式负责某种编排功能。而我们的 Deployment,正是这些控制器中的一种。
实际上,这些控制器之所以被统一放在 pkg/controller 目录下,就是因为它们都遵循 Kubernetes 项目中的一个通用编排模式,即:控制循环(control loop)。
比如,现在有一种待编排的对象 X,它有一个对应的控制器。那么,我就可以用一段 Go 语言风格的伪代码,为你描述这个控制循环:
for { 实际状态 := 获取集群中对象 X 的实际状态(Actual State) 期望状态 := 获取集群中对象 X 的期望状态(Desired State) if 实际状态 == 期望状态{ 什么都不做 } else { 执行编排动作,将实际状态调整为期望状态 }}
在具体实现中,实际状态往往来自于 Kubernetes 集群本身。
比如,kubelet 通过心跳汇报的容器状态和节点状态,或者监控系统中保存的应用监控数据,或者控制器主动收集的它自己感兴趣的信息,这些都是常见的实际状态的来源。
而期望状态,一般来自于用户提交的 YAML 文件。
比如,Deployment 对象中 Replicas 字段的值。很明显,这些信息往往都保存在 Etcd 中。
接下来,以 Deployment 为例,我和你简单描述一下它对控制器模型的实现:
Deployment 控制器从 Etcd 中获取到所有携带了“app: nginx”标签的 Pod,然后统计它们的数量,这就是实际状态;
Deployment 对象的 Replicas 字段的值就是期望状态;
Deployment 控制器将两个状态做比较,然后根据比较结果,确定是创建 Pod,还是删除
这个操作,通常被叫作调谐(Reconcile)。这个调谐的过程,则被称作“Reconcile Loop”(调谐循环)或者“Sync Loop”(同步循环)。
其中,这个控制器对象本身,负责定义被管理对象的期望状态。比如,Deployment 里的 replicas=2 这个字段。
而被控制对象的定义,则来自于一个“模板”。比如,Deployment 里的 template 字段。
可以看到,Deployment 这个 template 字段里的内容,跟一个标准的 Pod 对象的 API 定义,丝毫不差。而所有被这个 Deployment 管理的 Pod 实例,其实都是根据这个 template 字段的内容创建出来的。
像 Deployment 定义的 template 字段,在 Kubernetes 项目中有一个专有的名字,叫作 PodTemplate(Pod 模板)。
这就是为什么,在所有 API 对象的 Metadata 里,都有一个字段叫作 ownerReference,用于保存当前这个 API 对象的拥有者(Owner)的信息。
水平扩展
现在我们知道了,Deployment 可以控制pod。
那么是不是deployment 直接控制了pod呢? 是不是pod 直接向deployment 汇报呢?
答案是不是,中间还有一个replicaset。
apiVersion: apps/v1kind: ReplicaSetmetadata: name: nginx-set labels: app: nginxspec: replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.7.9
创建一个replicaset。
创建一个replicaset,里面指定了个数是3个,
从这个 YAML 文件中,我们可以看到,一个 ReplicaSet 对象,其实就是由副本数目的定义和一个 Pod 模板组成的。不难发现,它的定义其实是 Deployment 的一个子集。
更重要的是,Deployment 控制器实际操纵的,正是这样的 ReplicaSet 对象,而不是 Pod 对象。
再来看上面这个例子:
apiVersion: apps/v1kind: Deploymentmetadata: name: nginx-deployment labels: app: nginxspec: replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.7.9 ports: - containerPort: 80
可以看到,这就是一个我们常用的 nginx-deployment,它定义的 Pod 副本个数是 3(spec.replicas=3)。
那么,在具体的实现上,这个 Deployment,与 ReplicaSet,以及 Pod 的关系是怎样的呢?
我们可以用一张图把它描述出来:
通过这张图,我们就很清楚的看到,一个定义了 replicas=3 的 Deployment,与它的 ReplicaSet,以及 Pod 的关系,实际上是一种“层层控制”的关系。
其中,ReplicaSet 负责通过“控制器模式”,保证系统中 Pod 的个数永远等于指定的个数(比如,3 个)。这也正是 Deployment 只允许容器的 restartPolicy=Always 的主要原因:只有在容器能保证自己始终是 Running 状态的前提下,ReplicaSet 调整 Pod 的个数才有意义。
而在此基础上,Deployment 同样通过“控制器模式”,来操作 ReplicaSet 的个数和属性,进而实现“水平扩展 / 收缩”和“滚动更新”这两个编排动作。
其中,“水平扩展 / 收缩”非常容易实现,Deployment Controller 只需要修改它所控制的 ReplicaSet 的 Pod 副本个数就可以了。
比如,把这个值从 3 改成 4,那么 Deployment 所对应的 ReplicaSet,就会根据修改后的值自动创建一个新的 Pod。这就是“水平扩展”了;“水平收缩”则反之。
而用户想要执行这个操作的指令也非常简单,就是 kubectl scale,比如:
kubectl scale deployment nginx-deployment --replicas=4
DESIRED:用户期望的 Pod 副本个数(spec.replicas 的值);
CURRENT:当前处于 Running 状态的 Pod 的个数;
UP-TO-DATE:当前处于最新版本的 Pod 的个数,所谓最新版本指的是 Pod 的 Spec 部分与 Deployment 里 Pod 模板里定义的完全一致;
AVAILABLE:当前已经可用的 Pod 的个数,即:既是 Running 状态,又是最新版本,并且已经处于 Ready(健康检查正确)状态的 Pod 的个数。
可以看到,只有这个 AVAILABLE 字段,描述的才是用户所期望的最终状态。
而 Kubernetes 项目还为我们提供了一条指令,让我们可以实时查看 Deployment 对象的状态变化。这个指令就是 kubectl rollout status.
如上所示,在用户提交了一个 Deployment 对象后,Deployment Controller 就会立即创建一个 Pod 副本个数为 3 的 ReplicaSet。这个 ReplicaSet 的名字,则是由 Deployment 的名字和一个随机字符串共同组成。
这个随机字符串叫作 pod-template-hash,在我们这个例子里就是:3167673210。ReplicaSet 会把这个随机字符串加在它所控制的所有 Pod 的标签里,从而保证这些 Pod 不会与集群里的其他 Pod 混淆。
而 ReplicaSet 的 DESIRED、CURRENT 和 READY 字段的含义,和 Deployment 中是一致的。所以,相比之下,Deployment 只是在 ReplicaSet 的基础上,添加了 UP-TO-DATE 这个跟版本有关的状态字段。
这个时候,如果我们修改了 Deployment 的 Pod 模板,“滚动更新”就会被自动触发。
修改 Deployment 有很多方法。比如,我可以直接使用 kubectl edit 指令编辑 Etcd 里的 API 对象。
我们可以直接修改:
kubectl edit deployment/nginx-deployment
这个 kubectl edit 指令,会帮你直接打开 nginx-deployment 的 API 对象。然后,你就可以修改这里的 Pod 模板部分了。比如,在这里,我将 nginx 镜像的版本升级到了 1.9.1。
备注:kubectl edit 并不神秘,它不过是把 API 对象的内容下载到了本地文件,让你修改完成后再提交上去。
kubectl edit 指令编辑完成后,保存退出,Kubernetes 就会立刻触发“滚动更新”的过程。你还可以通过 kubectl rollout status 指令查看 nginx-deployment 的状态变化:
出现了两个rs。
其中,旧 ReplicaSet已经被“水平收缩”成了 0 个副本, 怎么看它是旧的呢? 看age 时间。
这时,你可以通过查看 Deployment 的 Events,看到这个“滚动更新”的流程:
这种“滚动更新”的好处是显而易见的。
比如,在升级刚开始的时候,集群里只有 1 个新版本的 Pod。如果这时,新版本 Pod 有问题启动不起来,那么“滚动更新”就会停止,从而允许开发和运维人员介入。而在这个过程中,由于应用本身还有两个旧版本的 Pod 在线,所以服务并不会受到太大的影响。
当然,这也就要求你一定要使用 Pod 的 Health Check 机制检查应用的运行状态,而不是简单地依赖于容器的 Running 状态。要不然的话,虽然容器已经变成 Running 了,但服务很有可能尚未启动,“滚动更新”的效果也就达不到了。
而为了进一步保证服务的连续性,Deployment Controller 还会确保,在任何时间窗口内,只有指定比例的 Pod 处于离线状态。同时,它也会确保,在任何时间窗口内,只有指定比例的新 Pod 被创建出来。这两个比例的值都是可以配置的,默认都是 DESIRED 值的 25%。
所以,在上面这个 Deployment 的例子中,它有 3 个 Pod 副本,那么控制器在“滚动更新”的过程中永远都会确保至少有 2 个 Pod 处于可用状态,至多只有 4 个 Pod 同时存在于集群中。这个策略,是 Deployment 对象的一个字段,名叫 RollingUpdateStrategy,如下所示:
apiVersion: apps/v1kind: Deploymentmetadata: name: nginx-deployment labels: app: nginxspec:... strategy: type: RollingUpdate rollingUpdate: maxSurge: 1 maxUnavailable: 1
在上面这个 RollingUpdateStrategy 的配置中,maxSurge 指定的是除了 DESIRED 数量之外,在一次“滚动”中,Deployment 控制器还可以创建多少个新 Pod;而 maxUnavailable 指的是,在一次“滚动”中,Deployment 控制器可以删除多少个旧 Pod。
同时,这两个配置还可以用前面我们介绍的百分比形式来表示,比如:maxUnavailable=50%,指的是我们最多可以一次删除“50%*DESIRED 数量”个 Pod。
如上所示,Deployment 的控制器,实际上控制的是 ReplicaSet 的数目,以及每个 ReplicaSet 的属性。
而一个应用的版本,对应的正是一个 ReplicaSet;这个版本应用的 Pod 数量,则由 ReplicaSet 通过它自己的控制器(ReplicaSet Controller)来保证。
通过这样的多个 ReplicaSet 对象,Kubernetes 项目就实现了对多个“应用版本”的描述。
而明白了“应用版本和 ReplicaSet 一一对应”的设计思想之后,我就可以为你讲解一下Deployment 对应用进行版本控制的具体原理了。
这一次,我会使用一个叫kubectl set image的指令,直接修改 nginx-deployment 所使用的镜像。这个命令的好处就是,你可以不用像 kubectl edit 那样需要打开编辑器。
不过这一次,我把这个镜像名字修改成为了一个错误的名字,比如:nginx:1.91。这样,这个 Deployment 就会出现一个升级失败的版本。
通过这个返回结果,我们可以看到,新版本的 ReplicaSet(hash=2156724341)的“水平扩展”已经停止。而且此时,它已经创建了两个 Pod,但是它们都没有进入 READY 状态。这当然是因为这两个 Pod 都拉取不到有效的镜像。
与此同时,旧版本的 ReplicaSet 的“水平收缩”,也自动停止了。此时,已经有一个旧 Pod 被删除,还剩下3个旧 Pod。
那么怎么回滚呢?
这样就回到了4个。
很容易想到,在具体操作上,Deployment 的控制器,其实就是让这个旧 ReplicaSet(hash=1764197365)再次“扩展”成 4 个 Pod,而让新的 ReplicaSet(hash=2156724341)重新“收缩”到 0 个 Pod。
首先,我需要使用 kubectl rollout history 命令,查看每次 Deployment 变更对应的版本。
当然,你还可以通过这个 kubectl rollout history 指令,看到每个版本对应的 Deployment 的 API 对象的细节,具体命令如下所示:
kubectl rollout undo deployment/nginx-deployment --to-revision=2
这样,Deployment Controller 还会按照“滚动更新”的方式,完成对 Deployment 的降级操作。
不过,你可能已经想到了一个问题:我们对 Deployment 进行的每一次更新操作,都会生成一个新的 ReplicaSet 对象,是不是有些多余,甚至浪费资源呢?
没错。
所以,Kubernetes 项目还提供了一个指令,使得我们对 Deployment 的多次更新操作,最后 只生成一个 ReplicaSet。
具体的做法是,在更新 Deployment 前,你要先执行一条 kubectl rollout pause 指令。它的用法如下所示:
kubectl rollout pause deployment/nginx-deployment
这个 kubectl rollout pause 的作用,是让这个 Deployment 进入了一个“暂停”状态。
所以接下来,你就可以随意使用 kubectl edit 或者 kubectl set image 指令,修改这个 Deployment 的内容了。
由于此时 Deployment 正处于“暂停”状态,所以我们对 Deployment 的所有修改,都不会触发新的“滚动更新”,也不会创建新的 ReplicaSet。
而等到我们对 Deployment 修改操作都完成之后,只需要再执行一条 kubectl rollout resume 指令,就可以把这个 Deployment“恢复”回来,如下所示:
kubectl rollout resume deploy/nginx-deployment
而在这个 kubectl rollout resume 指令执行之前,在 kubectl rollout pause 指令之后的这段时间里,我们对 Deployment 进行的所有修改,最后只会触发一次“滚动更新”。
当然,我们可以通过检查 ReplicaSet 状态的变化,来验证一下 kubectl rollout pause 和 kubectl rollout resume 指令的执行效果,如下所示:
不过,即使你像上面这样小心翼翼地控制了 ReplicaSet 的生成数量,随着应用版本的不断增加,Kubernetes 中还是会为同一个 Deployment 保存很多很多不同的 ReplicaSet。
那么,我们又该如何控制这些“历史”ReplicaSet 的数量呢?
很简单,Deployment 对象有一个字段,叫作 spec.revisionHistoryLimit,就是 Kubernetes 为 Deployment 保留的“历史版本”个数。所以,如果把它设置为 0,你就再也不能做回滚操作了。
结
下一节容器化守护进程 DaemonSet.
关键词:
k8s 深入篇———— 编排[八]_全球播资讯
全球报道:使用评价指标工具
wiki 搭建-世界新消息
消息称谷歌眼镜项目终止,将专注开发“AR 版安卓”平台
万里汇:1-6月中国卖家海外开店申请量同比增长125.88%-焦点资讯
全球视点!男篮U19小组赛收官战:力拼西班牙凶多吉少,16强大概率碰面美国
《蓝精灵2:绿石之囚》11/2推出 新预告片公布 环球热文
深圳楼市:这些房产流通性很差,谨慎下手! 世界热门
天天热资讯!摩米士宣布为苹果头显开发外接电池
分享好吃美食!这些软件可以分享自己的快乐_热点评
信息:邹城旅游景点有哪些_邹城旅游
建研院:股东拟减持公司不超1.24%股份
环球信息:第12批援巴布亚新几内亚中国医疗队获当地政府表彰
画里有话丨守耕地红线 促节约集约 全球新视野
花旦是什么意思饭圈 花旦是什么意思_环球热头条
铁矿石龙虎榜 | 日内资金流入逾19亿元 多空双方均呈进场态势 天天看热讯
湖北利川:打好宣传“组合拳” 筑牢禁毒“防护墙”|报资讯
韩国博主变身中国城市形象宣传大使:“促进中韩友谊是我的使命”
全球速递!普京签字后,日本提出交涉
印江成功办理首笔“带押过户业务|世界热文
天天滚动:Walk in the City| Welcome to Guiyang, welcome home 一巷一味:贵阳是一座城,更是一个家
【全球新视野】毕节市老干部活动中心开展端午节送温暖慰问活动
头条:北京市工商局官网登录app_北京工商局网上登记申请平台
完全计价法|世界实时
完全自游四川一本就GO
小米汽车路试被拍照 大V感叹神似保时捷|环球实时
拦截失败,6倍声速导弹灌顶爆炸,乌军指挥员和美军顾问惨遭掩埋
天天新动态:“太难抢了”!大额存单3%被抢光?5%的一年期保本存款,不香吗?
环球动态:三亚发布促进文旅消费50条措施 高标准建设消费商圈
巴西总统卢拉:将与阿根廷寻求“更大程度上的金融一体化” 焦点讯息
LG在越南海防工厂增资超10亿美元|全球要闻
世界热推荐:品酒的正确步骤有哪些,雷盛红酒给您的品酒建议
怎样开通微信服务_怎样开通飞信|观热点
香港财政司司长:全力拼经济、谋发展
每日速读!七七事变爆发于哪一年_1937年34
湖南青马在线答案_湖南青马
【世界新要闻】河北择路企业管理咨询有限公司
环球头条:丰渡内衣_丰丰内衣
全球即时:定魂剑(关于定魂剑介绍)
重点聚焦!怎么避免盲目跑步怎么注意跑步的节律
90后“破烂女孩”,为何被百万网友羡慕:她真的有在活成自己?
河内萨默塞特格兰德酒店
观察:为什么我的qq总是闪退_为什么我的QQ老是闪退啊
挠脚心视频绑起来脱袜子_挠脚心视频可儿受刑 全球播资讯
环球快报:蓝正龙周幼婷穿情侣装骑车去离婚?经纪人回应
环球精选!something用于什么句(something的用法)
联合资信:将“19国厚01”的信用等级由AA+调低至AA|天天微速讯
热门:折900返利_折900
焦点消息!英国目前的抵押贷款利率是多少
阿根廷男篮主教练是普里吉奥尼_普里吉奥尼
热门看点:海拔4600米,这里有群“追光者”
总台记者观察丨“和平”基金不利和平 欧盟再向乌拨军费
“发现海口之美”摄影大赛采风行活动第三批摄影大咖开启海口寻美之旅
全球热文:企业用电申请书范文排版(企业用电申请书范文)
华海药业(600521.SH):盐酸艾司洛尔注射液获得《药品注册证书》
天猫分期购怎么开通(天猫分期购) 世界快播
天风证券:新房市场本周成交 410 万平,月度同比-29.33%
今日聚焦!五笔字根表口诀(五笔词根)
五尺床的被套尺寸_世界滚动
浙江的电价,降得下来吗?-全球播资讯
上市不到一年 海正生材财务总监张本胜辞职
健康人生 绿色无毒
今日热文:TCL推出第二代Tab 10平板电脑:配备10.36英寸屏幕,支持4G网络
2023西宁河湟文化旅游艺术节开幕
高考考场内只有一名考生!她的成绩出来了
民生添益8号年内跌23.33%_焦点
A股公告精选 | 特斯拉概念股上半年业绩预增超39% 交控科技(688015.SH)董事长被留置|天天快看
国家金融监督管理总局:今年以来银行业持续加大对重点领域和薄弱环节支持力度
【天天聚看点】安徽省东至县市场监管局“局长走流程”服务经营主体
环球即时:29岁网红遭家暴致死,夫家背景强
天天最新:同程旅行发布《2023暑期出行前瞻报告》
世界即时看!学会忍住心痒,戒掉嫉妒,管好欲望,收起炫耀
天天动态:聚和材料:6月21日任益超减持公司股份合计5920股
微动态丨天龙八部私服取消打怪验证(天龙八部sf情缘辅助)
各早稻主产区多举措积极应对“三碰头”农业气象灾害-全球速讯
不发朋友圈,不代表高级 当前头条
为什么不建议购买理财保险 看看这篇 环球微头条
依托青山绿水走上致富路——高原藏族村落扎毛村的振兴之变 当前焦点
万字拆解|天猫抖音618榜单:5大行业,10个洞察|全球新动态
中暑都有哪些症状?如何防范中暑?专家解答→-环球最资讯
淘宝被冻结怎么解_淘宝被冻结如何解冻
qq拉黑的好友怎么才能找回来呢_qq拉黑的好友怎么恢复
神奇特技(关于神奇特技介绍) 世界速递
焦点消息!平昌县岳家小学:“小小红色宣讲员”讲述红军故事
印度小伙:没想到中国发展这么好|世界简讯
2023郑州大学生免费坐地铁刚毕业可以吗
当前热讯:2023郑州大学生免费坐地铁审核需要多久
迪士尼公主COS恐怖片人物,木兰致敬周星驰,贝儿模仿榆树街
上海新增2家4A级景区(附游玩指南)
当前播报:广东2023年普通高等学校特殊类型招生专业目录
焦点日报:计算机行业资金流出榜:浪潮信息等5股净流出资金超亿元
今日视点:中国三大运营商加入全球Open Gateway倡议
比亚迪在武汉成立销售新公司
世界快报:iPhone“车祸检测”误报率翻五倍,苹果噱头功能终于露馅了
环球快播:闯大祸了 瓦格纳捅落“空中指挥所”,“高级将领或已遇难”
180倍票挑战奖池失败!大乐透23072期号码集中小号区,头奖仅3注
《彩虹六号》异种和围攻区别介绍
北京我爱我家中介 爱友家房产中介|全球今头条
网络游戏上市公司龙头有哪些?(2023/6/26)|天天快报
任天堂回应Switch后继机型质疑:仍在为突破未知领域而探讨 播报