如何在Kubernetes中均匀地跨所有节点部署POD?

如何在Kubernetes中均匀地跨所有节点部署POD?,kubernetes,kube-scheduler,Kubernetes,Kube Scheduler,我有几个Kubernetes集群,每个集群中有不同的节点。我的配置部署有“副本:#节点”。没有为调度pod设置特定的配置,但是在部署之后,我看到了节点上pod分布的奇怪行为 例如: 对于30节点集群(30个副本),所有30个pod副本仅分布在25个节点上,其他5个节点位于集群中。 许多其他不同集群也有类似的情况,每一次新的/重新部署的数量都有所不同 问题: 我想在所有节点上分发pod副本。如果我设置了“副本:#节点”,那么每个节点中应该有一个pod副本。如果我将副本数增加/增加一倍,那么它应该均

我有几个Kubernetes集群,每个集群中有不同的节点。我的配置部署有“副本:#节点”。没有为调度pod设置特定的配置,但是在部署之后,我看到了节点上pod分布的奇怪行为

例如:

对于30节点集群(30个副本),所有30个pod副本仅分布在25个节点上,其他5个节点位于集群中。 许多其他不同集群也有类似的情况,每一次新的/重新部署的数量都有所不同

问题:

我想在所有节点上分发pod副本。如果我设置了“副本:#节点”,那么每个节点中应该有一个pod副本。如果我将副本数增加/增加一倍,那么它应该均匀分布。 Kubernetes的部署yaml中是否有任何特定配置

配置节点反亲和性,但此配置的行为仍如上所述。尝试了“requiredDuringSchedulingIgnoredDuringExecution”,但在每个节点中都部署了一个pod,但是如果我增加了副本,或者任何节点在部署过程中出现故障,那么整个部署都会失败

metadata:
  labels:
    app: test1
spec:
  affinity:
    podAntiAffinity:
      preferredDuringSchedulingIgnoredDuringExecution:
      - weight: 100
        podAffinityTerm:
          labelSelector:
            matchExpressions:
            - key: app
              operator: In
              values:
              - test1
          topologyKey: kubernetes.io/hostname

如果您需要每个节点部署一个pod,那么应该使用复制集而不是复制集。或者,如果每个节点需要超过1个pod,并且仍然希望pod分布基本均匀,则可以使用pod反亲和力,如我所讨论的

请参见pod拓扑分布约束 此功能允许您根据区域、分区、节点和其他用户定义的拓扑域,精确定义如何在集群中分布POD


因此,您可以定义自己的POD分配规则。

如果POD分布不均匀,您会遇到哪些问题?将POD调度到所有节点对您来说重要的原因是什么?Kubernetes将基础设施抽象出来,因此您不应该对此考虑太多,除非你有问题。你要找的可能是
podAntiAffinity
preferredDuringSchedulingIgnoredDuringExecution
之类的东西,它会权衡调度,以避免将pod放在已经存在具有特定标签的pod的节点上。如果无法在其他节点上进行调度,则调度不会失败,只是希望多做一点。@Jonas-我遇到了最糟糕的POD分布,32个POD只分布在3个节点上,而不是32个节点群集。@JoachimIsaksson-已经尝试了您建议的上述配置,但,仍然像我举的例子一样。在我的配置中,我希望节点没有类似的pod标签。但它仍然分布在28个节点上,而不是32个。我没有任何其他pod在这些节点上运行,这可能会导致资源使用问题。你能从kube scheduler粘贴日志吗?参见,例如,请参见更新的问题详细信息。我有pod反亲和力的配置,但它仍然不能帮助我实现均匀分布。不幸的是,preferred不能保证任何东西。调度程序将尝试尽可能多地分散播客,但它仍然不是一个完美的分发。您所赋予的权重是决策的重要部分,但还有许多其他因素,k8s的哪个版本支持此功能?1.19(对于早期版本,需要启用一些附加功能门。请参阅答案中的链接)