← 返回文章列表

Kubernetes DaemonSet 完全指南

深入理解 Kubernetes DaemonSet:每个节点运行一个 Pod 的最佳实践

5 分钟阅读
字号

Kubernetes DaemonSet 完全指南

本文基于 Kubernetes 1.28


概述

DaemonSet 确保每个节点都运行一个指定的 Pod 副本。当新节点加入集群时,Pod 自动在新节点上创建;当节点离开集群时,Pod 自动回收。

DaemonSet 是部署节点级任务的理想选择,如日志收集、监控代理、网络插件等。


一、为什么需要 DaemonSet

Deployment 的局限

Deployment replicas=3:
  - K8s 调度器决定 Pod 放在哪 3 个节点
  - 可能不是所有节点都有 Pod
  - 新节点加入需要手动扩缩容

DaemonSet 的优势

DaemonSet:
  - 每个节点自动运行一个 Pod
  - 新节点加入自动创建 Pod
  - 节点离开自动回收 Pod
  - 适合节点级任务

二、典型使用场景

场景示例
日志收集Fluentd、Filebeat、Logstash
节点监控Node Exporter、cAdvisor
网络插件Flannel、Calico、Cilium
存储插件CSI 驱动、Ceph 客户端
安全监控Falco、Tripwire
kube-proxy每个节点的代理

三、YAML 详解

基础示例

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: fluentd
  namespace: kube-system
spec:
  # 1. 选择器
  selector:
    matchLabels:
      app: fluentd
  
  # 2. Pod 模板
  template:
    metadata:
      labels:
        app: fluentd
    spec:
      # 3. 容忍(可以跑在 Master 等有 taint 的节点)
      tolerations:
      - key: node-role.kubernetes.io/master
        effect: NoSchedule
        operator: Exists
      - key: node-role.kubernetes.io/control-plane
        effect: NoSchedule
        operator: Exists
      
      containers:
      - name: fluentd
        image: fluentd:v1.6
        resources:
          requests:
            cpu: "100m"
            memory: "200Mi"
          limits:
            cpu: "500m"
            memory: "500Mi"
        
        volumeMounts:
        - name: varlog
          mountPath: /var/log
        - name: varlibdockercontainers
          mountPath: /var/lib/docker/containers
          
      volumes:
      - name: varlog
        hostPath:
          path: /var/log
      - name: varlibdockercontainers
        hostPath:
          path: /var/lib/docker/containers

四、DaemonSet vs Deployment

特性DeploymentDaemonSet
副本控制指定 replicas每节点 1 个
调度K8s 调度器自动每节点一个
新节点需手动扩缩容自动创建
适合场景应用副本节点级 Agent

五、调度控制

节点亲和性

spec:
  template:
    spec:
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            - matchExpressions:
              - key: disktype
                operator: In
                values:
                - ssd

节点选择器

spec:
  template:
    spec:
      nodeSelector:
        node-type: compute

污点和容忍

spec:
  template:
    spec:
      tolerations:
      # 容忍 Master 节点的 taint
      - key: node-role.kubernetes.io/master
        effect: NoSchedule
        operator: Exists
      # 容忍所有 taint
      - operator: Exists
        effect: NoSchedule

六、常用命令

# 查看 DaemonSet
kubectl get daemonset -n kube-system
 
# 查看每个节点的 Pod 分布
kubectl get pods -n kube-system -o wide | grep fluentd
 
# 查看 DaemonSet 详情
kubectl describe daemonset fluentd -n kube-system
 
# 删除 DaemonSet
kubectl delete daemonset fluentd -n kube-system

七、更新策略

RollingUpdate(默认)

spec:
  updateStrategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 1    # 最多不可用 1 个节点

OnDelete

spec:
  updateStrategy:
    type: OnDelete        # 手动删除 Pod 才更新

八、实际示例

场景:日志收集

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: filebeat
  namespace: kube-system
spec:
  selector:
    matchLabels:
      app: filebeat
  template:
    metadata:
      labels:
        app: filebeat
    spec:
      serviceAccount: filebeat
      tolerations:
      - operator: Exists
        effect: NoSchedule
      containers:
      - name: filebeat
        image: elastic/filebeat:8.11.0
        env:
        - name: setup.kibana.host
          value: "kibana:5601"
        - name: output.elasticsearch.hosts
          value: "elasticsearch:9200"
        securityContext:
          runAsUser: 0
        volumeMounts:
        - name: data
          mountPath: /usr/share/filebeat/data
        - name: varlibdockercontainers
          mountPath: /var/lib/docker/containers
          readOnly: true
        - name: varlogs
          mountPath: /var/log
          readOnly: true
      volumes:
      - name: data
        emptyDir: {}
      - name: varlibdockercontainers
        hostPath:
          path: /var/lib/docker/containers
      - name: varlogs
        hostPath:
          path: /var/log

九、总结

DaemonSet = 每个节点运行一个 Pod
 
适用场景:
  - 日志收集
  - 节点监控
  - 网络插件
  - 存储插件
 
特点:
  - 自动在每个节点运行
  - 新节点自动创建 Pod
  - 节点离开自动回收 Pod

相关文档

分享

// RELATED_POSTS

0%