使用podAntiAFfinity规则来确保pod在不同的可抢占节点上运行

问题描述 投票:1回答:2

我有一个在GKE上运行的3节点集群。所有节点都是可抢占的,这意味着它们可以随时被杀死,并且生存时间通常不会超过24小时。万一某个节点被杀死,自动缩放器会旋转一个新节点来替换它。发生这种情况通常需要一分钟左右的时间。

在我的集群中,我有一个部署,其副本设置为3。我的意图是,每个Pod将散布在所有节点上,以便只要我的集群中至少有一个节点处于活动状态,我的应用程序仍将运行。 >

我使用了以下相似性配置,因此,该Pod倾向于在与该部署已在运行的Pod主机不同的主机上运行:

spec:
  affinity:
    podAntiAffinity:
      preferredDuringSchedulingIgnoredDuringExecution:
      - podAffinityTerm:
          labelSelector:
            matchExpressions:
            - key: app
              operator: In
              values:
              - my-app
          topologyKey: kubernetes.io/hostname
        weight: 100

当我将应用程序从0缩放时,这似乎可以正常工作。但是实际上会发生以下情况:

  1. 让我们说,属于my-app复制集ABC的Pod分别在节点123上运行。因此状态为:
  2.   1 -> A
      2 -> B
      3 -> C
    
  1. 节点3与Pod C一起被杀死,导致副本集中有2个正在运行的Pod。
  2. 调度程序将自动开始调度新的Pod,以将副本集恢复到3。
  3. [它为my-app寻找没有任何吊舱的节点。由于自动标量仍在启动替换节点(4)的过程中,因此只有12可用。
  4. 在节点D上计划新的容器1
  5. 节点4最终联机,但是由于my-app安排了所有吊舱,因此没有任何吊舱正在运行。结果状态为
  6.   1 -> A, D
      2 -> B
      4 -> -
    

这不是理想的配置。出现问题是因为创建新节点存在延迟,并且计划表不知道它将很快可用。

是否有更好的配置可以确保Pod始终在节点上分布?我在想像preferredDuringSchedulingpreferredDuringExecution这样的指令可能会这样做,但是那不存在。

我有一个在GKE上运行的3节点集群。所有节点都是可抢占的,这意味着它们可以随时被杀死,并且生存时间通常不会超过24小时。如果节点被杀死,则...

kubernetes google-kubernetes-engine replicaset preemption
2个回答
2
投票

preferredDuringSchedulingIgnoredDuringExecution


-1
投票

您应该使用DaemonSets而不是部署,或者您可以同时使用两者。

© www.soinside.com 2019 - 2024. All rights reserved.