k8s 如何设置「尽量反亲和性」?

k8s 的反亲和性非常的愚蠢

affinity:
  podAntiAffinity:
    requiredDuringSchedulingIgnoredDuringExecution: #设置调度策略。
      - labelSelector:
          matchExpressions:
            - key: app
              operator: In
              values:
                - imdb-match-api
        topologyKey: kubernetes.io/hostname

是强制反亲和的

比如我有 10个 node,需要部署 12个一样的pod

我希望这 8个节点各部署一个 pod,另外 2 个节点各部署两个 pod

但是 k8s 设置了反亲和性,就最多只能部署 10 个 pod 了,另外两个 pod 就永远是 pending 状态了

我只是希望尽量部署在不同机器上,避免一台机器挂了,导致这些 pod 被一锅端,但不强求一个 node 只能部署一个 pod

我该怎么做呢?

阅读 1.3k
avatarAI BotBETA

这个问题涉及到了 Kubernetes 中反亲和性(Anti-Affinity)的工作方式。在你提供的 YAML 配置中,你使用了 podAntiAffinity 来设置反亲和性,这表示如果一个节点上已经有一个指定的 pod 运行,那么该节点将不再被选择来运行具有相同标签的其他 pod。

在你的情况中,你已经设定了一个反亲和规则,即相同的 app=imdb-match-api 的 pod 不会运行在同一个节点上。然而,Kubernetes 的反亲和性是强制的,即一旦一个节点被分配了一个 pod,它就不能再被分配另一个具有相同标签的 pod,除非原来的 pod 被删除或移动到其他节点。

要达到你所希望的效果,即尽量将 pods 分配到不同的节点上,但并不严格要求每个节点只分配一个 pod,你可以尝试使用 soft 版的反亲和规则,即 podAffinitypodAffinity 允许你设置一些相对灵活的亲和性规则,比如 "尽量部署在不同机器上",而不是强制性的 "必须部署在不同机器上"。

然而需要注意的是,podAffinity 并不能解决所有问题。例如,它不能防止所有的 pod 同时挂掉的情况(这被称为"一锅端"问题)。为了解决这个问题,你还需要考虑其他的容错策略,比如使用 podDisruptionBudgets 来为你的 pods 设置一些容错预算。

以下是一个使用 podAffinity 的例子:

affinity:
  podAffinity:
    requiredDuringSchedulingIgnoredDuringExecution:
      - labelSelector:
          matchExpressions:
            - key: app
              operator: In
              values:
                - imdb-match-api
        topologyKey: kubernetes.io/hostname

这个配置表示尽量将具有 app=imdb-match-api 标签的 pod 分配到不同的节点上。如果无法满足这个条件,Kubernetes 仍然会尽量找到一个合适的节点来部署 pod。

3 个回答

Kubernetes 的默认调度策略是尽可能满足 pod 的资源需求,同时尽量均匀分配 pod 到多个节点上。

所以没必要设置反亲和性。

你需要的可能是 topologySpreadConstraints

  topologySpreadConstraints:
       - maxSkew: 1
         topologyKey: kubernetes.io/hostname
         whenUnsatisfiable: DoNotSchedule
         labelSelector:
           matchLabels:
             app: foo
         matchLabelKeys:
           - pod-template-hash

你可以使用pod topologySpreadConstraints 策略,策略能将 Pod 强制打散调度到不同可用区(机房),以实现跨机房容灾

Kubernetes 支持两种方式将 Pod 打散调度:

  • Pod 反亲和 (Pod Anti-Affinity): (强反亲和)
  • Pod 拓扑分布约束 (Pod Topology Spread Constraints: 将 Pod 尽量均匀的打散调度到各个节点上,不强制

细节你可以看一下这篇文章
https://zhuanlan.zhihu.com/p/389525162

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题