首页 > 解决方案 > 多区 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

第一次安装(从 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

标签: kubernetes

解决方案


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

我已经打开了一个问题来检查这是否可以通过 NodeAffinity 或 PodAffiity/PodAntiAffinity 来支持。


推荐阅读