Azure Kubernetes 服务:如何自动将 pod 从 Spot 节点池移动到常规节点池?

时间:2021-03-03 10:12:48

标签: azure kubernetes yaml azure-aks

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

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

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

谢谢。

使用 Kubernetes 1.18.14 版

1 个答案:

答案 0 :(得分:1)

您可以在现场节点上使用 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,一旦它出现故障,您不希望将它们重新安排回一个点节点,所以不要在它们上添加容忍度。

假设您的 Pod 由部署或有状态集(或任何其他在丢失 Pod 时负责重新调度的控制器)控制,当您的 Pod 因 Spot 节点消失而被逐出时,Pod将取代它的将无法再调度到点节点,并且考虑到唯一的其他选择是常规节点,它们将被调度到那里。