DaemonSet也被稱為“守護進程集”,它會保證在每個節點上有且僅有一個Pod。叢集中新增節點時,DaemonSet也會為其自動建立一個Pod。它適用於日誌收集組件(如Fluentd)、節點監控代理(如Prometheus Node Exporter)等情境。通過本文,您可瞭解DaemonSet的特點、通過控制台及kubectl建立DaemonSet的方法。
DaemonSet介紹
DaemonSet在預設情況下會在每個節點上運行一個Pod,但會受到以下調度策略的影響。關於調度策略的更多資訊,請參見調度。
汙點與容忍度:DaemonSet Pod受到汙點限制,不會運行在無法容忍的節點上。但它們預設容忍下列汙點:
node.kubernetes.io/unschedulable:NoSchedulenode.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的更多資訊,請參見官方文檔。
本文樣本使用的鏡像為公網鏡像,拉取時叢集或節點需具備公網訪問能力:
為叢集開啟訪問公網的能力(推薦):為叢集所在的VPC建立公網NAT Gateway,叢集中的所有資源均可訪問公網。
為節點分配固定公網IP:擁有公網IP的節點可拉取公網鏡像,但需要為部署工作負載的每個節點都分配公網IP。
建立DaemonSet
您可以通過控制台或kubectl兩種方式建立DaemonSet。
通過控制台建立
登入Container Service管理主控台,在左側導覽列選擇叢集列表。
在叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇。
在守護進程集頁面,單擊使用鏡像建立。
由於DaemonSet的特性,控制台配置項與Deployment有以下不同:
應用基本資料:DaemonSet的Pod數量由節點數量決定,因此沒有副本數量配置。
進階配置:因為相同的原因,DaemonSet同樣沒有伸縮配置。
其餘配置項則與Deployment相同,請參見建立無狀態工作負載Deployment中的配置項說明建立DaemonSet。
通過kubectl命令列建立
建立工作負載前,請確保已通過kubectl串連到叢集。具體操作,請參見擷取叢集KubeConfig並通過kubectl工具串連叢集。
複製並儲存以下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執行以下命令建立DaemonSet。
kubectl apply -f daemonset.yaml預期輸出:
daemonset.apps/nginx-test created執行以下命令,查看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>