更新於 2024/10/11閱讀時間約 6 分鐘

淺談K8S DaemonSet

今天繼續來說明一個很重要的元件:DaemonSet

所謂daemonset,簡單來說就是在每個節點上部署一個Pod副本。當今天有新的主機節點加入時,就自動再上面部署一個Pod副本。移除節點時,也會自動將Pod副本移除。

與一般Pod副本不同的是,DaemonSet類型的Pod是由DeamonSet controller提前決定Pod要部署在那個地方運行。

一個蘿蔔一個坑

Note: 如果要指定那個節點不能讓DeamonSet Pod部署時,可以對該節點打上taint

1. 架構

DaemonSet 是 Kubernetes 中一種工作負載的形式,確保所有(或部分)節點運行特定 Pod 的複本。它們通常用於部署系統守護程序、日誌收集器或其他背景任務,以確保集群中的每個節點運行這些 Pod。

DaemonSet 的主要特點包括:

  1. 節點關聯性: DaemonSet 使用節點選擇器(nodeSelector)或節點親和性規則來確定應該在哪些節點上安排 Pod。
  2. 維護和擴展: 當節點添加或移除時,DaemonSet 會自動調整,確保每個節點上都運行一個 Pod。
  3. 自我修復: 如果節點故障或新增節點,DaemonSet 會自動替換受影響節點上的 Pod,以保持所需的狀態。
  4. 集群級部署: DaemonSet 確保特定的 Pod 在所有合格的節點上運行,非常適用於處理集群級任務。

DaemonSet 是 Kubernetes 中的一個關鍵資源,用於管理背景服務,確保特定的 Pod 在集群中的每個節點上運行。

2. 測試

#-----------------------------------------------
# S2-1. 在每一個節點部署一個nginx pod
#-----------------------------------------------
[master]# kubectl create ns nginx-ds
[master]# vim nginx-ds.yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: nginx-ds
namespace: nginx-ds
spec:
selector:
matchLabels:
k8s-app: nginx
template:
metadata:
labels:
k8s-app: nginx
spec:
containers:
- image: nginx:1.7.9
name: nginx
ports:
- name: http
containerPort: 80

[master]# kubectl create -f nginx-ds.yaml -n nginx-ds
[master]# kubectl get nodes; kubectl get pod -l k8s-app=nginx -o wide -n nginx-ds
#-----------------------------------------------
# S2-2. 確認節點是否有打上taints
#-----------------------------------------------
[master]# kubectl describe node master01 | grep Taints
[master]# kubectl describe node master02 | grep Taints
[master]# kubectl describe node master03 | grep Taints
[master]# kubectl describe node worker01 | grep Taints
[master]# kubectl describe node worker02| grep Taints

3. 如何確保每個Node都只有一個被管理的Pod

每個節點都自動安排一個服務

  • DaemonSet controller從ETCD取得所有的Node列表,對每個node做review
  • 根據CRD的定義是否有schedule相關的配置,然後分別檢查Node是否符合要求
  • 在可運行的Pod節點上檢查是否已經有對應的Pod存在。如果沒有就在該Node建立Pod。如果有且數量大於1就會把多餘的Pod從節點上刪除。


4. 常見的應用情境

每個節點都需要監控

  • 日誌收集和監控:當你需要在每個節點上運行一個日誌或監控代理,DaemonSet可以確保每個節點都有這個代理運行,從而集中收集系統日誌或應用程序指標。例如Prometheus監控集群,在每個節點上都運行一個node-exporter來收集監控節點的訊息,或是fluented, logstash。在每個節點上運行以收集容器的日誌。
  • 網路代理:對於需要節點級網路代理的應用程序,如CNI,你可以使用DaemonSet確保每個節點都運行這個代理。例如flannel, calico。在每個節點上運行為Pod提供網路服務
  • 分佈式存儲:當你需要在每個節點上運行分佈式存儲代理,以實現數據持久性和可用性,DaemonSet也非常適用。例如glusterd, ceph 要部署在每個節點上以提供持久性儲存。
  • 應用程式資料庫:對於某些應用程式,每個節點可能需要本地存儲或快取資料庫的副本。DaemonSet可以確保這些副本在每個節點上運行。
  • Node-Level操作:當你需要執行僅涉及單個節點的操作時,如特定節點的升級或清理,DaemonSet可以幫助你在每個節點上執行操作。


5. 結論

DaemonSet在許多容器化的應用服務是很常見的,這裡簡單說明了一些基本觀念與常見的情境,不管是管理或是開發人員都可以在理解這些觀念後對於容器化應用的運營和管理提供了極大的幫助。熟練 DaemonSet 的使用,也有助於確保服務在整個集群中保持一致性。


分享至
成為作者繼續創作的動力吧!
© 2024 vocus All rights reserved.