具有首选模式的节点之间的 Kubernetes pod 分布
Kubernetes pod distribution amongst nodes with preferred mode
我正在努力将我的应用程序迁移到 Kubernetes。我正在使用 EKS。
我想将我的 pods 分发到不同的节点,以避免出现单点故障。
我阅读了 pod-affinity
和 anti-affinity
以及 required
和 preferred
模式。
This answer 给出了一个很好的方法来完成这个。
但我的疑问是,假设我有 3 个节点,其中 2 个已经满(资源方面)。如果我使用 requiredDuringSchedulingIgnoredDuringExecution
,k8s 将启动新节点并将 pods 分配给每个节点。如果我使用 preferredDuringSchedulingIgnoredDuringExecution
,它将检查首选节点,并且不会找到不同的节点,将仅在第三个节点上部署所有 pods。在这种情况下,它将再次成为单点故障。
如何解决这种情况?
我能想到的一种方法是拥有一个过度配置的集群,这样总会有一些额外的节点。
第二种方法,我不知道该怎么做,但我认为应该有一种方法可以同时使用requiredDuringSchedulingIgnoredDuringExecution
和preferredDuringSchedulingIgnoredDuringExecution
。
谁能帮我解决这个问题?我错过了什么吗?人们如何处理这种情况?
我是 Kubernetes 的新手,所以如果我错了或遗漏了什么,请随时纠正我。
提前致谢
注:
我没有问题运行几个相似的pods在同一个节点上,只是不希望所有的pods都是运行在同一个节点上,只是因为只有一个节点可以部署。
我看到您正在尝试确保 k8s 永远不会在同一节点上安排所有 pod 副本。
不可能为 kubernetes 调度程序创建这样的硬性要求。
Scheduler 会尽最大努力尽可能均匀地调度你的应用程序,但是当你有 2 个节点没有空闲资源和 1 个节点将调度所有 pod 副本的情况下,k8s 可以执行以下操作之一(取决于关于配置):
- 将您的 pods 安排在一个节点上(最好 effort/default)
- 运行 一个 pod,根本不安排其余的 pods (
antiaffnity
+ requiredDuringSchedulingIgnoredDuringExecution
)
- 如果需要,为 pods 创建新节点 (
antiaffnity
+ requiredDuringSchedulingIgnoredDuringExecution
+ cluster autoscaler
)
- 开始从节点中删除 pods 以释放高优先级资源 pods (
priority based preemption
) 并在可能的情况下重新安排抢占 pods
另请阅读此 article 以更好地了解调度程序如何做出决定。
您还可以使用 PodDisruptionBudget 告诉 kubernetes 确保指定的副本始终在工作,请记住虽然:
A disruption budget does not truly guarantee that the specified number/percentage of pods will always be up.
kubernetes 在制定调度决策时会考虑到它。
我正在努力将我的应用程序迁移到 Kubernetes。我正在使用 EKS。
我想将我的 pods 分发到不同的节点,以避免出现单点故障。
我阅读了 pod-affinity
和 anti-affinity
以及 required
和 preferred
模式。
This answer 给出了一个很好的方法来完成这个。
但我的疑问是,假设我有 3 个节点,其中 2 个已经满(资源方面)。如果我使用 requiredDuringSchedulingIgnoredDuringExecution
,k8s 将启动新节点并将 pods 分配给每个节点。如果我使用 preferredDuringSchedulingIgnoredDuringExecution
,它将检查首选节点,并且不会找到不同的节点,将仅在第三个节点上部署所有 pods。在这种情况下,它将再次成为单点故障。
如何解决这种情况?
我能想到的一种方法是拥有一个过度配置的集群,这样总会有一些额外的节点。
第二种方法,我不知道该怎么做,但我认为应该有一种方法可以同时使用requiredDuringSchedulingIgnoredDuringExecution
和preferredDuringSchedulingIgnoredDuringExecution
。
谁能帮我解决这个问题?我错过了什么吗?人们如何处理这种情况?
我是 Kubernetes 的新手,所以如果我错了或遗漏了什么,请随时纠正我。
提前致谢
注:
我没有问题运行几个相似的pods在同一个节点上,只是不希望所有的pods都是运行在同一个节点上,只是因为只有一个节点可以部署。
我看到您正在尝试确保 k8s 永远不会在同一节点上安排所有 pod 副本。
不可能为 kubernetes 调度程序创建这样的硬性要求。
Scheduler 会尽最大努力尽可能均匀地调度你的应用程序,但是当你有 2 个节点没有空闲资源和 1 个节点将调度所有 pod 副本的情况下,k8s 可以执行以下操作之一(取决于关于配置):
- 将您的 pods 安排在一个节点上(最好 effort/default)
- 运行 一个 pod,根本不安排其余的 pods (
antiaffnity
+requiredDuringSchedulingIgnoredDuringExecution
) - 如果需要,为 pods 创建新节点 (
antiaffnity
+requiredDuringSchedulingIgnoredDuringExecution
+cluster autoscaler
) - 开始从节点中删除 pods 以释放高优先级资源 pods (
priority based preemption
) 并在可能的情况下重新安排抢占 pods
另请阅读此 article 以更好地了解调度程序如何做出决定。
您还可以使用 PodDisruptionBudget 告诉 kubernetes 确保指定的副本始终在工作,请记住虽然:
A disruption budget does not truly guarantee that the specified number/percentage of pods will always be up.
kubernetes 在制定调度决策时会考虑到它。