首页 > 解决方案 > Azure Kubernetes 服务:如何自动将 Pod 从 Spot 节点池移动到常规节点池?

问题描述

我的 azure kubernetes 集群中有 2 个节点池。其中一个节点池是 Spot VM 节点池,另一个是常规 VM 节点池。我在现场节点池上部署了 2 个 Pod。所以,我希望如果现场节点池被驱逐,那么同一节点上的 pod 会自动重新安排在常规节点池上吗?

我已经了解了用于在某些节点中运行 pod 的节点亲和性和节点选择器。如果 kubernetes 提供此功能以在 Spot 节点池/Spot 实例被驱逐时自动将 Pod 迁移到另一个节点,这将很有帮助。

谁能知道我们如何在 kubernetes 中实现这一目标?

谢谢。

使用 Kubernetes 版本 1.18.14

标签: azurekubernetesyamlazure-aks

解决方案


您可以在现场节点上使用 NoSchedule 污点。这不会从节点驱逐任何正在运行的 pod,但不会为它们安排任何新的 pod(除非您特别指定了匹配的容忍度)。

您可以查看此文档页面以获取更多详细信息:https ://kubernetes.io/docs/concepts/scheduling-eviction/taint-and-toleration/

但总的来说,您要做的是:

现场节点上应该有一个唯一的标签,如果您描述其中一个节点,您可以找到它。使用它来污染所有具有 NoSchedule 污染的节点,如下所示

kubectl taint nodes node1 key1=value1:NoSchedule 

(替换为key1=value1您找到的标签)

对于您希望继续调度到现场节点的所有 pod(例如系统 pod),添加以下容忍度以允许它们继续:

tolerations:
- key: "key1"
  operator: "Equal"
  value: "value1"
  effect: "NoSchedule"

对于您在问题中提到的 Pod,您不想在它出现故障后将它们重新安排回 Spot 节点,因此不要在它们上添加容忍度。

假设您的 pod 由部署或有状态集(或任何其他在丢失 pod 时会注意重新调度的控制器)控制,当您的 pod 将因为它消失而从现场节点被逐出时,将替换的 pod它将无法再被安排到现场节点,并且鉴于唯一的其他选择是常规节点,它们将被安排在那里。


推荐阅读