是否kubectl drain
首先确保replicas=1
其他节点上的 pod 是健康的?
假设 Pod 由部署控制,并且 Pod 确实可以移动到其他节点。目前我看到它只是从节点中驱逐(删除 pod),而不是先调度它们。
2 回答
除了Suresh Vishnoi 回答:
如果未指定PodDisruptionBudget并且您有一个具有一个副本的部署,则该 pod 将被终止,然后新的 pod 将被安排在一个新节点上。
为了确保您的应用程序在节点耗尽过程中可用,您必须指定 PodDisruptionBudget 并创建更多副本。如果您有 1 个 pod,minAvailable: 30%
它将拒绝排水并出现以下错误:
error when evicting pod "pod01" (will retry after 5s): Cannot evict pod as it would violate the pod's disruption budget.
简而言之,这就是排水过程的工作原理:
正如文档kubectl drain
命令中所解释的那样,“在您对节点执行维护之前,安全地从节点中驱逐所有 pod,并允许 pod 的容器正常终止并尊重PodDisruptionBudgets
您指定的内容”
Drain 做了两件事:
封锁节点 - 这意味着节点被标记为不可调度,因此无法在该节点上调度新的 Pod。有道理 - 如果我们知道该节点将处于维护状态,则没有必要在那里安排一个 pod,然后由于维护而在另一个节点上重新安排它。从 Kubernetes 的角度来看,它向节点添加了一个污点:
node.kubernetes.io/unschedulable:NoSchedule
evicts/ 删除 pod - 在节点被标记为不可调度后,它会尝试驱逐在该节点上运行的 pod。它使用考虑到的Eviction API
PodDisruptionBudgets
(如果不支持,它将删除 pod)。它向 K8S 调用 DELETE 方法,但认为GracePeriodSeconds
它让 pod 完成它的进程。
当 Pod 的数量不可用时(期望状态!= 当前状态),在耗尽或节点故障方面,新的 Pod 会被调度。
使用PodDisruptionBudget 资源,您可以管理节点耗尽期间的中断。
您只能在单个 PodDisruptionBudget 中指定 maxUnavailable 和 minAvailable 之一。maxUnavailable 只能用于控制有关联控制器管理它们的 pod 的驱逐。在下面的示例中,“期望的副本”是管理 PodDisruptionBudget 选择的 pod 的控制器的规模。https://kubernetes.io/docs/tasks/run-application/configure-pdb/#specifying-a-poddisruptionbudget
示例 1:minAvailable 为 5 时,只要在 PodDisruptionBudget 的选择器选择的 pod 中留下 5 个或更多健康的 pod,就允许驱逐。
示例 2:在 minAvailable 为 30% 的情况下,只要至少 30% 的所需副本数是健康的,就允许驱逐。
示例 3:maxUnavailable 为 5,只要在所需副本总数中最多有 5 个不健康的副本,就允许驱逐。
示例 4:maxUnavailable 为 30% 时,只要不超过 30% 的所需副本不健康,就允许驱逐。