本文是对 Kubernetes 作业管理中的容器化守护进程相关设计的理解,由于 DaemonSet 这个知识点相对较为容易理解,所以主要是作的张磊在极客时间上《深入剖析 Kubernetes》课程的笔记。
文章目录
Why(为什么要有 DaemonSet)
使用场景:
- 各种网络插件的 Agent 组件,都必须运行在每一个节点上,用来处理这个节点上的容器网络;
- 各种存储插件的 Agent 组件,也必须运行在每一个节点上,用来在这个节点上挂载远程存储目录,操作容器的 Volume 目录;
- 各种监控组件和日志组件,也必须运行在每一个节点上,负责这个节点上的监控信息和日志搜集。
What(DaemonSet 是什么)
一句话:在 Kubernetes 集群中的每一个节点中运行一个 Daemon Pod。
How(DaemonSet 如何保证每个 Node 上有且只有一个被管理的 Pod)
DaemonSet 会保证每个 Node 上有且只有一个被管理的 Pod,是利用“控制器模型”原理实现。
原理: DaemonSet Controller,首先从 Etcd 里获取所有的 Node 列表,然后遍历所有的 Node。这时,它就可以很容易地去检查,当前这个 Node 上是不是有一个携带了指定标签的 Pod 在运行。有多余 Pod 的话就调用 Kubernetes API 删除;没有这种 Pod 的话就利用 Pod 来创建一个。
有2个点:
DaemonSet Controller 会在创建 Pod 的时候,自动在这个 Pod 的 API 对象里,加上一个 nodeAffinity 定义。其中,需要绑定的节点名字,正是当前正在遍历的这个 Node。
此外,DaemonSet 还会给这个 Pod 自动加上另外一个与调度相关的字段,叫作 tolerations。这个字段意味着这个 Pod,会“容忍”(Toleration)某些 Node 的“污点”(Taint)。
具体可以看最后的“使用实例”。
另外,DaemonSet 控制器操作的直接就是 Pod,没有 ReplicaSet 这样的对象参与其中,所以,它的版本维护是使用 API 对象的方式实现,名为 ControllerRevision。
这个 ControllerRevision 对象,实际上会保存某一版本对应的完整的 DaemonSet 的 API 对象。并且,在 Annotation 字段保存了创建这个对象所使用的 kubectl 命令。