DaemonSet 是 Kubernetes 中的一種控制器,用來確保某個 Pod 在 Cluster 中的每個節點上都能運行一個實例。這使得 DaemonSet 成為管理系統級應用的理想選擇,特別適用於那些需要在所有節點上運行的應用,如紀錄收集器、監控代理、以及網路套件模組。
在每個節點上運行 Pod:
DaemonSet 保證每個節點上至少運行一個 Pod。舉例來說,若你的 Cluster 有五個節點,創建一個 DaemonSet 後,每個節點將分配一個對應的 Pod。
自動處理新節點的加入與移除:
當新的節點加入 Cluster 時,DaemonSet 會自動在這些新節點上部署 Pod。同樣,若節點被移除,該節點上的 DaemonSet Pod 也會被自動清除。
滾動更新:
DaemonSet 支援滾動更新,這樣可以在不影響服務的情況下逐步更新應用。Kubernetes 會依次更新每個節點上的 Pod,確保 Cluster 的高可用性。
如圖所示,當你創建一個 DaemonSet 時,它會在 Cluster 中的每個節點(如 Node-1、Node-2 和 Node-3)上部署一個 Pod。這些 Pod 的部署是自動化且一致的,確保所有節點均運行相同的應用程式(如監控代理或網路套件模組)。
圖中展示的流程強調了 DaemonSet 的自動化特性,使得當新節點加入時,Pod 會自動在新節點上部署,並在節點移除時自動清除。
系統監控:
DaemonSet 可用來部署如 Prometheus Node Exporter 或 Datadog Agent 等監控代理,以便在每個節點上收集資源使用情況和性能指標,並匯總至中央監控系統。
紀錄收集:
紀錄收集器如 Fluentd 或 Filebeat 可以通過 DaemonSet 在每個節點上運行,並將節點上的紀錄檔案傳輸到中央化的紀錄系統(例如 Elasticsearch)。
網路套件模組:
DaemonSet 經常用於在所有節點上運行網路套件模組,如 Calico、Weave 或 Flannel,這些套件模組為 Kubernetes 提供網路通訊功能。
安全監控:
安全代理如 Falco 可以通過 DaemonSet 部署,用來監控節點上的安全事件,並即時檢測異常行為。
DaemonSet Pod 的調度機制與普通 Pod 略有不同,它具有以下幾個特點:
直接調度到節點:
kube-scheduler
) 來分配節點。相反,當 DaemonSet 被創建或更新時,Kubernetes 自動在 Cluster 的每個節點上生成一個 Pod,而不需要標準調度流程。新節點加入時自動部署:
考慮節點容忍度 (Tolerations):
tolerations
來設定,確保某些 DaemonSet Pod 可以在標準 Pod 無法運行的節點上部署。控制平面節點的特殊處理:
tolerations
允許 Pod 運行在這些節點上,這對於像 Fluentd 這類需要收集所有節點紀錄的應用來說尤為重要。資源預留與優先級:
priorityClassName
來實現,防止其他低優先級的 Pod 佔用關鍵資源。Pod 自動清理:
DaemonSet Controller 創建 Pod:
當 DaemonSet 被創建時,DaemonSet Controller 會根據節點的數量生成對應數量的 Pod,而不是由標準的 kube-scheduler
進行分配。
新節點加入Cluster時:
當一個新節點加入Cluster,DaemonSet Controller 會自動在該節點上部署新的 Pod,保證所有節點的應用一致性。
Pod 調度到容忍的節點:
如果某些節點帶有特定污點(如控制平面節點),DaemonSet 可以通過 tolerations
來允許 Pod 調度到這些節點,確保所有節點都運行該應用。
DaemonSet 的 Pod 調度機制充分考慮了在 Cluster 中運行系統級應用的需求,能夠自動處理新節點的加入與舊節點的移除,並靈活支援對特定節點進行調度。這些特性使得 DaemonSet 成為在分布式環境中運行紀錄收集器、監控代理和網路套件模組等應用的理想選擇。
以下是一個官方提供的 DaemonSet YAML 定義範例,用於在每個節點上部署 Fluentd,來收集並轉發紀錄資料到 Elasticsearch:
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: fluentd-elasticsearch
namespace: kube-system
labels:
k8s-app: fluentd-logging
spec:
selector:
matchLabels:
name: fluentd-elasticsearch
template:
metadata:
labels:
name: fluentd-elasticsearch
spec:
tolerations:
# these tolerations are to have the daemonset runnable on control plane nodes
# remove them if your control plane nodes should not run pods
- key: node-role.kubernetes.io/control-plane
operator: Exists
effect: NoSchedule
- key: node-role.kubernetes.io/master
operator: Exists
effect: NoSchedule
containers:
- name: fluentd-elasticsearch
image: quay.io/fluentd_elasticsearch/fluentd:v2.5.2
resources:
limits:
memory: 200Mi
requests:
cpu: 100m
memory: 200Mi
volumeMounts:
- name: varlog
mountPath: /var/log
# it may be desirable to set a high priority class to ensure that a DaemonSet Pod
# preempts running Pods
# priorityClassName: important
terminationGracePeriodSeconds: 30
volumes:
- name: varlog
hostPath:
path: /var/log
範例解析:
namespace: kube-system
:此 DaemonSet 部署在 kube-system
命名空間中,這通常是系統級應用所在的位置。tolerations
:允許 DaemonSet 在控制平面節點(例如控制器或主節點)上運行。若不希望在這些節點上運行 Pods,可以刪除這部分設定。resources
:設置了資源限制和請求,以確保每個 Pod 在運行時有足夠的計算資源。volumeMounts
和 volumes
:掛載主機的 /var/log
路徑,以便 Fluentd 收集紀錄資料。kubectl get daemonsets
命令查看 Cluster 中的所有 DaemonSet。kubectl get pods -l app=nginx
來查看特定 DaemonSet 創建的所有 Pod。kubectl rollout restart daemonset <daemonset-name>
來觸發滾動更新。DaemonSet 是 Kubernetes 中不可或缺的控制器,適合用來管理需要在所有節點上運行的系統級應用。這種部署方式確保應用在Cluster中隨著節點變動能自動調整,保持高可用性。
接下來在後面的文章中,我們將會深入探討 Kubernetes 中的 Pod 調度策略與資源管理,進一步提高你對 Kubernetes Cluster 的控制和運營能力。