构建基本的 DaemonSet
本页面演示如何构建一个基本的 DaemonSet,使其在 Kubernetes 集群的每个节点上运行一个 Pod。它涵盖了一个简单的用例,即从主机挂载文件,使用 init 容器记录其内容,并利用一个暂停容器。
准备工作
你需要一个 Kubernetes 集群,并且 kubectl 命令行工具已配置为与你的集群通信。建议在至少有两个不作为控制平面主机的节点集群上运行本教程。如果你还没有集群,可以使用 minikube 创建一个,或者使用这些 Kubernetes 游乐场之一。
一个至少包含两个节点(一个控制平面节点和一个工作节点)的 Kubernetes 集群,以演示 DaemonSet 的行为。
定义 DaemonSet
在此任务中,创建了一个基本的 DaemonSet,它确保 Pod 的副本被调度到每个节点上。该 Pod 将使用一个 init 容器读取并记录主机上的 /etc/machine-id
文件的内容,而主容器将是一个 pause
容器,它保持 Pod 运行。
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: example-daemonset
spec:
selector:
matchLabels:
app.kubernetes.io/name: example
template:
metadata:
labels:
app.kubernetes.io/name: example
spec:
containers:
- name: pause
image: registry.k8s.io/pause
initContainers:
- name: log-machine-id
image: busybox:1.37
command: ['sh', '-c', 'cat /etc/machine-id > /var/log/machine-id.log']
volumeMounts:
- name: machine-id
mountPath: /etc/machine-id
readOnly: true
- name: log-dir
mountPath: /var/log
volumes:
- name: machine-id
hostPath:
path: /etc/machine-id
type: File
- name: log-dir
hostPath:
path: /var/log
基于 (YAML) 清单创建 DaemonSet
kubectl apply -f https://k8s.io/examples/application/basic-daemonset.yaml
应用后,你可以验证 DaemonSet 是否在集群的每个节点上运行一个 Pod。
kubectl get pods -o wide
输出将列出每个节点一个 Pod,类似于
NAME READY STATUS RESTARTS AGE IP NODE example-daemonset-xxxxx 1/1 Running 0 5m x.x.x.x node-1 example-daemonset-yyyyy 1/1 Running 0 5m x.x.x.x node-2
你可以通过检查从主机挂载的日志目录来检查已记录的
/etc/machine-id
文件的内容kubectl exec <pod-name> -- cat /var/log/machine-id.log
其中
<pod-name>
是你的一个 Pod 的名称。
清理
要删除 DaemonSet,请运行以下命令
kubectl delete --cascade=foreground --ignore-not-found --now daemonsets/example-daemonset
这个简单的 DaemonSet 示例介绍了 init 容器和主机路径卷等关键组件,这些组件可以在更高级的用例中进行扩展。更多详情请参考 DaemonSet。
下一步
上次修改时间:2025 年 1 月 7 日太平洋标准时间上午 9:41:清理 create-daemon-set.md (3407a0e1cd)