必须使用DaemonSet控制器并严格配置selector与template labels一致、nodeSelector和tolerations,才能确保每个物理节点仅运行一个指定Pod实例;否则将导致缺失、重复或部署失败。

要在Kubernetes集群中确保每个物理节点只运行一个指定Pod实例,必须使用DaemonSet控制器并正确配置其选择器与调度约束,否则可能因标签不匹配或节点未就绪导致Pod缺失或重复部署。
创建基础DaemonSet资源
用kubectl apply -f daemonset.yaml部署YAML文件,其中必须包含.spec.selector和.spec.template.metadata.labels完全一致的label键值对,否则API Server会拒绝创建。
定义template时,容器镜像需可拉取且启动后能长期存活,否则kubelet会反复重启容器,造成节点上短暂出现多个Pod实例。
【selector与template labels必须严格一致,否则DaemonSet无法关联到任何Pod】
限制仅在物理节点上运行(排除虚拟节点/控制平面节点)
方法一:使用nodeSelector精确匹配物理节点标签
先给所有目标物理节点打标:kubectl label node node-01 node-type=physical;确保控制平面节点(如master)未被打上该标签。
在DaemonSet spec中添加nodeSelector字段:nodeSelector: {node-type: physical},这样Pod只会被DaemonSet部署到带该标签的节点。
方法二:结合tolerations绕过Master污点
若物理节点中混有tainted的control-plane节点(如带有node-role.kubernetes.io/control-plane:NoSchedule),需在template.spec中显式声明tolerations,否则DaemonSet跳过这些节点——即使它们是物理机。
【不配置tolerations时,DaemonSet默认不会在带NoSchedule污点的节点上部署Pod,哪怕它是物理节点】
验证每个节点仅有一个Pod实例
第一步:执行kubectl get nodes获取全部节点名
第二步:对每个节点执行kubectl get pod -o wide --field-selector spec.nodeName=节点名 -n 命名空间
第三步:检查每行输出的pod name是否唯一,且数量恒为1;若某节点返回空或超过1行,说明selector错配、nodeSelector过滤过严,或存在手动创建的同label Pod干扰DaemonSet管理范围。
第四步:删除任意一个DaemonSet管理的Pod,观察是否在原节点立即重建(而非漂移到其他节点)——这是DaemonSet区别于ReplicaSet的关键行为特征。


















