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。

相关推荐
ShirleyWang0126 小时前
让headlamp控制台能访问
linux·服务器·python·k8s·k3s
spider_xcxc8 小时前
K8s 部署学习笔记
docker·容器·kubernetes·云计算·k8s
ShirleyWang01210 小时前
Day02 K3s NGF(Nginx Gateway Fabric)单 Worker 环境网关更新与故障处置 SOP
linux·服务器·python·k8s·k3s
ShirleyWang01210 小时前
DAY01 K3s 私有化部署排障复盘与 SOP
linux·服务器·k8s·k3s·企业部署
XUHUOJUN4 天前
AKS 不是安装在 Windows Server 上,而是运行在 Windows Server 之上的 Azure 平台能力
windows·架构·k8s·azure local·azure stack
Geek-Chow4 天前
Connecting kubectl to a Private EKS Cluster Over an Internal Domain
kubernetes·k8s·aws
spider_xcxc6 天前
Docker Compose 容器通信详解:同一个 Compose 文件才能互通吗?
docker·容器·k8s·容器化·容器网络
欢醉11 天前
k8s调用服务异常cannot allocate memory
kubernetes·k8s
万里侯14 天前
GitOps 漂移检测:集群里改了配置,Git 还以为一切正常
微服务·容器·k8s
spider_xcxc15 天前
云上网络基石(阿里云):深入解读阿里云VPC及其应用生态
网络·阿里云·云计算·k8s·运维开发·虚拟化