一、簡介
在 Kubernetes 中,DaemonSet 是一種控制器類型,用于確保集群中的每個節點運行一個特定的 Pod 實例。通常情況下,DaemonSet 被用來在集群的每個節點上運行一個特定的系統服務或者應用程序副本,例如日志收集器(如 Fluentd 或 Filebeat)、監控代理(如 Prometheus Node Exporter)、存儲解決方案(如 Ceph 的 OSD 部署)等。
二、主要用途
確保每個節點上運行相同的 Pod 實例:
DaemonSet 確保在集群的每個節點上都有一個 Pod 的副本在運行,從而保證了特定任務或服務在整個集群中的普遍性。
1.節點級別的任務部署:
可以用來在每個節點上運行具有特定配置的任務,例如日志收集、監控等任務,這些任務通常需要與節點本身密切關聯。
2.服務發現和負載均衡:
在某些情況下,DaemonSet 可以用于運行網絡服務或負載均衡器的實例,以便每個節點都可以直接處理來自外部的流量。
3.更新和升級:
DaemonSet 也支持更新和升級,可以通過更改 Pod 模板或鏡像來進行滾動更新,確保新的配置或版本可以安全地應用到每個節點。
DaemonSet 的主要作用,是讓你在 k8s 集群里,運行一個 Daemon Pod。
這個 Pod 有如下三個特征:
- 這個 Pod 運行在 k8s 集群里的每一個節點(Node)上;
- 每個節點上只有一個這樣的 Pod 實例;
- 當有新的節點加入 Kubernetes 集群后,該 Pod 會自動地在新節點上被創建出來;而當舊節點被刪除后,它上面的 Pod 也相應地會被回收掉。
舉例:
各種網絡插件的 Agent 組件,都必須運行在每一個節點上,用來處理這個節點上的容器網絡;
各種存儲插件的 Agent 組件,也必須運行在每一個節點上,用來在這個節點上掛載遠程存儲目錄,操作容器的 Volume 目錄;
各種監控組件和日志組件,也必須運行在每一個節點上,負責這個節點上的監控信息和日志搜集。
三、示例
以下是一個簡化的 DaemonSet 示例 YAML 文件,用于在每個節點上運行一個日志收集器:
apiVersion: apps/v1
kind: DaemonSet
metadata:name: fluentdnamespace: kube-system
spec:selector:matchLabels:app: fluentdtemplate:metadata:labels:app: fluentdspec:containers:- name: fluentdimage: fluentd:v1.0.0volumeMounts:- name: varlogmountPath: /var/log- name: varlibdockercontainersmountPath: /var/lib/docker/containersreadOnly: truevolumes:- name: varloghostPath:path: /var/log- name: varlibdockercontainershostPath:path: /var/lib/docker/containers
解釋
- metadata.name: DaemonSet 的名稱為 fluentd。
- spec.selector.matchLabels: 選擇器用于選擇要管理的 Pod,這里選擇 app: fluentd 標簽的 Pod。
- spec.template: 定義要創建的 Pod 的模板。
- spec.template.spec.containers: 定義 Pod 中運行的容器,這里是 fluentd 容器。
- spec.template.spec.volumes: 定義 Pod 使用的卷,用于將宿主機的日志目錄和 Docker 容器目錄掛載到容器內部,以便收集日志。
創建 DaemonSet 對象
kubectl create -f fluentd-elasticsearch.yaml
查看 DaemonSet 對象
[root@k8s-master set]# kubectl get ds -n kube-system fluentd-elasticsearch
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
fluentd-elasticsearch 3 3 3 3 3 <none> 22m
注:k8s 里比較長的 API 對象都有短名字,比如 DaemonSet 對應的是 ds,Deployment 對應的是 deploy。