在K8S中,Pod多副本配置了硬亲和性,会调度到同⼀个节点上吗?

在 Kubernetes 中,Pod 多副本配置了硬亲和性(nodeAffinity 的 requiredDuringSchedulingIgnoredDuringExecution 时,是否会被调度到同一个节点,取决于硬亲和性规则的具体配置——硬亲和性仅规定 Pod“可以调度到哪些节点”,但不直接限制“多个副本是否能在同一个节点”

核心原理:硬亲和性的作用范围

硬亲和性(requiredDuringSchedulingIgnoredDuringExecution)是一种“强制性规则”,要求 Pod 必须调度到满足规则的节点上(不满足则无法调度)。例如:

affinity:
  nodeAffinity:
    requiredDuringSchedulingIgnoredDuringExecution:
      nodeSelectorTerms:
      - matchExpressions:
        - key: env
          operator: In
          values:
          - prod  # 要求节点必须有 env=prod 标签

此时,所有副本都会被调度到带有 env=prod 标签的节点,但 Kubernetes 调度器默认不会主动“分散”副本——如果只有一个节点满足 env=prod 标签,所有副本会被调度到这个节点;如果有多个节点满足标签,副本可能分散到不同节点,也可能集中到同一个节点(取决于节点资源等其他因素)。

如何避免多副本调度到同一节点?

若要确保多副本不调度到同一个节点(如提高可用性,避免单点故障),需要结合 Pod 反亲和性(podAntiAffinity),而非仅依赖节点硬亲和性。

Pod 反亲和性可以定义“Pod 不能与哪些其他 Pod 共处同一节点”,例如要求同一 Deployment 的副本不能在同一节点:

affinity:
  # 硬节点亲和性:必须调度到 env=prod 节点
  nodeAffinity:
    requiredDuringSchedulingIgnoredDuringExecution:
      nodeSelectorTerms:
      - matchExpressions:
        - key: env
          operator: In
          values:
          - prod
  # 硬 Pod 反亲和性:不能与同组 Pod 调度到同一节点
  podAntiAffinity:
    requiredDuringSchedulingIgnoredDuringExecution:
    - labelSelector:
        matchExpressions:
        - key: app
          operator: In
          values:
          - my-app  # 与自身 Deployment 的标签匹配
      topologyKey: "kubernetes.io/hostname"  # 按节点维度隔离
  • topologyKey: "kubernetes.io/hostname" 表示“同一节点”是隔离维度,即同一节点上不能有多个带 app=my-app 标签的 Pod。
  • 此时,结合节点硬亲和性和 Pod 硬反亲和性,副本会被强制分散到多个满足 env=prod 的节点上。

总结

  • 仅配置硬节点亲和性:多副本可能调度到同一个节点(如果该节点满足亲和性规则且资源充足)。
  • 硬节点亲和性 + 硬 Pod 反亲和性:多副本会被分散到多个满足亲和性规则的节点,避免集中在同一节点。

因此,若需多副本分散部署,需在硬亲和性基础上,通过 Pod 反亲和性明确限制“不能共处同一节点”。

posted @ 2025-08-07 09:29  天道酬勤zjh  阅读(12)  评论(0)    收藏  举报