Kubernetes Pod 在具有首选模式的节点之间分布

kad*_*amb 5 kubernetes kubernetes-pod amazon-eks

我正在努力将我的应用程序迁移到 Kubernetes。我正在使用 EKS。

我想将我的 Pod 分布到不同的节点,以避免出现单点故障。我读到了pod-affinityandanti-affinityrequiredandpreferred模式。

这个答案提供了一个非常好的方法来实现这一点。

但我的疑问是,假设我有 3 个节点,其中 2 个节点已满(资源方面)。如果我使用requiredDuringSchedulingIgnoredDuringExecution,k8s 将启动新节点并将 Pod 分发到每个节点。如果我使用preferredDuringSchedulingIgnoredDuringExecution,它将检查首选节点,并且不会找到不同的节点,只会将所有 Pod 部署在第三个节点上。在这种情况下,它将再次成为单点故障。

我该如何解决这种情况?

我能想到的一种方法是拥有一个超额配置的集群,这样总会有一些额外的节点。

第二种方法,我不知道如何做到这一点,但我认为应该有一种同时使用requiredDuringSchedulingIgnoredDuringExecution和 的方法preferredDuringSchedulingIgnoredDuringExecution

谁能帮我这个?我错过了什么吗?在这种情况下人们如何工作?

我是 Kubernetes 的新手,所以如果我错了或者遗漏了什么,请随时纠正我。

提前致谢

笔记:

我在同一节点上运行几个类似的 pod 没有问题,只是不希望所有 pod 都在同一节点上运行,因为只有一个节点可供部署。

Mat*_*att 4

我看到您试图确保 k8s 永远不会在同一节点上安排所有 pod 副本。

不可能为 kubernetes 调度程序创建这样的硬性要求。

调度程序将尽力尽可能均匀地调度您的应用程序,但在您有 2 个没有空闲资源的节点和 1 个将调度所有 pod 副本的节点的情况下,k8s 可以执行以下操作之一(取决于配置):

  1. 将 pod 安排在一个节点上(尽力而为/默认)
  2. 运行一个 pod,根本不安排其余 pod ( antiaffnity+ requiredDuringSchedulingIgnoredDuringExecution)
  3. 如果需要,为 pod 创建新节点 ( antiaffnity++ )requiredDuringSchedulingIgnoredDuringExecutioncluster autoscaler
  4. 开始从节点中删除 pod,以释放高优先级 pod 的资源 ( priority based preemption),并在可能的情况下重新安排被抢占的 pod

另请阅读本文更好地了解调度程序如何做出决策。

您还可以使用PodDisruptionBudget告诉 kubernetes 确保指定的副本始终正常工作,但请记住:

中断预算并不能真正保证指定数量/百分比的 Pod 始终正常运行。

kubernetes 在做出调度决策时会考虑到这一点。