1. 簡介
DaemonSet 確保全部(或者某些)節點上執行一個 Pod 的副本。 當有節點加入叢集時, 也會為他們新增一個 Pod 。 當有節點從叢集移除時,這些 Pod 也會被回收。刪除 DaemonSet 將會刪除它建立的所有 Pod。
DaemonSet 的一些典型用法:
- 在每個節點上執行叢集守護程式
- 在每個節點上執行日誌收集守護程式
- 在每個節點上執行監控守護程式
2. quick start
2.1 建立ds
資源模板ds-nginx.yaml
資訊如下:
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: nginx-ds
labels:
app: nginx
spec:
selector:
# must be match .spec.template.matadata.labels
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
# 汙點容忍配置 新增此配置後,ds可以執行到 master 節點
tolerations:
# this toleration is to have the daemonset runnable on master nodes
# remove it if your masters can't run pods
- key: node-role.kubernetes.io/master
operator: Exists
effect: NoSchedule
containers:
- name: nginx
image: nginx
ports:
- name: http
containerPort: 80
建立資源
$ kubectl create -f ds-nginx.yaml
2.2 檢視ds
檢視ds資訊
# kubectl get ds -owide
$ kubectl get -f ds-nginx.yaml -owide
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE CONTAINERS IMAGES SELECTOR
nginx-ds 2 2 2 2 2 <none> 19m nginx nginx app=nginx
pod資訊如下
master 和 node 各執行一個pod
$ kubectl get po -owide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-ds-7n8qj 1/1 Running 0 20m 10.100.235.209 k8s-master <none> <none>
nginx-ds-htrvw 1/1 Running 0 20m 10.100.132.168 k8s-woker-01 <none> <none>
2.3 修改/刪除 ds
ds 修改刪除沒什麼特別的,操作基本和deploy一樣,這裡就不再贅述,說幾點驗證過的結論。
- 刪除ds中某個po後,ds會重新排程給被刪除的node上重新生成一個新的pod
- 當有新的node加入叢集后,ds會給新加入的node建立一個pod
3. 與 Daemon Pods 通訊
與 DaemonSet 中的 Pod 進行通訊的幾種可能模式如下:
- 推送(Push):配置 DaemonSet 中的 Pod,將更新傳送到另一個服務,例如統計資料庫。 這些服務沒有客戶端。
- NodeIP 和已知埠:DaemonSet 中的 Pod 可以使用
hostPort
,從而可以通過節點 IP 訪問到 Pod。客戶端能通過某種方法獲取節點 IP 列表,並且基於此也可以獲取到相應的埠。 - DNS:建立具有相同 Pod 選擇算符的 headless-services(無頭服務), 通過使用
endpoints
資源或從 DNS 中檢索到多個 A 記錄來發現 DaemonSet。 - Service:建立具有相同 Pod 選擇算符的服務,並使用該服務隨機訪問到某個節點上的 守護程式(沒有辦法訪問到特定節點)。
4. 僅在某些節點上執行 Pod
如果指定了 .spec.template.spec.nodeSelector
,DaemonSet 控制器將在能夠與 Node 選擇算符
匹配的節點上建立 Pod。 類似這種情況,可以指定 .spec.template.spec.affinity
,之後 DaemonSet 控制器 將在能夠與節點親和性
匹配的節點上建立 Pod。 如果根本就沒有指定,則 DaemonSet Controller 將在所有節點上建立 Pod。