DaemonSet 控制器

1. DaemonSet 概述

DaemonSet 主要用于管理在集群中的每个Node(或者满足条件的某些 Node)上仅运行一个 Pod 副本,在新增 Node 时,系统将自动在新的 Node 上启动 Pod ,而在删除 Node 时,系统也会自动删除其上运行的 Pod。

DaemonSet 的一些常见应用场景介绍:

  • 在每个 Node 上都运行一个共享存储驱动守护进程,例如 ceph driver。
  • 在每个 Node 上都运行一个日志采集程序,采集 Node 上全部容器的日志,例如 fluentd。
  • 在每个 Node 上都运行一个性能监控程序,采集 Node 上容器和操作系统的运行性能数据,例如 Prometheus Node Exporter。

2. DaemonSet 配置示例

DaemonSet 示例:

# fluentd-ds.yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: fluentd
  namespace: kube-system
  labels:
    k8s-app: fluentd
spec:
  selector:
    matchLabels:
      app: fluentd
  template:
    metadata:
      namespace: kube-system
      labels:
        app: fluentd
    spec:
      containers:
      - name: fluentd
        image: fluentd
        resources:
          limits:
            cpu: 100m
            memory: 200Mi
          requests:
            cpu: 100m
            memory: 200Mi
        volumeMounts:
        - name: varlog
          mountPath: /var/log
      volumes:
      - name: varlog
        hostPath:
          path: /var/log
ShellScript

DaemonSet 资源 yaml 配置中 spec 部分的核心配置字段:

  • selector:标签选择器,用于关联具有指定标签的 Pod 列表。
  • template:Pod 模板,其中的配置项就是 Pod 的定义,无须再设置 apiVersion 和kind 这两个元数据。
  • updateStrategy:更新策略,可选项包括 OnDelete 和 RolingUpdate。
  • minReadySeconds:Pod 最短就绪时间,至少要达到这个时间,系统才会设置 Pod 为 Ready 状态,默认值为 0。
  • revisionHistoryLimit:修订历史最大数量,默认值为 10。

3. DaemonSet 更新策略

DaemonSet 的更新策略(updateStrategy)包括两种:OnDelete 和 RollingUpdate 默认值为 RollingUpdate。

  • OnDelete:这是 Kubernetes v1.5 及之前版本的策略,使用 OnDelete 作为更新策略时,在修改了 DaemonSet 配置之后,新的 Pod 并不会被自动创建,需要用户手动删除旧版本的 Pod,才会触发新建 Pod 的操作。
  • RollingUpdate:从 Kubernetes v1.6 版本开始引入该策略。当使用 RollingUpdate更新策略对 DaemonSet 进行更新时,旧版本的 Pod 将自动被“杀掉”,然后自动创建新版本的 DaemonSet Pod。该策略包含两个参数(maxUnavailable 和 maxSurge)含义同 Deployment 的滚动更新参数一致。

k8s 系统 DaemonSet 控制器默认的更新策略数值:

updateStrategy:
  rollingUpdate:
    maxSurge: 0
    maxUnavailable: 1
  type: RollingUpdate
YAML

更新命令同 Deployment ,详见 Deployment 的更新机制

4. DaemonSet 的回滚

DaemonSet 的回滚操作与 Deployment 的回滚操作类似,详见 Deployment 的回滚