Chuyển đến nội dung chính

第 19 課:惡魔集

DaemonSets 確保在每個節點上執行一個 Pod。使用案例:監控代理程式、日誌代理、網路插件、儲存。在每個節點上部署 Grafana Alloy 收集器的真實範例。

🔒 DevSecOps — 第 19 課 第 19 課:守護程式

KUBERNETES:從基礎到進階

模組 5:工作負載管理__HTMLTAG_60___

xdev.asia

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 平台上建立堅實的基礎設施可觀察性和安全層。