0Pricing
DevOps Bootcamp · 课时

用于节点专属任务的 DaemonSets

使用 DaemonSets 在 Cluster 的全部或指定节点上运行 Pod 副本,以执行 Cluster 级操作。

用于节点专属任务的 DaemonSets 是 CoddyKit 上的免费 DevOps Bootcamp 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 DevOps Bootcamp 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 DevOps Bootcamp 课程共包含 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.nodeName

YAML 的关键部分

下面分解 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.nodeName

DaemonSet 的能力

您已经了解 DaemonSets 的工作方式。现在来检验一下您的理解!

DaemonSets:要点总结

做得很好!您已经成功了解了 Kubernetes DaemonSets。

  • DaemonSets 确保每个符合条件的节点上都运行一个容器组。
  • 它们对于日志记录、监控和存储代理等节点级操作至关重要。
  • 您可以使用 nodeSelector 指定特定节点。
  • DaemonSets 使用 kind: DaemonSet 定义,并采用类似部署的容器组模板。

接下来,您将学习如何使用 StatefulSets 管理有状态应用!

常见问题解答

「用于节点专属任务的 DaemonSets」课时是免费的吗?

是的 — 「用于节点专属任务的 DaemonSets」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 DevOps Bootcamp 课程的其余内容,请升级到 CoddyKit PRO。 DevOps Bootcamp 课程共包含 4 节课。

「用于节点专属任务的 DaemonSets」这节课中我会学到什么?

使用 DaemonSets 在 Cluster 的全部或指定节点上运行 Pod 副本,以执行 Cluster 级操作。 你通过在浏览器中直接运行的动手代码来练习 DevOps Bootcamp,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 DevOps Bootcamp 需要有经验吗?

无需任何先前经验。CoddyKit 上的 DevOps Bootcamp 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。

「用于节点专属任务的 DaemonSets」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 DevOps Bootcamp 课中编写并运行代码吗?

能。每节 DevOps Bootcamp 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 有状态应用的 StatefulSets
  2. 用于节点专属任务的 DaemonSets
  3. 了解 Kubernetes Operator
  4. 自定义资源定义(CRD)
← 返回 DevOps Bootcamp