Statefulset的副本调度问题

Statefulset's replica scheduling questions

有没有办法告诉 Kuberbetes 如何在 statefulset 中调度副本?例如,我将节点分为 3 个不同的可用性区域 (AZ)。我相应地标记了这些节点。现在我希望 K8s 根据节点标签在每个 AZ 中放置 1 个副本。谢谢

Pods 将始终尝试跨不同的节点进行调度,为了实现您正在寻找的目标,您可以尝试使用 DaemonSet,这将只允许其中一种 pods在每个节点中。

此外,您可以根据该节点中已安排的 pods 使用反亲和性。

https://kubernetes.io/docs/concepts/configuration/assign-pod-node/

您正在查找的功能称为 Pod Anti-Affinity,可以这样指定:

apiVersion: apps/v1
kind: StatefulSet
[..]
spec:
  template:
    spec:
      affinity:
        nodeAffinity: {}
        podAntiAffinity:
          preferredDuringSchedulingIgnoredDuringExecution:
          - podAffinityTerm:
              labelSelector:
                matchLabels:
                  app: myapp
              topologyKey: az
            weight: 100
[..]

从 Kubernetes 1.18 开始,还有 Pod Topology Spread Constraints,这是指定这些反亲和性规则的更好方法。