Kubernetes 中的 DaemonSet 是什么?

DaemonSet 是 Kubernetes 中的一种控制器,它确保集群中的每个 Node 上都运行一个容器副本。这种控制器常用于在集群中运行日志收集器、监控等守护进程。

DaemonSet 的主要特征是:

  • 每个 Node 上运行一个 Pod 副本。
  • 当有 Node 加入集群时,会在该 Node 上启动一个 Pod。
  • 当有 Node 离开集群时,会终止该 Node 上的 Pod。

使用 DaemonSet 的主要优点是:

  • 运行守护进程:如日志采集、监控等。这类进程需要在每个 Node 上运行。
  • 新节点自动运行:当新增 Node 加入集群时,DaemonSet 会自动在该 Node 上运行一个 Pod。
  • 节点失效自动恢复:当其上的 Node 失效时,DaemonSet 会重新在其他 Node 上启动新的 Pod。
  • 确保节点上运行指定数量的副本:根据 .spec.template.spec.replicas 设置的数量。

DaemonSet 的定义包含以下主要字段:

  • .spec.template:Pod 模板,指定要在每个节点上运行的容器详细配置信息。
  • .spec.selector:选择器,用于过滤目标节点。支持按节点名 spec.nodeName、节点标签spec.nodeSelector 选择。
  • .spec.updateStrategy:更新策略,如 RollingUpdate、OnDelete
  • .spec.template.spec.hostNetwork:是否使用主机网络模式,默认为 false。
  • .spec.template.spec.nodeSelector:节点选择器,选择 Ziel 节点。
  • .spec.template.spec.tolerations:容忍度设置,以针对特定节点。

例如,我们可以创建一个在每个节点上运行 fluentd 容器的 DaemonSet:

yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: fluentd
spec:
  selector:
    matchLabels:
      name: fluentd
  template: 
    metadata:
      labels:
        name: fluentd
    spec:
      containers:
      - name: fluentd
        image: fluent/fluentd
        volumeMounts: 
        - name: varlog 
          mountPath: /var/log
        - name: varlibdockercontainers 
          mountPath: /var/lib/docker/containers
      terminationGracePeriodSeconds: 30
      volumes:
      - name: varlog
        hostPath: 
          path: /var/log
      - name: varlibdockercontainers
        hostPath:
          path: /var/lib/docker/containers

这个 DaemonSet 会在每个节点部署一个 fluentd 容器,用于日志收集。主要特点是:

  • 根据节点选择器(未设置)选择所有节点。
  • spec.template 定义在每个节点上运行的 fluentd 容器。
  • 挂载 /var/log 和 /var/lib/docker/containers 目录用于日志采集。
  • 新节点加入会自动在上启动一个副本。
  • 失效节点上的容器会自动终止并在其他节点重启。

所以总结来说,DaemonSet 的主要用途是:

  1. 在每个节点上运行一个副本,常用于运行日志收集、监控等守护进程。
  2. 新节点会自动运行,失效节点会自动恢复。
  3. 可以确保指定数量的 Pod 在每个节点上运行。

它的定义包括:

  1. Pod 模板:在每个节点上要运行的容器配置。
  2. 选择器:用于过滤目标节点。
  3. 更新策略:如 RollingUpdate、OnDelete。
  4. 节点选择器、容忍度:选择目标节点。