You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何配置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,完全避免调度冲突:

  1. 在EKS中新建专属Jenkins主节点的节点组,给节点打标签node.app/group=jenkins-controller,同时打污点jenkins-controller-only=true:NoSchedule,禁止普通Pod调度到该节点组。
  2. 修改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"
  1. 保持Worker节点的nodeAffinity配置不变,仅允许调度到node.app/group=apps的业务节点组,Worker不配专属节点组的污点容忍度,永远无法调度到主节点所在节点。

内容的提问来源于stack exchange,提问作者Theo Sweeny

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 13:06:07