Replicationcontroller和ReplicaSet 都用于在Kubemetes集群上运行部署特定数量的pod,它们是把pod随机的分散到各个节点上。
而 DaemonSet 是在集群中的每个(nodeSelector指定的)节点上正好只运行(有且只有)一个pod实例。这种情况一般包括pod执行系统级别的与基础结构相关的操作。 例如,希望在每个节点上运行日志收集器和资源监控器。 另一个典型的例子是Kubernetes 自己的kube-proxy进程,它需要运行在所有节点上才能使服务工作。

DaemonSet 的目的是运行系统服务。
image.png
image.png

4.4.1 使用 DaemonSet 在每个节点上运行一个 pod

由DaemonSet 创建的pod 已经指定了目标节点,并跳过Kubernetes Scheduler的调度过程。它们不是随机分布在集群上的。

DaemonSet 并没有期望的副本数的概念。 它不需要,因为它的工作是确保一个pod匹配它的选择器并在每个节点上运行。

如果节点下线, DaemonSet不会在其他节点重新创建pod。但是,当将一个新节点添加到集群中时,DaemonSet会立刻部署一个新的pod实例 。 如果有人无意中删除了一个pod,那么它也会重新创建一个新的pod。

与 ReplicationController 和 ReplicaSet 一样,DaemonSet 从配置的 pod 模板创建 pod。

4.4.2 使用 DaemonSet 只在特定的节点上运行 pod

DaemonSet 将 pod 部署到集群中的所有节点上,除非指定这些 pod 在部分节点上运行。这是通过 pod 模板中的 nodeSelector 属性指定的。

注意:在本书的后面,你将了解到节点可以被设置为不可调度,防止 pod 被部署到节点上。但不可调度的属性只会被调度器使用,对DaemonSet 无效。

用一个例子来解释 DaemonSet

让我们假设有一个名为 ssd-monitor 的守护进程,它需要在包含SSD的所有节点上运行。你将创建 DaemonSet ,它只在具有disk=ssd 标签的所节点上运行这个守护进程。
image.png

创建—个 DaemonSet YAML 定义文件

你将创建一个运行模拟的ssd-monitor监控器进程的 DaemonSet,该进程每 5 秒会将“SSD OK”打印到标准输出。(容器镜像在Docker Hub上)
image.png

  1. cd /root/k8s/
  2. cat >ssd-monitor-daemonset.yaml <<'EOF'
  3. apiVersion: apps/v1 #K8S 1.21中,版本已经变更
  4. kind: DaemonSet
  5. metadata:
  6. name: ssd-monitor
  7. spec:
  8. selector:
  9. matchLabels:
  10. app: ssd-monitor
  11. template:
  12. metadata:
  13. labels:
  14. app: ssd-monitor
  15. spec:
  16. nodeSelector:
  17. disk: ssd
  18. containers:
  19. - name: main
  20. image: luksa/ssd-monitor
  21. EOF

创建 DaemonSet

image.png

注意:这里还没有给node打标签

向节点上添加所需的标签

image.png
image.png

如果有多个节点并且其他的节点也加上了同样的标签,将会看到 DaemonSet 在每个节点上都启动pod。

从节点上删除所需的标签

image.png
image.png
删除或更改node的标签后,ds创建的pod会自动终止,因为它还会标签选择器匹配,受ds管控。


Usage:

删除DaemonSet,包括它创建的pod
kubectl delete ds