最新要闻
- 毕业季,科学城幼儿园大班萌娃用画笔勾勒未来|当前热文
- 辽宁:全链条打击证券犯罪 去年以来追赃挽损7.14亿余元
- 上海电气印度业务被诈骗88亿 反被索赔21亿?官方辟谣-环球微头条
- 腾讯回应数百人部门解散:正常架构调整 不涉及人员优化 每日聚焦
- iPhone上市开售16周年:共38款机型 售价越来越贵_独家焦点
- 全国首位视障播音硕士毕业:键盘盲打完成6万字论文 9年读了百本盲书-天天热门
- 不惯着!女子人肉占车位撒泼打滚:结局舒适-世界要闻
- 我市举行天然气应急救援演练|世界快看点
- 7月见!华为大动作不断:将发布新款存储 面向AI大模型 世界观焦点
- 凯迪拉克格局打开!赞助节目中允许宣传理想L9 还邀请李想体验新车-天天即时
- 辣眼睛!男子鞋底塞112张《塞尔达传说:王国之泪》卡带入境被查|天天新消息
- 每日热点:董丽娜,毕业快乐!
- cad什么版本最好用_cad那个版本比较好用
- 对标苹果Studio Display!三星首款5K显示器开售:9999元还送1T SSD
- 网飞版《三体》预告播放破千万 粉丝喊话别拍砸了:国内拍技术落后?_环球新资讯
- ChatGPT假装奶奶哄睡:能免费生成Win系统激活码
手机
光庭信息跌4.57% 2021上市超募11亿2022扣非降74% 时快讯
搜狐汽车全球快讯 | 大众汽车最新专利曝光:仪表支持拆卸 可用手机、平板替代-环球关注
- 光庭信息跌4.57% 2021上市超募11亿2022扣非降74% 时快讯
- 搜狐汽车全球快讯 | 大众汽车最新专利曝光:仪表支持拆卸 可用手机、平板替代-环球关注
- 视点!美国首位女总统即将诞生?拜登恐怕要提前下岗,美政坛迎来变局?
- 当前速递!用理想仪器实现更好的颗粒 德国新帕泰克亮相CPHI & PMEC China获好评
- 微粒贷怎么申请开通 开通方法如下
- 焦点简讯:心疼!这位40岁的云南缉毒警,已是满头白发
家电
天天新资讯:k8s 深入篇———— 守护容器[九]
前言
守护容器,也叫做deamonset, 只做整理
【资料图】
正文
顾名思义,DaemonSet 的主要作用,是让你在 Kubernetes 集群里,运行一个 Daemon Pod。 所以,这个 Pod 有如下三个特征:
这个 Pod 运行在 Kubernetes 集群里的每一个节点(Node)上;
每个节点上只有一个这样的 Pod 实例;
当有新的节点加入 Kubernetes 集群后,该 Pod 会自动地在新节点上被创建出来;而当旧节点被删除后,它上面的 Pod 也相应地会被回收掉。
这个机制听起来很简单,但 Daemon Pod 的意义确实是非常重要的。我随便给你列举几个例子:
各种网络插件的 Agent 组件,都必须运行在每一个节点上,用来处理这个节点上的容器网络;
各种存储插件的 Agent 组件,也必须运行在每一个节点上,用来在这个节点上挂载远程存储目录,操作容器的 Volume 目录;
各种监控组件和日志组件,也必须运行在每一个节点上,负责这个节点上的监控信息和日志搜集。
更重要的是,跟其他编排对象不一样,DaemonSet 开始运行的时机,很多时候比整个 Kubernetes 集群出现的时机都要早。
这个乍一听起来可能有点儿奇怪。但其实你来想一下:如果这个 DaemonSet 正是一个网络插件的 Agent 组件呢?
这个时候,整个 Kubernetes 集群里还没有可用的容器网络,所有 Worker 节点的状态都是 NotReady(NetworkReady=false)。这种情况下,普通的 Pod 肯定不能运行在这个集群上。所以,这也就意味着 DaemonSet 的设计,必须要有某种“过人之处”才行。
为了弄清楚 DaemonSet 的工作原理,我们还是按照老规矩,先从它的 API 对象的定义说起。
apiVersion: apps/v1kind: DaemonSetmetadata: name: fluentd-elasticsearch namespace: kube-system labels: k8s-app: fluentd-loggingspec: selector: matchLabels: name: fluentd-elasticsearch template: metadata: labels: name: fluentd-elasticsearch spec: tolerations: - key: node-role.kubernetes.io/master effect: NoSchedule containers: - name: fluentd-elasticsearch image: k8s.gcr.io/fluentd-elasticsearch:1.20 resources: limits: memory: 200Mi requests: cpu: 100m memory: 200Mi volumeMounts: - name: varlog mountPath: /var/log - name: varlibdockercontainers mountPath: /var/lib/docker/containers readOnly: true terminationGracePeriodSeconds: 30 volumes: - name: varlog hostPath: path: /var/log - name: varlibdockercontainers hostPath: path: /var/lib/docker/containers
这个 DaemonSet,管理的是一个 fluentd-elasticsearch 镜像的 Pod。这个镜像的功能非常实用:通过 fluentd 将 Docker 容器里的日志转发到 ElasticSearch 中。
可以看到,DaemonSet 跟 Deployment 其实非常相似,只不过是没有 replicas 字段;它也使用 selector 选择管理所有携带了 name=fluentd-elasticsearch 标签的 Pod。
而这些 Pod 的模板,也是用 template 字段定义的。在这个字段中,我们定义了一个使用 fluentd-elasticsearch:1.20 镜像的容器,而且这个容器挂载了两个 hostPath 类型的 Volume,分别对应宿主机的 /var/log 目录和 /var/lib/docker/containers 目录。
显然,fluentd 启动之后,它会从这两个目录里搜集日志信息,并转发给 ElasticSearch 保存。这样,我们通过 ElasticSearch 就可以很方便地检索这些日志了。
需要注意的是,Docker 容器里应用的日志,默认会保存在宿主机的 /var/lib/docker/containers/{{. 容器 ID}}/{{. 容器 ID}}-json.log 文件里,所以这个目录正是 fluentd 的搜集目标。
那么,DaemonSet 又是如何保证每个 Node 上有且只有一个被管理的 Pod 呢?
显然,这是一个典型的“控制器模型”能够处理的问题。
DaemonSet Controller,首先从 Etcd 里获取所有的 Node 列表,然后遍历所有的 Node。这时,它就可以很容易地去检查,当前这个 Node 上是不是有一个携带了 name=fluentd-elasticsearch 标签的 Pod 在运行。
而检查的结果,可能有这么三种情况:
没有这种 Pod,那么就意味着要在这个 Node 上创建这样一个 Pod;
有这种 Pod,但是数量大于 1,那就说明要把多余的 Pod 从这个 Node 上删除掉;
正好只有一个这种 Pod,那说明这个节点是正常的。
其中,删除节点(Node)上多余的 Pod 非常简单,直接调用 Kubernetes API 就可以了。
但是,如何在指定的 Node 上创建新 Pod 呢?
如果你已经熟悉了 Pod API 对象的话,那一定可以立刻说出答案:用 nodeSelector,选择 Node 的名字即可。
nodeSelector: name:
没错。
不过,在 Kubernetes 项目里,nodeSelector 其实已经是一个将要被废弃的字段了。因为,现在有了一个新的、功能更完善的字段可以代替它,即:nodeAffinity。我来举个例子:
apiVersion: v1kind: Podmetadata: name: with-node-affinityspec: affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: metadata.name operator: In values: - node-geektime
在这个 Pod 里,我声明了一个 spec.affinity 字段,然后定义了一个 nodeAffinity。其中,spec.affinity 字段,是 Pod 里跟调度相关的一个字段。关于它的完整内容,我会在讲解调度策略的时候再详细阐述。
而在这里,我定义的 nodeAffinity 的含义是:
requiredDuringSchedulingIgnoredDuringExecution:它的意思是说,这个 nodeAffinity 必须在每次调度的时候予以考虑。同时,这也意味着你可以设置在某些情况下不考虑这个 nodeAffinity;
这个 Pod,将来只允许运行在“metadata.name”是“node-geektime”的节点上。
所以,我们的 DaemonSet Controller 会在创建 Pod 的时候,自动在这个 Pod 的 API 对象里,加上这样一个 nodeAffinity 定义。其中,需要绑定的节点名字,正是当前正在遍历的这个 Node。
此外,DaemonSet 还会给这个 Pod 自动加上另外一个与调度相关的字段,叫作 tolerations。这个字段意味着这个 Pod,会“容忍”(Toleration)某些 Node 的“污点”(Taint)。
而 DaemonSet 自动加上的 tolerations 字段,格式如下所示:
apiVersion: v1kind: Podmetadata: name: with-tolerationspec: tolerations: - key: node.kubernetes.io/unschedulable operator: Exists effect: NoSchedule
这个 Toleration 的含义是:“容忍”所有被标记为 unschedulable“污点”的 Node;“容忍”的效果是允许调度。
而在正常情况下,被标记了 unschedulable“污点”的 Node,是不会有任何 Pod 被调度上去的(effect: NoSchedule)。可是,DaemonSet 自动地给被管理的 Pod 加上了这个特殊的 Toleration,就使得这些 Pod 可以忽略这个限制,继而保证每个节点上都会被调度一个 Pod。当然,如果这个节点有故障的话,这个 Pod 可能会启动失败,而 DaemonSet 则会始终尝试下去,直到 Pod 启动成功。
假如当前 DaemonSet 管理的,是一个网络插件的 Agent Pod,那么你就必须在这个 DaemonSet 的 YAML 文件里,给它的 Pod 模板加上一个能够“容忍”node.kubernetes.io/network-unavailable“污点”的 Toleration。正如下面这个例子所示:
template: metadata: labels: name: network-plugin-agent spec: tolerations: - key: node.kubernetes.io/network-unavailable operator: Exists effect: NoSchedule
在 Kubernetes 项目中,当一个节点的网络插件尚未安装时,这个节点就会被自动加上名为node.kubernetes.io/network-unavailable的“污点”。
而通过这样一个 Toleration,调度器在调度这个 Pod 的时候,就会忽略当前节点上的“污点”,从而成功地将网络插件的 Agent 组件调度到这台机器上启动起来。
这种机制,正是我们在部署 Kubernetes 集群的时候,能够先部署 Kubernetes 本身、再部署网络插件的根本原因:因为当时我们所创建的 Weave 的 YAML,实际上就是一个 DaemonSet。
至此,通过上面这些内容,你应该能够明白,DaemonSet 其实是一个非常简单的控制器。在它的控制循环中,只需要遍历所有节点,然后根据节点上是否有被管理 Pod 的情况,来决定是否要创建或者删除一个 Pod。
只不过,在创建每个 Pod 的时候,DaemonSet 会自动给这个 Pod 加上一个 nodeAffinity,从而保证这个 Pod 只会在指定节点上启动。同时,它还会自动给这个 Pod 加上一个 Toleration,从而忽略节点的 unschedulable“污点”。
当然,你也可以在 Pod 模板里加上更多种类的 Toleration,从而利用 DaemonSet 实现自己的目的。比如,在这个 fluentd-elasticsearch DaemonSet 里,我就给它加上了这样的 Toleration:
tolerations:- key: node-role.kubernetes.io/master effect: NoSchedule
这是因为在默认情况下,Kubernetes 集群不允许用户在 Master 节点部署 Pod。因为,Master 节点默认携带了一个叫作node-role.kubernetes.io/master的“污点”。所以,为了能在 Master 节点上部署 DaemonSet 的 Pod,我就必须让这个 Pod“容忍”这个“污点”。
kubectl create -f fluentd-elasticsearch.yaml
创建一下。
需要注意的是,在 DaemonSet 上,我们一般都应该加上 resources 字段,来限制它的 CPU 和内存使用,防止它占用过多的宿主机资源。
而创建成功后,你就能看到,如果有 N 个节点,就会有 N 个 fluentd-elasticsearch Pod 在运行。比如在我们的例子里,会有1个 Pod,如下所示:
因为我只弄了一个主节点
而如果你此时通过 kubectl get 查看一下 Kubernetes 集群里的 DaemonSet 对象:
就会发现 DaemonSet 和 Deployment 一样,也有 DESIRED、CURRENT 等多个状态字段。这也就意味着,DaemonSet 可以像 Deployment 那样,进行版本管理。这个版本,可以使用 kubectl rollout history 看到:
kubectl rollout history daemonset fluentd-elasticsearch -n kube-system
在 Kubernetes 项目中,任何你觉得需要记录下来的状态,都可以被用 API 对象的方式实现。当然,“版本”也不例外。
Kubernetes v1.7 之后添加了一个 API 对象,名叫ControllerRevision,专门用来记录某种 Controller 对象的版本。比如,你可以通过如下命令查看 fluentd-elasticsearch 对应的 ControllerRevision:
kubectl describe controllerrevision fluentd-elasticsearch-64dc6799c9 -n kube-system
就会看到,这个 ControllerRevision 对象,实际上是在 Data 字段保存了该版本对应的完整的 DaemonSet 的 API 对象。并且,在 Annotation 字段保存了创建这个对象所使用的 kubectl 命令。
接下来,我们可以尝试将这个 DaemonSet 回滚到 Revision=1 时的状态:
kubectl rollout undo daemonset fluentd-elasticsearch --to-revision=1 -n kube-system
这个 kubectl rollout undo 操作,实际上相当于读取到了 Revision=1 的 ControllerRevision 对象保存的 Data 字段。而这个 Data 字段里保存的信息,就是 Revision=1 时这个 DaemonSet 的完整 API 对象。
所以,现在 DaemonSet Controller 就可以使用这个历史 API 对象,对现有的 DaemonSet 做一次 PATCH 操作(等价于执行一次 kubectl apply -f “旧的 DaemonSet 对象”),从而把这个 DaemonSet“更新”到一个旧版本。
这也是为什么,在执行完这次回滚完成后,你会发现,DaemonSet 的 Revision 并不会从 Revision=2 退回到 1,而是会增加成 Revision=3。这是因为,一个新的 ControllerRevision 被创建了出来。
ControllerRevision 和 ReplicaSet 是 Kubernetes 中的两个概念,它们之间有以下区别:1. 功能:ControllerRevision 是一个记录控制器版本的资源对象,用于实现有状态应用程序的滚动更新。ReplicaSet 是一个控制器,用于管理 Pod 副本的创建、删除和扩缩容。2. 对象类型:ControllerRevision 是一个自定义资源定义(Custom Resource Definition,CRD)对象,用于记录控制器的版本信息。ReplicaSet 是 Kubernetes 内置的资源对象,用于定义 Pod 副本集。3. 控制器类型:ControllerRevision 用于有状态应用程序的滚动更新,例如 StatefulSet 控制器。ReplicaSet 用于无状态应用程序的副本管理,例如 Deployment 控制器。4. 更新方式:ControllerRevision 通过记录每个版本的控制器模板和副本数来实现有状态应用程序的滚动更新。ReplicaSet 通过指定 Pod 模板和副本数量来创建和管理 Pod 副本。5. 生命周期:ControllerRevision 的生命周期与控制器的滚动更新策略有关,它会记录每次控制器模板的变化。ReplicaSet 的生命周期与 Pod 副本集的创建和删除有关,它会根据副本数量的变化来创建或删除 Pod。总的来说,ControllerRevision 是一个记录控制器版本的资源对象,用于实现有状态应用程序的滚动更新,而 ReplicaSet 是一个控制器,用于管理 Pod 副本的创建、删除和扩缩容。
结
下一节job 和 cronjob。
关键词:
天天新资讯:k8s 深入篇———— 守护容器[九]
Spring Boot 项目设计业务操作日志功能,写得太好了!-世界即时看
毕业季,科学城幼儿园大班萌娃用画笔勾勒未来|当前热文
辽宁:全链条打击证券犯罪 去年以来追赃挽损7.14亿余元
上海电气印度业务被诈骗88亿 反被索赔21亿?官方辟谣-环球微头条
腾讯回应数百人部门解散:正常架构调整 不涉及人员优化 每日聚焦
iPhone上市开售16周年:共38款机型 售价越来越贵_独家焦点
全国首位视障播音硕士毕业:键盘盲打完成6万字论文 9年读了百本盲书-天天热门
不惯着!女子人肉占车位撒泼打滚:结局舒适-世界要闻
一次日志配置未生效问题排查记录
linux把文件压缩成.tar.gz的命令&各个压缩解压命令大全--九五小庞
MFC中使用多线程
希望所有计算机专业学生都知道这门课-世界速看
我市举行天然气应急救援演练|世界快看点
7月见!华为大动作不断:将发布新款存储 面向AI大模型 世界观焦点
凯迪拉克格局打开!赞助节目中允许宣传理想L9 还邀请李想体验新车-天天即时
辣眼睛!男子鞋底塞112张《塞尔达传说:王国之泪》卡带入境被查|天天新消息
每日热点:董丽娜,毕业快乐!
环球快播:Linux-vs-MacOS-,你更喜欢哪个系统?
世界热点评!【读财报】一季度信用卡消费者投诉透视:监管处理信用卡业务投诉超3.2万件 工商银行被投诉总量高
cad什么版本最好用_cad那个版本比较好用
对标苹果Studio Display!三星首款5K显示器开售:9999元还送1T SSD
网飞版《三体》预告播放破千万 粉丝喊话别拍砸了:国内拍技术落后?_环球新资讯
ChatGPT假装奶奶哄睡:能免费生成Win系统激活码
热讯:“泡面神器”彻底凉凉!亚马逊Kindle中国电子书店明日停运
SSD等存储要拉开涨价序幕了:有厂商财报明确!
读发布!设计与部署稳定的分布式系统(第2版)笔记15_快速失败和替换 焦点日报
“泰坦”号潜水器残骸中发现“疑似人类遗骸”-天天报道
印度狂买俄罗斯石油:买的多到转手倒卖给欧美
全球热推荐:中超卧龙凤雏诞生!任航被高畠勉培养成武士了!谢晖一语杀人诛心
pta题目集6-8_当前动态
为什么不应该给用户提示错误码-每日观察
21、MyBatis动态<if>标签的使用详解 当前快报
Blazor如何跟随“系统主题”? 环球快资讯
再次认识using 天天报资讯
黄仁勋:NVIDIA的AI产品 已经给客户打1折了_今日看点
RTX 4070换装暴力涡轮风扇 卖到6999元!瞬间降温21℃
秘鲁山谷惊现1500米长的神秘孔带:至今不知道是做什么的-全球观天下
4年亏损近30亿:美特斯邦威以3亿元出售房产自救
短讯!48GB DDR5-8200!芝奇超高频、大容量内存新增白色
热点聚焦:快餐帝国(01843.HK)年度纯利184.3万坡元 同比减少34.83%
影响43万亿美元交易!追踪美联储决策的一大利器即将消亡
阿邦拉霍:红军不能将萨拉赫卖给沙特球队,没有他球队进不了前六|全球聚看点
北方地区将继续受到40℃高温炙烤 温度远远赶超“四大火炉”
影片《消失的她》票房突破11亿元 累计2635万人观影
影帝梁朝伟迎来61岁生日 妻子刘嘉玲晒照为其庆生
《原神》枫丹地区大量内容遭泄露 米哈游将依法追究相关主体法律责任
湖南株洲一小学生暑假作业贴满免作业券 引发网友围观
环球快看:在Linux下如何使用JNI
焦点热门:python: BytesIO 中 read 用法
数码宝贝重启_数码宝贝dw6 0
全球通讯!苹果极力宣传的Apple Watch车祸检测功能频繁闹乌龙!让人头大
国外一飞机尴尬着陆:画面犹如“狗啃泥”
下月开始:Win11要强制更新了
古筝来历小故事_古筝来历
部署zabbix5.0以及使用 全球微头条
天天微速讯:Python教程(1)——python环境的下载与安装
每日焦点!郑少秋女儿辛酸成长史:8个月父亲出轨8岁患上三高,半生缺爱
【天天报资讯】有人坐吗?高级动卧票价一站8分钟420元 跟二等座差价70倍:12306回应
焦点消息!4520元贵妇级护肤品复刻版卖47元:相似度能达到99.99%
nethttp和gin 路由
文心一言 VS 讯飞星火 VS chatgpt (50)-- 算法导论6.2 2题-简讯
Golang 简单的数据对齐可提高程序速度和内存使用率_环球新消息
【前沿】尺寸接近米13!大厂新机渲染图出炉 白色打几分?|全球关注
最便宜4系来了!宝马发布i4 eDriver35四门纯电轿跑:大降4万
今日视点:胃癌几乎都是吃出来的:钟爱烧烤、熏制食物的朋友要注意
女孩用“免作业券”不写暑假作业 网友点赞:凭实力不写-要闻速递
每日聚焦:三星Galaxy S23 FE外观曝光:后置长焦三摄、边角圆润
差评第一!景区摆渡车不能兜来绕去只为钱
【Java】使用 fasterxml.jackson 进行反序列化以及部分注意事项
微动态丨可观测性是什么? 入门指南
WPF MVVM之点滴分享
Donaukit用户创建
【财经分析】东北地区国资国企改革深化推进 或迎来哪些针对性政策?
我莫得感情也莫得耳朵_我莫得感情哪里的梗
续航38小时/能水洗!万魔S50运动蓝牙耳机图赏
爸爸给女儿买RTX 4060 Ti显卡当生日礼物 小女孩表情亮了
来试试手气?《逆水寒》手游6月30日上线:官方宣布抽奖送鹤岗一套房-环球速读
每日消息!比电脑还大:24GB+1TB!今年最能打的直屏旗舰杀疯了
迅雷云盘TV版最高可领180天超级会员特权 支持4K电视超清播放-天天信息
天天微资讯!广州杨大爷退休后,喝酒不喝茅五剑,青睐三款廉价酒
强化学习从基础到进阶-常见问题和面试必知必答[8]:近端策略优化(proximal policy optimization,PPO)算法
债市日报:6月28日|全球新视野
债市日报:6月28日
农村三胞胎姐妹均高分超一本线:成绩一直很优秀
极氪001欧洲价格公布:起售价47万元 比国内贵17万
高管曾言等本土车企“烧死了”再来抢市场!起亚EV6开启盲订 每日速递
今天起 韩国人集体“年轻一两岁”:与一项法案有关
XREAL Beam投屏盒子首次亮相MWC!AR空间屏体验太酷了
一般小县城稀缺行业有哪些 今日热搜
跑得更快!华为云GaussDB以出色的性能守护“ERP的心脏”
记录--不定高度展开收起动画 css/js 实现
今日播报!Cognos教程_编程入门自学教程_菜鸟教程-免费教程分享
LRU 缓存淘汰算法
Mac反编译安卓APK
世界看点:原来是他们!退市股获举牌4个交易日翻倍,步步高系大佬要进董事会
【金融街发布】财政部:5月地方债发行规模为7554亿元 新增债券占比近四成_即时看
天天即时看!注意!天孚通信:股东朱国栋计划减持公司股份不超过约395万股
游戏主播被大额打赏后剃光头!结果被坑惨:打赏退款了
尽享丝滑!MWC现场体验领克08魅族Flyme Auto车机:流畅度爆表 环球新要闻