我正在将我的应用程序迁移到Kubernetes。我正在使用EKS。
我想将Pod分配到不同的节点,以避免出现单点故障。
我了解了pod-affinity
和anti-affinity
以及required
和preferred
模式。
This answer提供了一种非常好的方法来完成此任务。
但是我的疑问是,如果我有3个节点,其中2个节点已满(在资源方面)。如果我使用requiredDuringSchedulingIgnoredDuringExecution
,则k8将启动新节点并将吊舱分配到每个节点。如果我使用preferredDuringSchedulingIgnoredDuringExecution
,它将检查首选节点,而不会找到其他节点,只会将所有Pod部署在第三个节点上。在这种情况下,它将再次成为单点故障。
我该如何解决这种情况?
我能想到的一种方法是拥有一个过度配置的集群,这样总会有一些额外的节点。
第二种方式,我不确定如何做到这一点,但我认为应该有一种同时使用requiredDuringSchedulingIgnoredDuringExecution
和preferredDuringSchedulingIgnoredDuringExecution
的方式。
有人可以帮我吗?我想念什么吗?人们在这种情况下如何工作?
我是Kubernetes的新手,所以如果我错了或遗漏了一些东西,请随时纠正我。
预先感谢
注意:
在同一节点上运行几个类似的Pod时我没有问题,只是不希望所有Pod在同一节点上运行,只是因为只有一个节点可供部署。
答案 0 :(得分:3)
我看到您正在尝试确保k8永远不会在同一节点上调度所有pod副本。
不可能为kubernetes调度程序创建这样的硬需求。
Scheduler会尽最大努力尽可能均匀地调度您的应用程序,但是当您有2个节点没有备用资源并且有1个节点将调度所有Pod副本时,k8可以执行以下操作之一(取决于配置) ):
antiaffnity
+ requiredDuringSchedulingIgnoredDuringExecution
)antiaffnity
+ requiredDuringSchedulingIgnoredDuringExecution
+ cluster autoscaler
)priority based preemption
)的资源,并在可能的情况下重新安排被抢占的Pod 也请阅读此article,以更好地了解调度程序如何做出决定。
您还可以使用PodDisruptionBudget告诉kubernetes确保指定的副本始终正常工作,请记住,尽管:
中断预算并不能真正保证所指定豆荚的数量/百分比将一直保持不变。
kubernetes在制定调度决策时会考虑它。