
📋 目录
- 什么是DaemonSet? 🤔
- 为什么要使用DaemonSet? 💡
- 实践: 创建DaemonSet 🛠️
- 也想部署到Control Plane吗? (Taint & Toleration) 🔐
- 总结与回顾 🏁
1. 什么是DaemonSet? 🤔
在Kubernetes中,DaemonSet(守护进程集)是一个控制器,它确保在所有(或特定)节点上维护恰好一个Pod。
如果说普通的Deployment是根据节点的空闲资源进行适当分散部署的方式,那么DaemonSet可以看作是一个“当新节点添加时,自动在该节点上运行Pod”的忠诚管理员。
2. 为什么要使用DaemonSet? 💡
什么时候需要在所有节点上运行相同的服务呢? 主要与系统运维相关的任务。
- 日志收集: 收集每个节点日志的fluentd或logstash。
- 监控: 监控节点状态的Prometheus Node Exporter。
- 网络配置: 配置集群网络的kube-proxy或Calico等CNI插件。
3. 实践: 创建DaemonSet 🛠️
让我们看看最基本的DaemonSet YAML文件。这个例子是一个在所有节点上运行的简单nginx守护进程集。
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: fluentd-elasticsearch
namespace: kube-system
labels:
k8s-app: fluentd-logging
spec:
selector:
matchLabels:
name: fluentd-elasticsearch
template:
metadata:
labels:
name: fluentd-elasticsearch
spec:
containers:
- name: fluentd-elasticsearch
image: quay.io/fluentd_elasticsearch/fluentd:v2.5.2
应用此文件后,每个普通的Worker Node上都会创建一个Pod。但是,会出现一个问题。那就是在Control Plane(Master Node)上不会创建Pod。
4. 也想部署到Control Plane吗? (Taint & Toleration) 🔐
Kubernetes的Master节点(Control Plane)是一个非常重要的地方。因此,它默认配置了Taint(污点),“禁止”普通Pod进入。
① 检查Master节点的Taint
首先,让我们检查Master节点上有什么“污点”。
kubectl describe node <마스터-노드-이름> | grep Taints
通常会得到如下结果:Taints: node-role.kubernetes.io/control-plane:NoSchedule
这意味着“此节点是control-plane角色,因此不要调度未经许可的Pod (NoSchedule)。”
② 配置Toleration(容忍)
要让DaemonSet也能在Master节点上运行,您需要在Pod配置中添加能够承受此“污点(Taint)”的“容忍(Toleration)”。
请查看修改后的YAML的spec部分。
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: fluentd-elasticsearch
spec:
# ... (省略)
template:
spec:
# 这是关键!
tolerations:
- key: node-role.kubernetes.io/control-plane
operator: Exists
effect: NoSchedule
- key: node-role.kubernetes.io/master
operator: Exists
effect: NoSchedule
containers:
- name: fluentd-elasticsearch
image: quay.io/fluentd_elasticsearch/fluentd:v2.5.2
- key: 在Master节点上确认的Taint的键值。
- operator: Exists表示只要该键存在即可。
- effect: 允许在NoSchedule状态下也忽略并进入。
这样设置后,DaemonSet不仅可以在普通节点上运行,也可以在Control Plane节点上堂堂正正地运行了。
5. 总结与回顾 🏁
DaemonSet是负责整个集群维护和运营的核心组件。
- DaemonSet确保每个节点有1个Pod。
- 节点增加时自动扩展。
- 要部署到Control Plane,必须检查该节点的Taint,并配置相应的Toleration。
现在,您可以在集群的每个角落部署所需的服务了! 🚀
发表回复