← 返回文章列表
Kubernetes DaemonSet 完全指南
深入理解 Kubernetes DaemonSet:每个节点运行一个 Pod 的最佳实践
5 分钟阅读
字号
Kubernetes DaemonSet 完全指南
本文基于 Kubernetes 1.28
概述
DaemonSet 确保每个节点都运行一个指定的 Pod 副本。当新节点加入集群时,Pod 自动在新节点上创建;当节点离开集群时,Pod 自动回收。
DaemonSet 是部署节点级任务的理想选择,如日志收集、监控代理、网络插件等。
一、为什么需要 DaemonSet
Deployment 的局限
Deployment replicas=3:
- K8s 调度器决定 Pod 放在哪 3 个节点
- 可能不是所有节点都有 Pod
- 新节点加入需要手动扩缩容DaemonSet 的优势
DaemonSet:
- 每个节点自动运行一个 Pod
- 新节点加入自动创建 Pod
- 节点离开自动回收 Pod
- 适合节点级任务二、典型使用场景
| 场景 | 示例 |
|---|---|
| 日志收集 | Fluentd、Filebeat、Logstash |
| 节点监控 | Node Exporter、cAdvisor |
| 网络插件 | Flannel、Calico、Cilium |
| 存储插件 | CSI 驱动、Ceph 客户端 |
| 安全监控 | Falco、Tripwire |
| kube-proxy | 每个节点的代理 |
三、YAML 详解
基础示例
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: fluentd
namespace: kube-system
spec:
# 1. 选择器
selector:
matchLabels:
app: fluentd
# 2. Pod 模板
template:
metadata:
labels:
app: fluentd
spec:
# 3. 容忍(可以跑在 Master 等有 taint 的节点)
tolerations:
- key: node-role.kubernetes.io/master
effect: NoSchedule
operator: Exists
- key: node-role.kubernetes.io/control-plane
effect: NoSchedule
operator: Exists
containers:
- name: fluentd
image: fluentd:v1.6
resources:
requests:
cpu: "100m"
memory: "200Mi"
limits:
cpu: "500m"
memory: "500Mi"
volumeMounts:
- name: varlog
mountPath: /var/log
- name: varlibdockercontainers
mountPath: /var/lib/docker/containers
volumes:
- name: varlog
hostPath:
path: /var/log
- name: varlibdockercontainers
hostPath:
path: /var/lib/docker/containers四、DaemonSet vs Deployment
| 特性 | Deployment | DaemonSet |
|---|---|---|
| 副本控制 | 指定 replicas | 每节点 1 个 |
| 调度 | K8s 调度器 | 自动每节点一个 |
| 新节点 | 需手动扩缩容 | 自动创建 |
| 适合场景 | 应用副本 | 节点级 Agent |
五、调度控制
节点亲和性
spec:
template:
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: disktype
operator: In
values:
- ssd节点选择器
spec:
template:
spec:
nodeSelector:
node-type: compute污点和容忍
spec:
template:
spec:
tolerations:
# 容忍 Master 节点的 taint
- key: node-role.kubernetes.io/master
effect: NoSchedule
operator: Exists
# 容忍所有 taint
- operator: Exists
effect: NoSchedule六、常用命令
# 查看 DaemonSet
kubectl get daemonset -n kube-system
# 查看每个节点的 Pod 分布
kubectl get pods -n kube-system -o wide | grep fluentd
# 查看 DaemonSet 详情
kubectl describe daemonset fluentd -n kube-system
# 删除 DaemonSet
kubectl delete daemonset fluentd -n kube-system七、更新策略
RollingUpdate(默认)
spec:
updateStrategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 1 # 最多不可用 1 个节点OnDelete
spec:
updateStrategy:
type: OnDelete # 手动删除 Pod 才更新八、实际示例
场景:日志收集
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: filebeat
namespace: kube-system
spec:
selector:
matchLabels:
app: filebeat
template:
metadata:
labels:
app: filebeat
spec:
serviceAccount: filebeat
tolerations:
- operator: Exists
effect: NoSchedule
containers:
- name: filebeat
image: elastic/filebeat:8.11.0
env:
- name: setup.kibana.host
value: "kibana:5601"
- name: output.elasticsearch.hosts
value: "elasticsearch:9200"
securityContext:
runAsUser: 0
volumeMounts:
- name: data
mountPath: /usr/share/filebeat/data
- name: varlibdockercontainers
mountPath: /var/lib/docker/containers
readOnly: true
- name: varlogs
mountPath: /var/log
readOnly: true
volumes:
- name: data
emptyDir: {}
- name: varlibdockercontainers
hostPath:
path: /var/lib/docker/containers
- name: varlogs
hostPath:
path: /var/log九、总结
DaemonSet = 每个节点运行一个 Pod
适用场景:
- 日志收集
- 节点监控
- 网络插件
- 存储插件
特点:
- 自动在每个节点运行
- 新节点自动创建 Pod
- 节点离开自动回收 Pod相关文档
分享