全部產品
Search
文件中心

Container Service for Kubernetes:建立守護進程集工作負載DaemonSet

更新時間:Jun 14, 2025

DaemonSet也被稱為“守護進程集”,它會保證在每個節點上有且僅有一個Pod。叢集中新增節點時,DaemonSet也會為其自動建立一個Pod。它適用於日誌收集組件(如Fluentd)、節點監控代理(如Prometheus Node Exporter)等情境。通過本文,您可瞭解DaemonSet的特點、通過控制台及kubectl建立DaemonSet的方法。

DaemonSet介紹

DaemonSet在預設情況下會在每個節點上運行一個Pod,但會受到以下調度策略的影響。關於調度策略的更多資訊,請參見調度

  • 汙點與容忍度:DaemonSet Pod受到汙點限制,不會運行在無法容忍的節點上。但它們預設容忍下列汙點:

    • node.kubernetes.io/unschedulable:NoSchedule

    • node.kubernetes.io/not-ready:NoExecute(容忍300秒)

    • node.kubernetes.io/unreachable:NoExecute(容忍300秒)

  • nodeSelector:DaemonSet Pod同樣受到nodeSelector限制。例如,若DaemonSet配置了nodeSelector: { disktype: ssd },則僅會在標籤為disktype=ssd的節點上運行。

  • 親和性配置:節點與Pod親和性、反親和性配置同樣適用於DaemonSet。

說明

DaemonSet雖然可以實現部分調度策略,但這並非是它的設計目標。如果您需要執行較為複雜的調度,請考慮使用Deployment。關於DaemonSet的更多資訊,請參見官方文檔

查看kube-proxy Pods

Kubernetes預設組件kube-proxy就通過DaemonSet在每個節點部署,您可執行以下命令,查看kube-proxy所屬Pod。

kubectl get pods --all-namespaces -o wide | grep kube-proxy

預期輸出如下,在每個節點上都有kube-proxy Pod。由於kube-proxy採用hostNetwork模式(hostNetwork: true),因此Pod的IP與其所在節點相同。

kube-system     kube-proxy-worker-hfzkh     1/1     Running     0          2d21h   192.168.*.92    cn-shanghai.192.168.*.92   <none>           <none>
kube-system     kube-proxy-worker-pxnnf     1/1     Running     0          2d21h   192.168.*.11    cn-shanghai.192.168.*.11   <none>           <none>
kube-system     kube-proxy-worker-r2t26     1/1     Running     0          2d21h   192.168.*.7     cn-shanghai.192.168.*.7    <none>           <none>
重要

本文樣本使用的鏡像為公網鏡像,拉取時叢集或節點需具備公網訪問能力:

  • 為叢集開啟訪問公網的能力(推薦):為叢集所在的VPC建立公網NAT Gateway,叢集中的所有資源均可訪問公網。

  • 為節點分配固定公網IP:擁有公網IP的節點可拉取公網鏡像,但需要為部署工作負載的每個節點都分配公網IP。

建立DaemonSet

您可以通過控制台或kubectl兩種方式建立DaemonSet。

通過控制台建立

  1. 登入Container Service管理主控台,在左側導覽列選擇叢集列表

  2. 叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇工作負載 > 守護進程集

  3. 守護進程集頁面,單擊使用鏡像建立

  4. 由於DaemonSet的特性,控制台配置項與Deployment有以下不同:

    • 應用基本資料:DaemonSet的Pod數量由節點數量決定,因此沒有副本數量配置。

    • 進階配置:因為相同的原因,DaemonSet同樣沒有伸縮配置

    其餘配置項則與Deployment相同,請參見建立無狀態工作負載Deployment中的配置項說明建立DaemonSet。

通過kubectl命令列建立

重要

建立工作負載前,請確保已通過kubectl串連到叢集。具體操作,請參見擷取叢集KubeConfig並通過kubectl工具串連叢集

  1. 複製並儲存以下YAML內容至daemonset.yaml檔案中。

    apiVersion: apps/v1
    kind: DaemonSet
    metadata:
      name: nginx-test
      namespace: default  # 根據需要更改命名空間
      labels:
        app: nginx
    spec:
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          labels:
            app: nginx
        spec:
          containers:
          - name: nginx
            image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6
            resources:
              limits:
                cpu: '1'
                memory: 2Gi
              requests:
                cpu: 500m
                memory: 512Mi
  2. 執行以下命令建立DaemonSet。

    kubectl apply -f daemonset.yaml

    預期輸出:

    daemonset.apps/nginx-test created
  3. 執行以下命令,查看DaemonSet Pod的詳細資料。

    kubectl get pods --all-namespaces -o wide | grep nginx-test

    預期輸出如下,每個節點都有一個pod在運行

    default     nginx-test-8mqvh     1/1     Running     0          3m38s   192.168.*.**    cn-shanghai.192.168.**.250   <none>           <none>
    default     nginx-test-ltlx6     1/1     Running     0          3m38s   192.168.*.**    cn-shanghai.192.168.**.98    <none>           <none>
    default     nginx-test-n6zrv     1/1     Running     0          3m38s   192.168.*.**    cn-shanghai.192.168.**.17    <none>           <none>

相關文檔