K8S DaemonSet 控制器

在 Kubernetes 集群管理中,DaemonSet 是一个非常重要的控制器,它能够确保集群中的所有节点都运行相同的 Pod 副本。本文将详细介绍 DaemonSet 的相关知识,包括其概述、工作原理、应用场景、与 Deployment 的区别、资源清单文件编写技巧以及使用案例。

一、DaemonSet 概述

什么是 DaemonSet

DaemonSet 控制器的核心功能是保证 Kubernetes 集群中所有的节点都运行一个相同的 Pod 副本。当向集群中添加新的节点时,这个新节点会自动创建对应的 Pod 副本;当节点从集群中移除时,相关的 Pod 也会被自动删除。此外,删除 DaemonSet 时,它所创建的所有 Pod 也会随之被删除。

工作原理

DaemonSet 控制器会持续监听 Kubernetes 中的 DaemonSet 对象、Pod 对象和 Node 对象。当这些被监听的对象发生变动时,就会触发 syncLoop 循环,促使 Kubernetes 集群朝着 DaemonSet 对象所描述的期望状态演进。

典型应用场景

DaemonSet 在很多场景中都有广泛应用,例如:

  • 在集群的每个节点上运行存储组件,如 glusterd 或 ceph。
  • 在每个节点上部署日志收集组件,像 flunentd、logstash、filebeat 等。
  • 在每个节点上运行监控组件,比如 Prometheus、Node Exporter、collectd 等。

与 Deployment 的区别

Deployment 部署的副本 Pod 会分布在各个 Node 上,每个 Node 可能运行多个副本。而 DaemonSet 与之不同,其特点是每个 Node 上最多只能运行一个副本。

二、DaemonSet 资源清单文件编写技巧

要编写 DaemonSet 资源清单文件,我们可以通过 kubectl explain ds 等命令查看相关字段的说明,以下是主要字段的介绍:

主要字段说明

  1. 通过 kubectl explain ds 可查看的主要字段:

    字段 作用
    apiVersion 当前资源使用的 api 版本,需跟 VERSION: apps/v1 保持一致
    kind 资源类型,跟 KIND: DaemonSet 保持一致
    metadata 元数据,用于定义 DaemonSet 的名字等信息
    spec 用于定义容器等相关配置
    status 状态信息,该字段不可修改
  2. 通过 kubectl explain ds.spec 可查看的 spec 部分主要字段:

    字段 作用
    minReadySeconds 新的 pod 启动几秒后,再终止旧的 pod
    revisionHistoryLimit 历史版本数量
    selector -required- 用于匹配 pod 的标签选择器
    template -required- 定义 Pod 的模板,基于此模板创建的所有 pod 都是一样的
    updateStrategy daemonset 的升级策略
  3. 通过 kubectl explain ds.spec.template 可查看的 template 部分主要字段:

    字段 作用
    containers 容器配置列表,每个元素描述一个要在 Pod 内运行的容器
    initContainers 初始化容器配置列表,在主容器之前运行,用于设置环境或执行预备工作
    ephemeralContainers 临时容器配置列表,仅在 Pod 运行时存在
    restartPolicy Pod 的重启策略,可选值为 Always、OnFailure 或 Never
    terminationGracePeriodSeconds 优雅终止周期,以秒为单位,强制终止 Pod 前的等待时间
    activeDeadlineSeconds Pod 活动的截止时间,超过此时间系统将杀死 Pod
    dnsPolicy Pod 的 DNS 策略,可选 ClusterFirst、ClusterFirstWithHostNet 等
    Context Pod 的安全上下文,用于设置安全相关属性,如 RBAC 规则等
    schedulerName 调度器名称,指定用于调度 Pod 的特定调度器
    tolerations Pod 容忍的污点,允许 Pod 调度到有特定污点的节点上
    affinity Pod 的亲和性设置,指定 Pod 偏好或必须运行的节点属性
    hostNetwork 若设为 true,Pod 将使用主机的网络命名空间
    imagePullSecrets 用于获取镜像的密钥,会被注入到 Pod 中
    configMap ConfigMap 的名称和键值对列表,用于注入配置数据到 Pod
    secret Secret 的名称和键值对列表,用于注入敏感数据到 Pod
    volumeMounts 卷挂载配置列表,指定 Pod 中容器如何挂载卷
    volumes 卷配置列表,为 Pod 中的容器提供存储卷

清单模版

以下是一个 DaemonSet 资源清单的模板:

yaml

复制代码
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: pod-controller                      # ds名称                      
  labels:                                   # 给ds打标签
    controller: daemonset
spec:
  revisionHistoryLimit: 3                   # 保留历史版本数量,默认为10
  updateStrategy:                           # Pod更新策略,默认是RollingUpdate
    type: RollingUpdate                     # 滚动更新策略。另一种是OnDelete,其没有子属性配置参数 
    rollingUpdate:                          # 当type为RollingUpdate的时候生效,为其配置参数
      maxSurge: 25%                         # 升级过程中可以超过期望的Pod的最大数量,可以为百分比,也可以为整数。默认是25%
      maxUnavailable: 25%                   # 升级过程中最大不可用状态的Pod数量,可以为百分比,也可以为整数。默认是25%
  selector:                                 # 选择器,通过该控制器管理哪些pod
    matchLabels:                            # Labels匹配规则。和matchExpressions类似
      app: nginx-pod						###或者
    matchExpressions:                     # Expressions匹配规则。和matchLabels类似 
      - {key: app, operator: 'In', values: ["nginx-pod"]} 
  template:                                 # pod副本创建模板。属性和Pod的属性一样
     metadata:
       labels:
         app: nginx-pod
     spec:
       containers:
         - name: nginx
           image: nginx:latest
           ports:
             - name: nginx-port
               containerPort: 80
               protocol: TCP

三、DaemonSet 使用案例

下面通过一个实际案例来演示 DaemonSet 的使用:

  1. 创建一个名为 pod-controller.yaml 的文件,内容如下:

yaml

复制代码
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: pod-controller
  labels:
    controller: daemonset
spec:
  selector:
    matchLabels:
      app: nginx-pod
  template:
     metadata:
       labels:
         app: nginx-pod
     spec:
       containers:
         - name: nginx
           image: nginx:latest
           ports:
             - name: nginx-port
               containerPort: 80
               protocol: TCP 
  1. 应用该清单文件:

shell

复制代码
[root@k8s-master01 ~]# kubectl apply -f pod-controller.yaml 
daemonset.apps/pod-controller created

执行上述命令后,DaemonSet 就会在集群的每个节点上创建一个运行 nginx 镜像的 Pod。

相关推荐
Y.O.U..4 天前
Kubernetes-控制器介绍
k8s
大都督老师4 天前
配置 containerd 使用镜像加速器拉取 Docker Hub 镜像
容器·kubernetes·k8s
放寒假脚后跟v5 天前
Pod 的 YAML 文件中 exitCode 字段的具体含义、不同取值代表的场景
运维·云原生·容器·kubernetes·k8s
孤岛悬城5 天前
57 Rancher管理平台
云计算·k8s
HehuaTang6 天前
K8s labels 与 annotations 区别
k8s
百锦再10 天前
Elements Plus 跨设备自适应显示问题综合解决方案
python·flutter·小程序·uni-app·k8s·tornado·net
Font Tian12 天前
【云计算2025年度总结】汇总和反思
容器·云计算·k8s·openstack·虚拟化
Coder_Boy_12 天前
基于SpringAI的智能AIOps项目:部署相关容器化部署管理技术
人工智能·spring boot·k8s·运维开发
whltaoin15 天前
25年12月26日-福州某科技公司一面面试原题
java·linux·docker·面试·职场和发展·k8s·springboot
汪碧康16 天前
二进制kubenetes-1.34.2安装包快速部署k8s集群
云原生·容器·kubernetes·k8s·etcd·xkube