深入解读kubernetes的DaemonSet原理剖析及使用指南
-
Daemonset介绍:
- Daemonset是k8s中的一种控制器,用于确保集群中符合条件的每个节点上(或特定标签选择器匹配的节点)运行一个 Pod 的副本。当有新节点加入集群时,DaemonSet 会自动为这些节点创建 Pod;当节点从集群移除时,这些 Pod 也会被回收。
-
Daemonset使用场景:
- 日志收集:在节点上部署 Filebeat 等日志采集工具,收集节点或容器日志,用来做分析问题,排查问题使用。
- 监控指标:在节点上部署Prometheus Node Exporte、包括安装agent等监控组件,包括自研的监控产品所带的agent组件等。
- 网络插件:部署 Calico、Cilium 等 CNI 插件,为节点提供网络功能。
- 包括存储类插件等
-
Daemonset 创建:
apiVersion: apps/v1 kind: DaemonSet metadata: name: fluentd-es namespace: kube-system labels: k8s-app: fluentd-logging spec: selector: matchLabels: name: fluentd-es template: metadata: labels: name: fluentd-es spec: containers: - name: fluentd-es image: quay.io/fluentd_es/fluentd:v2.5.2 # 镜像名称 resources: limits: memory: 200Mi requests: cpu: 100m memory: 200Mi volumeMounts: - name: varlog mountPath: /var/log/es volumes: - name: varlog hostPath: path: /var/log/es - Daemonset需要配置 `apiVersion`、`kind` 和 `metadata`字段,且名称必须是合法的DNS子域名。 - `apiVersion`定义了API版本,`apps/v1`是DaemonSet资源的稳定版本。 - `kind`指明资源类型,这里是`DaemonSet`。 - `metadata`包含DaemonSet对象的元数据,例如名称和标签。 - `spec`定义了DaemonSet的具体规格,包括选择器和模板。 - `selector`:用于指定该DaemonSet管理哪些Pod。 - `template`:定义了Pod的模板,包括容器、资源需求等。 创建Daemonset: - kubectl apply -f es-daemonset.yaml
-
Daemon Pods是如何被调度的:
- Daemonset控制器会自动将pod调度到符合条件的节点上,默认调度器也可以用于调度daemonset Pod。
-
污点和容忍度:
- DaemonSet 控制器会自动为 DaemonSet Pod 添加一组容忍度,允许 Pod 调度到具有特定污点的节点上。
-
与Daemon Pod的通信:
- 配置 Daemonset Pod将数据发送到其他服务。
- 通过节点IP和端口访问Daemonset Pod。
- 也可以通过服务随机访问某个节点上的Daemonset Pod。
-
DaemonSet命令:
-
查看 DaemonSet 状态:
-
kubectl get daemonset -n <namespace>
-
-
查看 Pod 分布:
-
kubectl get pods -l name=fluentd -o wide
-
-
更新 DaemonSet
修改 YAML 文件后重新应用(如更新镜像版本):-
kubectl apply -f fluentd-daemonset.yaml
-
-
删除 DaemonSet:
-
kubectl delete daemonset fluentd-logging
-
-
-
限制Daemonset的节点范围
通过
nodeSelector
选择特定标签的节点:spec: template: spec: nodeSelector: disktype: aaa # 仅调度到带有 `disktype=aaa` 标签的节点 (替换为实际的)
-
滚动更新策略
配置更新策略(默认策略是
OnDelete
,推荐使用RollingUpdate
):spec: updateStrategy: type: RollingUpdate rollingUpdate: maxUnavailable: 1 # 更新时最多允许不可用的 Pod 数量
-
资源限制
DaemonSet 的 Pod 设置资源请求和限制:
containers: - name: fluentd resources: requests: cpu: "100m" memory: "200Mi" limits: memory: "500Mi"
-
亲和性和反亲和性
控制 Pod 在节点上的调度策略:
spec: template: spec: affinity: podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: name operator: In values: [fluentd] topologyKey: kubernetes.io/hostname
总结:
DaemonSet 是k8s中用于确保每个节点运行特定 Pod 的核心工具,特别适合部署系统级服务。通过合理配置节点选择器、污点容忍和资源限制,可以高效管理集群的基础设施组件。
分类:
kubernetes学习
标签:
kubernetes
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· 上周热点回顾(2.17-2.23)