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。

相关推荐
虚伪的空想家2 天前
云镜像,虚拟机镜像怎么转换成容器镜像
服务器·docker·容器·k8s·镜像·云镜像·虚机
ohoy2 天前
ubuntu k8s1.32集群安装
k8s
武子康2 天前
AI研究-134 Java 2025:会衰退吗?LTS 路线、云原生与工程化落地趋势研究
java·开发语言·人工智能·python·ai·云原生·k8s
iru11 天前
kubectl cp详解,k8s集群与本地环境文件拷贝
运维·容器·k8s
竹君子13 天前
研发管理知识库(15)K8s和Istio关系
k8s
像风一样自由202016 天前
告别“在我电脑上能跑”:Docker入门与核心概念解析
docker·容器·k8s
Garfield200520 天前
Kubeflow 运行容器时 ENTRYPOINT 被覆盖导致环境变量未生效问题分析与解决
k8s·dockerfile·kubeflow·entrypoint
南方以南_22 天前
CKA07--Argo CD
运维·kubernetes·k8s
Matana11122 天前
CentOS7 + VMware 搭建 K3s 集群遇到的网络问题全记录与解决方案
k8s