找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

407

积分

0

好友

47

主题
发表于 2025-12-26 10:03:35 | 查看: 32| 回复: 0

一、DaemonSet 核心概念与典型场景

DaemonSet 是 Kubernetes 中一种特殊的工作负载控制器,其核心设计目标是确保集群中的每一个(或指定的)Node 节点上都运行一个指定的 Pod 副本。它主要服务于那些需要在所有节点上提供基础支撑能力的“守护型”应用。

相较于专注于运行业务应用的 Deployment(长期伺服型)和 Job(批处理型),DaemonSet 的关注点在于节点本身。它的核心功能包括:

  • 全节点覆盖:在 DaemonSet 定义匹配的每个 Node 上运行一个 Pod 副本。
  • 自动扩展:当新的 Node 加入集群时,DaemonSet 会自动在该节点上创建一个 Pod。
  • 节点级别守护:确保诸如网络、存储、日志、监控等基础服务在每个节点上都可用。

为了更好地理解其“一次部署,覆盖所有节点”的特性,我们可以参考下图:

DaemonSet 部署说明

DaemonSet 的典型应用场景

DaemonSet 是构建稳定、可观测的 Kubernetes 集群的基石,常用于部署以下类型的后台支撑服务:

  • 运行集群存储 Daemon:例如在每个节点上部署 glusterdceph 客户端等,为 Pod 提供分布式存储能力。
  • 运行日志收集 Daemon:例如部署 fluentdlogstashFilebeat 等组件,收集每个节点及节点上容器的日志,并统一发送至后端日志平台
  • 运行监控 Daemon:例如部署 node-exporter 来采集节点的硬件和操作系统指标,是构建云原生监控体系的关键一环。
  • 部署网络插件:大多数 Kubernetes 集群的 CNI(容器网络接口)插件,如 Calico、Flannel 的 Agent,都是以 DaemonSet 形式部署,为每个节点的 Pod 提供网络连通性。

下图清晰地列举了这些核心应用场景:

DaemonSet 应用场景

二、如何创建 DaemonSet 资源

DaemonSet 的创建与管理与其他 Kubernetes 资源类似,可以使用 kubectl 命令行工具。有两个关键点需要注意:

  1. 无副本数概念:DaemonSet 的 Pod 数量由匹配的 Node 数量决定,因此其配置中不需要定义 replicas 字段。
  2. 污点容忍:默认情况下,DaemonSet 的 Pod 不能容忍(Toleration)任何污点(Taint)。如果希望 Pod 能在带有污点的节点上运行,必须在 Pod 模板中显式配置容忍。

我们可以使用 kubectl create 命令快速生成一个 DaemonSet 的 YAML 配置模板:

# 通过命令生成 DaemonSet 的 YAML 定义文件
kubectl create ds <daemonset-name> --image=<image-name> -oyaml --dry-run=client > daemonset.yaml
  • ds: 是 daemonset 的简写。
  • --dry-run=client: 表示只生成 YAML 而不实际创建资源。
  • > daemonset.yaml: 将生成的 YAML 输出到文件。

三、DaemonSet YAML 配置详解

下面是一个功能完整的 DaemonSet 示例,以部署 fluentd 日志收集器为例。我们通过注释来详细解释关键配置项。

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: fluentd-elasticsearch
  namespace: kube-system # 通常将集群基础组件放在 kube-system 命名空间
  labels:
    k8s-app: fluentd-logging
spec:
  selector:
    matchLabels:
      name: fluentd-elasticsearch # 必须与 template.metadata.labels 匹配
  template:
    metadata:
      labels:
        name: fluentd-elasticsearch
    spec:
      # 容忍配置(Tolerations):这是 DaemonSet 能在所有节点运行的关键
      tolerations:
        # 容忍 effect 为 NoSchedule 的污点
        - effect: NoSchedule
          operator: Exists # Exists 表示容忍具有该 effect 的任何污点键
        # 容忍 effect 为 PreferNoSchedule 的污点
        - effect: PreferNoSchedule
          operator: Exists
        # 容忍 effect 为 NoExecute 的污点
        - effect: NoExecute
          operator: Exists
      # 终止宽限期:Pod 被终止前,允许其优雅关闭的等待时间(秒)
      terminationGracePeriodSeconds: 30
      containers:
        - name: fluentd-elasticsearch
          image: quay.io/fluentd_elasticsearch/fluentd:v2.5.2
          resources:
            limits:
              memory: 200Mi
            requests:
              cpu: 100m
              memory: 200Mi
          volumeMounts:
            - name: varlog
              mountPath: /var/log # 挂载宿主机日志目录
            - name: varlibdockercontainers
              mountPath: /var/lib/docker/containers
              readOnly: true # 以只读方式挂载容器目录
      volumes:
        - name: varlog
          hostPath: # 使用宿主机路径卷
            path: /var/log
        - name: varlibdockercontainers
          hostPath:
            path: /var/lib/docker/containers

DaemonSet 图标

配置核心解析

  • tolerations:此配置使得该 DaemonSet 的 Pod 能够容忍集群节点上常见的所有类型污点(如 node.kubernetes.io/not-readynode.kubernetes.io/unreachable 等),确保即使在非完全健康的节点上,日志收集等基础服务也能运行。这是深入掌握 Kubernetes 调度与高级编排 的重要知识点。
  • terminationGracePeriodSeconds:设置为30秒,当 Pod 需要被删除时,Kubernetes 会先发送 SIGTERM 信号,并等待30秒让进程优雅退出,超时后才会强制终止 (SIGKILL)。这对于有状态处理的守护进程(如正在转发日志的 fluentd)非常重要。
  • hostPath:通过将宿主机的 /var/log 和容器目录挂载到 Pod 内,使得 fluentd 能够直接读取节点上的所有日志文件。

通过以上详解,您可以系统地掌握 DaemonSet 从概念、使用场景到具体配置和操作的全部核心知识,并能够将其应用到实际的 Kubernetes 集群运维和建设中。




上一篇:Windows C++动态链接库(DLL)原理与实战:从创建、调用到安全注意事项
下一篇:C++ vector容器详解:从入门使用到模拟实现动态数组
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2026-1-11 09:33 , Processed in 0.276196 second(s), 39 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2025 云栈社区.

快速回复 返回顶部 返回列表