Pods 跨节点分布

Pods distribution across nodes

我有一个关于 pods 跨节点分布的问题。我喜欢给定一个 3 节点集群,我想部署一个具有 2 个副本的 pod,同时确保这些副本部署在不同的节点上以实现高可用性。除了使用 nodeAffinity,还有哪些选择?

如果您需要保证无论如何它们都不会在同一个节点上结束,您将不得不使用 AntiAffinity。你可以找到一个很好的例子 here.

另一方面,如果您需要更灵活的解决方案,可以使用 spread constraints,甚至可以将其与 AntiAffinity 结合使用。

首先,节点亲和性允许您根据节点上的标签来限制您的 pod 有资格被调度到哪些节点上。因此,它不保证每个副本都将部署在不同的节点上,或者这些节点将均匀分布在所有节点上。然而,一个有效的解决方案是使用 Pod Topology Spread Constraints.

Pod Topology Spread Constraints 依靠节点标签来识别每个节点所在的拓扑域,然后使用这些标签与具有相同标签的 pods 进行匹配。您可以定义一个或多个 topologySpreadConstraint 来指示 kube-scheduler 如何根据集群中现有的 Pods 放置每个传入的 Pod。

kind: Pod
apiVersion: v1
metadata:
  name: mypod
  labels:
    node: node1
spec:
  topologySpreadConstraints:
  - maxSkew: 1
    topologyKey: zone
    whenUnsatisfiable: DoNotSchedule
    labelSelector:
      matchLabels:
        node: node1
  containers:
  - name: myapp
    image: image_name

maxSkew: 1描述了Pods可能分布不均的程度。它必须大于零。它的语义根据 whenUnsatisfiable 的值而不同。

topologyKey: zone 意味着均匀分布将仅应用于具有标签对“zone:”的节点。

whenUnsatisfiable: DoNotSchedule 告诉调度程序如果传入的 Pod 不能满足约束,让它保持挂起状态。

labelSelector用于查找匹配Pods。 Pods 与此标签选择器相匹配,以确定其相应拓扑域中 Pods 的数量。

您可以在本文档中找到有关 Pod 拓扑传播约束 的更多信息:https://kubernetes.io/docs/concepts/workloads/pods/pod-topology-spread-constraints/