k8s-daemonset

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一樣,這裡就不再贅述,說幾點驗證過的結論。

  1. 刪除ds中某個po後,ds會重新調度給被刪除的node上重新生成一個新的pod
  2. 當有新的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。