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

时间:2018-09-22 14:09:49

标签: 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 中尝试相同的术语时,一切看起来都很好,但是滚动更新无法正常工作,因为无法安排新的副本(“组件” =“ app”的容器已经存在每个区域)。

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

已更新:

我现在的解决方法是在滚动更新期间进行严格的反亲和并拒绝其他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

3 个答案:

答案 0 :(得分:0)

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

我已经打开issue来检查是否可以通过NodeAffinity或PodAffiity / PodAntiAffinity支持此功能。

答案 1 :(得分:0)

此处的关键问题是滚动更新-进行滚动更新后,将保留旧副本,直到启动新副本为止。但是由于与旧副本存在冲突,因此无法计划/启动新副本。

因此,如果不关心滚动更新,请采用此处的变通办法,将策略类型更改为Recreate

apiVersion: apps/v1
kind: Deployment
...
spec:
...
  strategy:
    type: Recreate
...

然后应用podAntiAffinity / requiredDuringSchedulingIgnoredDuringExecution规则将起作用。

答案 2 :(得分:0)

如果每个区域中都有两个节点,则可以使用以下相似性规则来确保滚动更新也能正常工作,并且每个区域中都有一个pod。

  affinity:
    podAntiAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
      - labelSelector:
          matchExpressions:
          - key: component
            operator: In
            values:
            - app
        topologyKey: "kubernetes.io/hostname"
      preferredDuringSchedulingIgnoredDuringExecution:
      - weight: 100
        podAffinityTerm:
          labelSelector:
            matchExpressions:
            - key: component
              operator: In
              values:
              - app
          topologyKey: failure-domain.beta.kubernetes.io/zone