能否仅在指定节点部署DaemonSet?含活跃部署与非关联命名空间节点场景
问题1:是否可以仅在存在活跃Deployment的节点上部署DaemonSet?
可以实现,核心思路是通过节点标签联动+DaemonSet的节点选择规则完成,具体步骤如下:
- 给运行目标Deployment Pod的节点自动打标签:通过
MutatingAdmissionWebhook或自定义脚本/Operator实现监控逻辑——当Deployment的Pod被调度到节点时,自动给节点添加标签(比如has-active-deployment=yes);当节点上该Deployment的所有Pod被移除后,自动删除对应标签。 - 配置DaemonSet的节点选择规则:在DaemonSet的YAML中,通过
spec.nodeSelector直接匹配标签,或用更灵活的spec.affinity.nodeAffinity设置亲和性,仅选择带有has-active-deployment=yes标签的节点。 - 注意:必须保证标签的添加/移除逻辑闭环,否则DaemonSet可能会留在已无活跃Deployment Pod的节点上。
问题2:如何让cAdvisor的DaemonSet仅运行在与自身命名空间服务无关的节点上?
这里的“无关节点”指未运行该命名空间下Pod的节点,实现方式如下:
- 给运行自身命名空间Pod的节点打标签:用
MutatingAdmissionWebhook或自定义监控脚本,当节点上存在目标命名空间的Pod时,添加标签(比如runs-my-ns-pods=yes);当节点上该命名空间的Pod全部移除后,删除该标签。 - 配置cAdvisor DaemonSet的节点亲和性规则,主动排除带有上述标签的节点,示例YAML片段:
apiVersion: apps/v1 kind: DaemonSet metadata: name: cadvisor spec: selector: matchLabels: name: cadvisor template: metadata: labels: name: cadvisor spec: affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: # 排除带有runs-my-ns-pods=yes标签的节点 - key: runs-my-ns-pods operator: NotIn values: - "yes" # 匹配未设置该标签的节点 - key: runs-my-ns-pods operator: DoesNotExist containers: - name: cadvisor image: gcr.io/cadvisor/cadvisor:latest ports: - containerPort: 8080
- 若已明确服务仅运行在特定节点组,可直接给这些节点打标签,再用上述亲和性规则排除,无需动态监控Pod调度情况。
内容的提问来源于stack exchange,提问作者H. Zhao
相关产品推荐
相关产品推荐

