守护进程(DaemonSet)一种控制器类型,用于确保集群中的每个节点都运行一个副本(Pod)的特定实例。DaemonSet通常用于在集群的每个节点上运行一些系统级别的任务,如日志收集、监控、网络代理等。

特点与用途

  • 每节点一个副本:
    DaemonSet 保证在每个节点上都会运行一个 Pod 的副本。当您添加或移除节点时,DaemonSet 会自动调整以确保在每个节点上都有所需数量的 Pod 实例。

  • 系统级别任务:
    DaemonSet 通常用于运行系统级别的任务,这些任务需要在每个节点上执行,而不考虑节点的数量。例如,可以使用 DaemonSet 在每个节点上运行日志收集代理、监控代理或网络代理。

  • 节点自动发现:
    DaemonSet 能够自动检测和响应节点的加入和退出。如果您添加新的节点到集群中,DaemonSet 会在新节点上启动 Pod 的副本。如果节点被移除,相应的 Pod 实例也会被终止。

  • 无状态和有状态应用:
    DaemonSet 可以用于无状态应用程序,例如日志代理,也可以用于有状态应用程序,例如分布式存储的副本。

  • NodeAffinity:
    使用 NodeAffinity 可以通过 DaemonSet 在特定类型的节点上运行 Pod 实例。这可以通过指定节点标签和 NodeAffinity 规则来实现。

  • Pod 调度和更新:
    DaemonSet 具有调度和滚动更新的功能,可以确保 Pod 在节点上均匀分布,并允许通过更新 DaemonSet 来更新正在运行的 Pod 实例。

原理

  • 择器和标签:
    DaemonSet 使用标签选择器来确定在哪些节点上运行 Pod。在 DaemonSet 的配置中,通过 selector 指定了一个标签选择器,以匹配要在其上运行 Pod 的节点。

  • 创建 Pod 模板:
    在 DaemonSet 配置中定义了一个 Pod 模板,该模板描述了要在每个节点上运行的 Pod 的规范。这包括容器镜像、环境变量、卷挂载等信息。

  • 节点检测:
    控制器会定期检测集群中的节点,并检查哪些节点上尚未运行与 DaemonSet 匹配的 Pod。如果发现新的节点或者某个节点上不存在 Pod,控制器会在该节点上创建一个新的 Pod 实例,使用预定义的 Pod 模板。

  • 自动调度:
    控制器使用调度器(Scheduler)来确定将 Pod 调度到哪个节点上。节点的选择可以受到用户定义的 NodeAffinity 约束的影响,确保 Pod 运行在具有特定标签的节点上。

  • 自动伸缩和自动更新:
    DaemonSet 具有自动伸缩的特性,可以根据节点的变化动态调整 Pod 的数量,确保在每个节点上都有一个 Pod 的副本。此外,可以通过更新 DaemonSet 的配置来实现滚动更新,以更新正在运行的 Pod 实例。

  • 节点的动态加入和退出:
    如果集群中新增了节点,DaemonSet 会在新节点上启动 Pod 的副本,以确保在新节点上运行了符合标签选择器的 Pod。反之,如果节点从集群中移除,DaemonSet 会自动终止在该节点上运行的 Pod。

  • Pod 的失败和替换:
    如果某个节点上的 Pod 失败或终止,DaemonSet 会负责在同一节点上启动新的 Pod 实例,以保持指定数量的 Pod 在运行状态。

作者:吴升斌  创建时间:2020-10-22 10:22
最后编辑:吴升斌  更新时间:2025-05-28 18:59