1. DaemonSet 概述
- ?定義?:DaemonSet 確保 Kubernetes 集群的每個節點上運行一個 Pod 實例。
- ?特性?:
- 每個節點上只有一個 Pod 實例。
- 新節點加入集群時,會自動在新節點上創建 Pod。
- 舊節點被刪除時,其上的 Pod 會被回收。
2. DaemonSet 的應用場景
- ?網絡插件?:處理容器網絡。
- ?存儲插件?:掛載遠程存儲目錄,操作容器的 Volume 目錄。
- ?監控和日志?:收集節點的監控信息和日志。
3. DaemonSet 的工作原理
- 控制器模型?:
- DaemonSet Controller 從 Etcd 獲取所有節點列表。
- 遍歷節點,檢查并管理 Pod。
- ?nodeAffinity?:
- 創建 Pod 時,DaemonSet 自動為 Pod 添加 nodeAffinity,確保 Pod 只在指定節點上啟動。
- ?tolerations?:
- DaemonSet 為 Pod 添加 tolerations,使 Pod 能夠“容忍”某些節點的“污點”(Taint),忽略調度限制。
4. DaemonSet的YAML配置示例
- ?fluentd-elasticsearch示例?:配置一個fluentd-elasticsearch鏡像的Pod,用于收集Docker容器日志并轉發到ElasticSearch。
apiVersion: apps/v1
kind: DaemonSet
metadata:name: fluentd-elasticsearchnamespace: kube-systemlabels:k8s-app: fluentd-logging
spec:selector:matchLabels:name: fluentd-elasticsearchtemplate:metadata:labels:name: fluentd-elasticsearchspec:tolerations:- key: node-role.kubernetes.io/mastereffect: NoSchedulecontainers:- name: fluentd-elasticsearchimage: k8s.gcr.io/fluentd-elasticsearch:1.20resources:limits:memory: 200Mirequests:cpu: 100mmemory: 200MivolumeMounts:- name: varlogmountPath: /var/log- name: varlibdockercontainersmountPath: /var/lib/docker/containersreadOnly: trueterminationGracePeriodSeconds: 30volumes:- name: varloghostPath:path: /var/log- name: varlibdockercontainershostPath:path: /var/lib/docker/containers
5. DaemonSet 的版本管理與滾動更新
- ?版本管理?:
- 使用 ControllerRevision API 對象記錄和管理 DaemonSet 的版本。
- ?滾動更新?:
- 修改 DaemonSet 的 Pod 模板觸發滾動更新。
- 使用?
kubectl set image
?命令更新鏡像版本。 - 示例:
kubectl set image ds/fluentd-elasticsearch fluentd-elasticsearch=k8s.gcr.io/fluentd-elasticsearch:v2.2.0
- ?回滾?:
- 使用?
kubectl rollout undo
?命令將 DaemonSet 回滾到歷史版本。 - 示例:
kubectl rollout undo daemonset fluentd-elasticsearch --to-revision=1 -n kube-system
- 使用?
?