iT邦幫忙

2024 iThome 鐵人賽

DAY 17
0
Kubernetes

Kubernetes三十天就上手系列 第 17

Day 17- DaemonSet 在每個節點上運行 Pod

  • 分享至 

  • xImage
  •  

DaemonSet: 在每個節點上運行 Pod

使用 DaemonSet 管理系統級應用

DaemonSet 是 Kubernetes 中的一種控制器,用來確保某個 Pod 在 Cluster 中的每個節點上都能運行一個實例。這使得 DaemonSet 成為管理系統級應用的理想選擇,特別適用於那些需要在所有節點上運行的應用,如紀錄收集器、監控代理、以及網路套件模組。

DaemonSet 的基本概念

  1. 在每個節點上運行 Pod
    DaemonSet 保證每個節點上至少運行一個 Pod。舉例來說,若你的 Cluster 有五個節點,創建一個 DaemonSet 後,每個節點將分配一個對應的 Pod。

  2. 自動處理新節點的加入與移除
    當新的節點加入 Cluster 時,DaemonSet 會自動在這些新節點上部署 Pod。同樣,若節點被移除,該節點上的 DaemonSet Pod 也會被自動清除。

  3. 滾動更新
    DaemonSet 支援滾動更新,這樣可以在不影響服務的情況下逐步更新應用。Kubernetes 會依次更新每個節點上的 Pod,確保 Cluster 的高可用性。

DaemonSet 的運行架構

DaemonSet 運行架構示意圖

如圖所示,當你創建一個 DaemonSet 時,它會在 Cluster 中的每個節點(如 Node-1、Node-2 和 Node-3)上部署一個 Pod。這些 Pod 的部署是自動化且一致的,確保所有節點均運行相同的應用程式(如監控代理或網路套件模組)。

圖中展示的流程強調了 DaemonSet 的自動化特性,使得當新節點加入時,Pod 會自動在新節點上部署,並在節點移除時自動清除。

DaemonSet 的應用場景

  1. 系統監控
    DaemonSet 可用來部署如 Prometheus Node Exporter 或 Datadog Agent 等監控代理,以便在每個節點上收集資源使用情況和性能指標,並匯總至中央監控系統。

  2. 紀錄收集
    紀錄收集器如 Fluentd 或 Filebeat 可以通過 DaemonSet 在每個節點上運行,並將節點上的紀錄檔案傳輸到中央化的紀錄系統(例如 Elasticsearch)。

  3. 網路套件模組
    DaemonSet 經常用於在所有節點上運行網路套件模組,如 Calico、Weave 或 Flannel,這些套件模組為 Kubernetes 提供網路通訊功能。

  4. 安全監控
    安全代理如 Falco 可以通過 DaemonSet 部署,用來監控節點上的安全事件,並即時檢測異常行為。

Daemon Pods 調度機制

DaemonSet Pod 的調度機制與普通 Pod 略有不同,它具有以下幾個特點:

  1. 直接調度到節點

    • DaemonSet Pod 並不依賴於 Kubernetes 的標準調度器 (kube-scheduler) 來分配節點。相反,當 DaemonSet 被創建或更新時,Kubernetes 自動在 Cluster 的每個節點上生成一個 Pod,而不需要標準調度流程。
  2. 新節點加入時自動部署

    • 當新的節點加入 Cluster 時,DaemonSet 會立即在該節點上創建對應的 Pod,而無需手動干預。這一機制確保即使 Cluster 動態變化,系統級應用仍然能在所有節點上自動運行。
  3. 考慮節點容忍度 (Tolerations)

    • DaemonSet 支援在有特殊標記(如控制平面節點、帶有特定污點的節點)上的 Pod 調度。這些通過 tolerations 來設定,確保某些 DaemonSet Pod 可以在標準 Pod 無法運行的節點上部署。
  4. 控制平面節點的特殊處理

    • 預設情況下,普通 Pod 不會調度到控制平面節點上。但 DaemonSet 可以通過設定 tolerations 允許 Pod 運行在這些節點上,這對於像 Fluentd 這類需要收集所有節點紀錄的應用來說尤為重要。
  5. 資源預留與優先級

    • 在一些情況下,DaemonSet Pod 需要比其他工作負載更高的優先級,以確保它們在節點上的資源得到保障。這可以通過設定 priorityClassName 來實現,防止其他低優先級的 Pod 佔用關鍵資源。
  6. Pod 自動清理

    • 當節點從 Cluster 中移除時,DaemonSet 會自動清理該節點上的 Pod,無需手動操作,確保資源不被浪費。

Pod 調度過程的簡化流程

  1. DaemonSet Controller 創建 Pod
    當 DaemonSet 被創建時,DaemonSet Controller 會根據節點的數量生成對應數量的 Pod,而不是由標準的 kube-scheduler 進行分配。

  2. 新節點加入Cluster時
    當一個新節點加入Cluster,DaemonSet Controller 會自動在該節點上部署新的 Pod,保證所有節點的應用一致性。

  3. Pod 調度到容忍的節點
    如果某些節點帶有特定污點(如控制平面節點),DaemonSet 可以通過 tolerations 來允許 Pod 調度到這些節點,確保所有節點都運行該應用。

DaemonSet 的 Pod 調度機制充分考慮了在 Cluster 中運行系統級應用的需求,能夠自動處理新節點的加入與舊節點的移除,並靈活支援對特定節點進行調度。這些特性使得 DaemonSet 成為在分布式環境中運行紀錄收集器、監控代理和網路套件模組等應用的理想選擇。

創建 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 在運行時有足夠的計算資源。
  • volumeMountsvolumes:掛載主機的 /var/log 路徑,以便 Fluentd 收集紀錄資料。

管理 DaemonSet

  • 查看 DaemonSet:使用 kubectl get daemonsets 命令查看 Cluster 中的所有 DaemonSet。
  • 查看 DaemonSet Pod:使用 kubectl get pods -l app=nginx 來查看特定 DaemonSet 創建的所有 Pod。
  • 滾動更新 DaemonSet:使用 kubectl rollout restart daemonset <daemonset-name> 來觸發滾動更新。

DaemonSet 與其他控制器的區別

  • DaemonSet vs. Deployment:Deployment 通常用於管理無狀態應用,通過 ReplicaSet 控制 Pod 的副本數量,而 DaemonSet 保證每個節點上運行一個 Pod。
  • DaemonSet vs. StatefulSet:StatefulSet 更適合有狀態應用,提供穩定的網路標識和持久儲存,而 DaemonSet 專注於無狀態、系統級應用的部署。

總結

DaemonSet 是 Kubernetes 中不可或缺的控制器,適合用來管理需要在所有節點上運行的系統級應用。這種部署方式確保應用在Cluster中隨著節點變動能自動調整,保持高可用性。

接下來在後面的文章中,我們將會深入探討 Kubernetes 中的 Pod 調度策略與資源管理,進一步提高你對 Kubernetes Cluster 的控制和運營能力。


上一篇
Day 16- StatefulSet 管理有狀態應用
下一篇
Day 18- Job 與 CronJob 處理一次性和定期任務
系列文
Kubernetes三十天就上手30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言