K8S resource: DaemonSet

Albert Weng
4 min readSep 20, 2023

--

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

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

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

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

1. 架構

使用情境:

  • Cluster storage Daemon:如glusterd, ceph 要部署在每個節點上以提供持久性儲存。
  • 節點監控Daemon:如Prometheus監控集群,在每個節點上都運行一個node-exporter來收集監控節點的訊息
  • 日誌收集Daemon:如fluented, logstash。在每個節點上運行以收集容器的日誌
  • 節點網路plugin:如flannel, calico。在每個節點上運行為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從節點上刪除。

--

--

Albert Weng
Albert Weng

Written by Albert Weng

You don't have to be great to start, but you have to start to be great

No responses yet