DaemonSet也被称为“守护进程集”,它会保证在每个节点上有且仅有一个Pod。集群中新增节点时,DaemonSet也会为其自动创建一个Pod。它适用于日志收集组件(如Fluentd)、节点监控代理(如Prometheus Node Exporter)等场景。通过本文,您可了解DaemonSet的特点、通过控制台及kubectl创建DaemonSet的方法。
DaemonSet介绍
DaemonSet在默认情况下会在每个节点上运行一个Pod,但会受到以下调度策略的影响。关于调度策略的更多信息,请参见调度。
污点与容忍度:DaemonSet Pod受到污点限制,不会运行在无法容忍的节点上。但它们默认容忍下列污点:
node.kubernetes.io/unschedulable:NoSchedule
node.kubernetes.io/not-ready:NoExecute
(容忍300秒)node.kubernetes.io/unreachable:NoExecute
(容忍300秒)
nodeSelector:DaemonSet Pod同样受到
nodeSelector
限制。例如,若DaemonSet配置了nodeSelector: { disktype: ssd }
,则仅会在标签为disktype=ssd
的节点上运行。亲和性配置:节点与Pod亲和性、反亲和性配置同样适用于DaemonSet。
DaemonSet虽然可以实现部分调度策略,但这并非是它的设计目标。如果您需要执行较为复杂的调度,请考虑使用Deployment。关于DaemonSet的更多信息,请参见官方文档。
创建DaemonSet
您可以通过控制台或kubectl两种方式创建DaemonSet。
通过控制台创建
登录容器服务管理控制台,在左侧导航栏选择集群列表。
在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择 。
在守护进程集页面,单击使用镜像创建。
由于DaemonSet的特性,控制台配置项与Deployment有以下不同:
应用基本信息:DaemonSet的Pod数量由节点数量决定,因此没有副本数量配置。
高级配置:因为相同的原因,DaemonSet同样没有伸缩配置。
其余配置项则与Deployment相同,请参见创建无状态工作负载Deployment中的配置项说明创建DaemonSet。
通过kubectl命令行创建
创建工作负载前,请确保已通过kubectl连接到集群。具体操作,请参见获取集群KubeConfig并通过kubectl工具连接集群。
复制并保存以下YAML内容至daemonset.yaml文件中。
apiVersion: apps/v1 kind: DaemonSet metadata: name: nginx-test namespace: default # 根据需要更改命名空间 labels: app: nginx spec: selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6 resources: limits: cpu: '1' memory: 2Gi requests: cpu: 500m memory: 512Mi
执行以下命令创建DaemonSet。
kubectl apply -f daemonset.yaml
预期输出:
daemonset.apps/nginx-test created
执行以下命令,查看DaemonSet Pod的详细信息。
kubectl get pods --all-namespaces -o wide | grep nginx-test
预期输出如下,每个节点都有一个pod在运行
default nginx-test-8mqvh 1/1 Running 0 3m38s 192.168.*.** cn-shanghai.192.168.**.250 <none> <none> default nginx-test-ltlx6 1/1 Running 0 3m38s 192.168.*.** cn-shanghai.192.168.**.98 <none> <none> default nginx-test-n6zrv 1/1 Running 0 3m38s 192.168.*.** cn-shanghai.192.168.**.17 <none> <none>