多区域 Kubernetes 集群和亲和性。如何按区域分发应用程序?

Ser*_*nov 5 kubernetes

我有一个包含 6 个节点的多专区(3 个专区)GKE 集群(1.10.7-gke.1),并且希望每个专区至少拥有我的应用程序的一个副本。

所以我尝试了首选的 podAntiAffinity:

  affinity:
    podAntiAffinity:
      preferredDuringSchedulingIgnoredDuringExecution:
      - weight: 100
        podAffinityTerm:
          labelSelector:
            matchExpressions:
            - key: component
              operator: In
              values:
              - app
          topologyKey: failure-domain.beta.kubernetes.io/zone
Run Code Online (Sandbox Code Playgroud)

我第一次安装(从 1 到 3 个副本)我的应用程序时,一切看起来都很好。在下一次滚动更新之后,一切都会变得混乱,我可以在一个区域中拥有 3 个应用程序副本。因为额外的副本被创建,旧的副本被终止。

当我尝试与requiredDuringSchedulingIgnoredDuringExecution相同的术语时,一切看起来都不错,但滚动更新不起作用,因为无法安排新的副本(每个区域中已经存在带有“component”=“app”的 pod)。

如何配置我的部署以确保我在每个可用区都有副本?

更新:

我现在的解决方法是在滚动更新期间进行严格的反关联并拒绝额外的 pod(超过 3 个):

  replicaCount: 3 

  affinity:
    podAntiAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
      - labelSelector:
          matchExpressions:
          - key: component
            operator: In
            values:
            - app
        topologyKey: failure-domain.beta.kubernetes.io/zone

  deploymentStrategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 0
      maxUnavailable: 1
Run Code Online (Sandbox Code Playgroud)

Ric*_*ico 1

我不认为 Kubernetes 调度程序提供了一种方法来保证所有可用区中的 Pod。我相信这是一种尽力而为的方法,但可能存在一些限制。

我已经提出了一个问题来检查是否可以通过 NodeAffinity 或 PodAffiity/PodAntiAffinity 支持此功能。