用于节点专属任务的 DaemonSets
使用 DaemonSets 在 Cluster 的全部或指定节点上运行 Pod 副本,以执行 Cluster 级操作。
用于节点专属任务的 DaemonSets 是 CoddyKit 上的免费 Kubernetes Basics 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Kubernetes Basics 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Kubernetes Basics 课程共包含 4 节课。
什么是 DaemonSets
想象一下,您需要在集群的每一台服务器上运行某个特定工具或服务。例如,一个从每台机器收集日志的日志记录代理。
这正是 DaemonSets 发挥作用的地方!部署的目标是在集群的某处保持一定数量的容器组运行,而 DaemonSet 则确保在所有节点(或选定节点)上各运行一个容器组副本。
DaemonSets 的常见用途
DaemonSets 非常适合需要在节点级别运行的任务。以下是一些常见示例:
- 日志记录代理:使用 Fluentd 或 Logstash 等工具从每个节点收集日志。
- 监控代理:使用 Prometheus Node Exporter 从每台服务器收集指标。
- 存储守护进程:使用 GlusterFS 或 Ceph 等服务在每个节点上提供分布式存储。
- 网络代理:Kubernetes 自带的 Kube-proxy 以 DaemonSet 形式运行,用于管理网络规则。
基本 DaemonSet 清单
DaemonSet 的定义与部署非常相似。关键区别在于 kind: DaemonSet。下面来看一个基本结构:
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: my-daemonset
spec:
selector:
matchLabels:
app: my-daemonset-app
template:
metadata:
labels:
app: my-daemonset-app
spec:
containers:
- name: my-container
image: busybox
command: ["sh", "-c", "echo 'Hello from DaemonSet on node $(NODE_NAME)'; sleep 3600"]
env:
- name: NODE_NAME
valueFrom:
fieldRef:
fieldPath: spec.nodeNameYAML 的关键部分
下面分解 DaemonSet 清单中的重要部分:
kind: DaemonSet:这会告知 Kubernetes,我们希望管理特定于节点的容器组。spec.selector:非常重要!它定义了 DaemonSet 如何使用标签查找并管理其容器组。spec.template:这是容器组本身的定义。它与部署中的容器组模板几乎完全相同,描述了将在每个节点上运行的容器组所使用的容器、卷及其他设置。
部署到所有节点
下面是一个简单的 DaemonSet,它会在每个符合条件的节点上运行一个 busybox 容器,并打印一条消息,说明它正在运行在哪个节点上。
这是集群范围代理常用的模式。
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: node-hello-daemon
spec:
selector:
matchLabels:
app: node-hello
template:
metadata:
labels:
app: node-hello
spec:
containers:
- name: hello-container
image: busybox
command: ["sh", "-c", "while true; do echo 'Hello from node: $(NODE_NAME)'; sleep 5; done"]
env:
- name: NODE_NAME
valueFrom:
fieldRef:
fieldPath: spec.nodeName启动您的 DaemonSet
要在 Kubernetes 集群中创建 DaemonSet,请使用刚才看到的 YAML 文件和熟悉的 kubectl apply 命令:
kubectl apply -f node-hello-daemonset.yaml
随后,Kubernetes 会确保在符合 DaemonSet 条件的每个节点上调度一个容器组。
检查 DaemonSet 状况
应用配置后,您可以检查 DaemonSet 的状态及其创建的容器组:
- 查看 DaemonSet:
kubectl get ds - 查看每个节点上运行的各个容器组:
kubectl get pods -l app=node-hello -o wide
-o wide 选项有助于您查看每个容器组被调度到了哪个节点。
在选定节点上运行 DaemonSets
如果您只希望 DaemonSet 在部分节点上运行,该怎么办?例如,只在配备 GPU 的节点上运行,或只在专用于存储的节点上运行。
您可以使用 nodeSelector 实现这一点。容器组 spec 中的此字段(位于 DaemonSet 的模板内)允许您指定节点标签;节点必须具有这些标签,容器组才会被调度到该节点。
在 YAML 中使用节点选择器
让我们修改之前的 DaemonSet,使其只在带有 disktype: ssd 标签的节点上运行。首先,您需要为节点添加标签,例如 kubectl label node <node-name> disktype=ssd。
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: ssd-monitor-daemon
spec:
selector:
matchLabels:
app: ssd-monitor
template:
metadata:
labels:
app: ssd-monitor
spec:
nodeSelector:
disktype: ssd # Only runs on nodes with this label
containers:
- name: monitor-container
image: busybox
command: ["sh", "-c", "while true; do echo 'Monitoring SSD on node: $(NODE_NAME)'; sleep 10; done"]
env:
- name: NODE_NAME
valueFrom:
fieldRef:
fieldPath: spec.nodeNameDaemonSet 的能力
您已经了解 DaemonSets 的工作方式。现在来检验一下您的理解!
DaemonSets:要点总结
做得很好!您已经成功了解了 Kubernetes DaemonSets。
- DaemonSets 确保每个符合条件的节点上都运行一个容器组。
- 它们对于日志记录、监控和存储代理等节点级操作至关重要。
- 您可以使用
nodeSelector指定特定节点。 - DaemonSets 使用
kind: DaemonSet定义,并采用类似部署的容器组模板。
接下来,您将学习如何使用 StatefulSets 管理有状态应用!
常见问题解答
「用于节点专属任务的 DaemonSets」课时是免费的吗?
是的 — 「用于节点专属任务的 DaemonSets」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Kubernetes Basics 课程的其余内容,请升级到 CoddyKit PRO。 Kubernetes Basics 课程共包含 4 节课。
「用于节点专属任务的 DaemonSets」这节课中我会学到什么?
使用 DaemonSets 在 Cluster 的全部或指定节点上运行 Pod 副本,以执行 Cluster 级操作。 你通过在浏览器中直接运行的动手代码来练习 Kubernetes Basics,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Kubernetes Basics 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Kubernetes Basics 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。
「用于节点专属任务的 DaemonSets」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Kubernetes Basics 课中编写并运行代码吗?
能。每节 Kubernetes Basics 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- 有状态应用的 StatefulSets
- 用于节点专属任务的 DaemonSets
- 了解 Kubernetes Operator
- 自定义资源定义(CRD)