如何配置Kubernetes Affinity规则避免EKS上Jenkins Worker与主节点同节点运行
根因分析
出现该问题的核心原因通常是以下两类配置疏漏:
- Pod反亲和规则未跨Namespace匹配:默认情况下
podAntiAffinity仅匹配当前Namespace下的Pod,如果Jenkins主节点和动态创建的Worker Pod不在同一Namespace,规则会直接失效。 - 标签匹配不一致:要先确认Jenkins主节点Pod实际携带的标签,是否和
matchExpressions中配置的app.kubernetes.io/name=jenkins、app.kubernetes.io/component=main完全一致,很多通过Helm安装的Jenkins默认组件标签为jenkins/controller而非main,会导致匹配失败。 - 配置未生效:如果使用Jenkins Kubernetes插件动态创建Worker,要确认插件中的Pod模板亲和性配置没有覆盖全局配置。
解决方案
方案一:修复反亲和规则(无需调整集群节点)
在Worker节点的podAntiAffinity配置中新增namespaces字段,明确指定Jenkins主节点所在的Namespace,确保跨Namespace也能正确匹配到主节点Pod,修改后的Worker配置如下:
affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: # 仅调度到apps业务节点组 - key: node.app/group operator: In values: - apps podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: # 禁止调度到运行Jenkins主节点的节点 - key: app.kubernetes.io/name operator: In values: - jenkins - key: app.kubernetes.io/component operator: In values: - main # 如果主节点实际标签不是main,替换为对应值即可 topologyKey: kubernetes.io/hostname namespaces: ["<替换为Jenkins主节点实际所在的Namespace>"] # 新增该行,明确匹配主节点所属Namespace preferredDuringSchedulingIgnoredDuringExecution: - weight: 100 podAffinityTerm: labelSelector: matchExpressions: # 尽量避免和其他Worker同节点 - key: app.kubernetes.io/name operator: In values: - jenkins - key: app.kubernetes.io/component operator: In values: - worker topologyKey: kubernetes.io/hostname
配置更新后,requiredDuringSchedulingIgnoredDuringExecution作为硬约束,调度器在任何情况下都不会违反该规则,Worker Pod不可能被调度到主节点所在节点。
方案二:节点组硬隔离(EKS环境推荐,最彻底)
直接从节点维度隔离主节点和Worker,完全避免调度冲突:
- 在EKS中新建专属Jenkins主节点的节点组,给节点打标签
node.app/group=jenkins-controller,同时打污点jenkins-controller-only=true:NoSchedule,禁止普通Pod调度到该节点组。 - 修改Jenkins主节点的调度配置,指定必须调度到专属节点组,同时添加污点容忍度:
affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: # 主节点仅调度到专属节点组 - key: node.app/group operator: In values: - jenkins-controller tolerations: - key: "jenkins-controller-only" operator: "Equal" value: "true" effect: "NoSchedule"
- 保持Worker节点的
nodeAffinity配置不变,仅允许调度到node.app/group=apps的业务节点组,Worker不配专属节点组的污点容忍度,永远无法调度到主节点所在节点。
内容的提问来源于stack exchange,提问作者Theo Sweeny
相关产品推荐
相关产品推荐

