DaemonSets — 每個節點一個 Pod__HTMLTAG_66___
當您需要在叢集中的 所有節點 (或特定節點子集)上執行 Pod 時,DaemonSet 就是答案。與以副本形式分發 Pod 的 Deployment 不同,DaemonSet 確保每個節點(與選擇器相符)始終擁有自己的 Pod。當新節點新增至叢集時,DaemonSet 會自動在該節點上建立一個 Pod。當節點被刪除時,Pod 也會被垃圾回收。
1。什麼是 DaemonSet?每節點一個 Pod 機制
DaemonSet 控制器持續確保:
- 每個符合節點都有一個正在運作的 DaemonSet Pod
- 當新節點加入叢集時→自動建立一個新的Pod
- 當節點從叢集中刪除時 → Pod 被刪除
- 刪除 DaemonSet 將清理它所建立的所有 Pod
最基本的DaemonSet:
程式碼區塊_0
2。實際用例
DaemonSet 廣泛用於基礎設施代理:
2.1 日誌記錄代理__HTMLTAG_94___
___HTMLTAG_96__HTMLTAG_97___Grafana Alloy:從每個節點上的標準輸出檔案和容器收集日誌
___HTMLTAG_100__HTMLTAG_101___Fluent Bit:輕量級日誌轉發器,將日誌轉發到Elasticsearch/Loki
___HTMLTAG_104__HTMLTAG_105___Fluentd:出貨前聚合和轉換日誌
2.2 監控代理程式
-
___HTMLTAG_112__HTMLTAG_113___Prometheus Node Exporter:匯出節點的CPU、記憶體、磁碟、網路指標
___HTMLTAG_116__HTMLTAG_117___Datadog 代理:完全可觀察性 — 指標、日誌、追蹤、流程
___HTMLTAG_120__HTMLTAG_121___彈性代理:統一彈性堆疊代理
2.3 網路外掛程式 (CNI)
-
___HTMLTAG_128__HTMLTAG_129___Cilium:基於 eBPF 的網路、安全性、可觀察性
___HTMLTAG_132__HTMLTAG_133___Calico:網路策略實作
___HTMLTAG_136__HTMLTAG_137___Weave Net:簡單覆蓋網路
2.4 儲存(CSI 節點外掛程式)
-
___HTMLTAG_144__HTMLTAG_145___AWS EBS CSI 驅動程式節點外掛程式:在 EC2 節點上掛載 EBS 磁碟區
___HTMLTAG_148__HTMLTAG_149___Longhorn:分散式區塊儲存 — 引擎在每個節點上運作
___HTMLTAG_152__HTMLTAG_153___OpenEBS:雲端原生儲存
2.5 安全性
-
___HTMLTAG_160__HTMLTAG_161___Falco:使用 eBPF 進行執行時間威脅偵測(請參閱第 26 課)
___HTMLTAG_164__HTMLTAG_165___NeuVector:容器安全平台
___HTMLTAG_168__HTMLTAG_169___Sysdig 代理:安全性與效能監控
3。 DaemonSet 與部署:何時使用哪一個?
常見問題:「為什麼不將部署與 副本一起使用:N 而不是 DaemonSet?」
___HTMLTAG_179__HTMLTAG_180___在下列情況下使用 DaemonSet:HTMLTAG_181__HTMLTAG_182
- 需要直接存取節點資源(檔案系統、網路介面、硬體)
- 需要 每個特定節點__HTMLTAG_188___上的 Pod,而不是任何 N 個 Pod__HTMLTAG_189___
- 代理程式需要確切地知道它正在哪個節點上執行(主機名稱、節點 IP)
- 基礎設施代理程式:日誌記錄、監控、CNI、CSI
___HTMLTAG_195__HTMLTAG_196___在下列情況下使用部署:HTMLTAG_197__HTMLTAG_198
- 需要獨立於節點數量擴充副本數量
- 無節點特定存取權限的無狀態應用程式
- Web 伺服器、API 伺服器、常見微服務
4。節點選擇 — 為 DaemonSet 選擇節點
DaemonSet 並不總是需要在整個叢集上運行。您可以透過多種方式限制它。
4.1 節點選擇器__HTMLTAG_212___
僅部署在具有特定標籤的節點上:
程式碼區塊_1
4.2 節點親和性
比nodeSelector更複雜,支援In、NotIn、Exists等運算子:
程式碼區塊_2
4.3 容忍 — 部署到受污染的節點
節點可以有 污點 以防止常規 Pod 調度到那裡。 DaemonSet 通常需要 tolerations 來繞過這些污點 — 特別是在控制平面節點上運行:
程式碼區塊_3
最後兩個容忍(not-ready 和 unreachable)對於基礎設施代理非常重要 - 即使節點出現問題,您也希望記錄/監視記錄,以擷取該問題的日誌記錄。
5。更新策略
DaemonSet 有兩種更新策略:
5.1 滾動更新(預設)
程式碼區塊_4
透過 RollingUpdate,Kubernetes 會一一更新每個 Pod(或根據 maxUnavailable)。舊 Pod 被刪除,新 Pod 在同一節點上建立。
5.2 刪除
程式碼區塊_5
使用 OnDelete,DaemonSet 不會自動更新 Pod。只有當您手動刪除舊 Pod 時才會建立新 Pod(具有新規格)。當您想要完全控制更新過程時使用。
6。實例:Grafana合金節點代理
___HTMLTAG_247__HTMLTAG_248___Grafana Alloy 是來自 Grafana Labs 的 OpenTelemetry 原生收集器,取代了舊的 Grafana Agent。將 Alloy 部署為 DaemonSet 以從每個節點收集日誌和指標:
程式碼區塊_6
合金配置的ConfigMap:
程式碼區塊_7
7。範例:Prometheus Metrics 的節點導出器
Node Exporter 收集節點硬體和作業系統指標,將它們暴露給 Prometheus 抓取:
程式碼區塊_8
8。部署 DaemonSet 時的優先權: PriorityClass
日誌記錄和監控等基礎設施代理程式需要在應用程式 Pod 之前進行排程 — 即使節點面臨記憶體壓力。使用 PriorityClass 確保這一點:
程式碼區塊_9
然後將 PriorityClass 指派給 DaemonSet:
程式碼區塊_10
Kubernetes 有許多內建優先權類別:
-
___HTMLTAG_268__HTMLTAG_269___系統叢集關鍵:2000000000 — 對於 CoreDNS、kube-proxy
___HTMLTAG_272__HTMLTAG_273___系統節點關鍵:2000001000 — 用於 kubelet 相鄰元件
9。測試和調試 DaemonSet
程式碼區塊_11
10。 DaemonSet 最佳實踐
-
___HTMLTAG_282__HTMLTAG_283___合理資源:DaemonSet 在每個節點上運作 — 如果每個 Pod 使用 500m CPU,則整個叢集會損失大量容量__HTMLTAG_285___
___HTMLTAG_286__HTMLTAG_287___完整容忍:新增對
未就緒與不可達___的容忍問題,以便代理在執行節點時出現不___的容忍問題,以便代理在執行節點時出現。
___HTMLTAG_294__HTMLTAG_295___PriorityClass:分配高於常規工作負載的優先權以確保進度
___HTMLTAG_298__HTMLTAG_299___readOnlyRootFilesystem:盡可能啟用,使用emptyDir或hostPath進行資料寫入__HTMLTAG_301___
___HTMLTAG_302__HTMLTAG_303___RollingUpdate maxUnavailable:保持為 1 或較小的數字,以免同時失去許多節點的覆蓋__HTMLTAG_305___
___HTMLTAG_306__HTMLTAG_307___命名空间隔离:将 DaemonSet 部署到单独的命名空间中(例如 monitoring、logging) — 不要与应用程序工作负载混合
DaemonSet 是每個 Kubernetes 叢集生產中不可或缺的工具。了解如何正確使用 DaemonSet 可以幫助您在 Kubernetes 平台上建立堅實的基礎設施可觀察性和安全層。