繁体   English   中英

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

[英]Multizone Kubernetes cluster and affinity. How to distribute application per zone?

我有一个包含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(超过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调度程序无法保证所有可用区域中的Pod。 我认为这是一种尽力而为的方法,可能会有一些局限性。

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

这里的关键问题是滚动更新-进行滚动更新后,将保留旧副本,直到启动新副本为止。 但是由于与旧副本的冲突,无法安排/启动新副本。

因此,如果不考虑滚动更新,请在此处提供一种变通方法,将策略类型更改为Recreate

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

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

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

  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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM