kubectl drain
首先要确保带有replicas=1
的豆荚在其他某个节点上健康吗?
假设吊舱由部署控制,并且吊舱确实可以移动到其他节点。
目前,如我所见,它仅从节点逐出(删除Pod),而无需先调度它们。
答案 0 :(得分:0)
当在排水或节点故障中相应的豆荚数量不可用(期望状态!=当前状态)时,计划新豆荚。
使用PodDisruptionBudget资源,您可以管理节点耗尽期间的中断。
您只能在单个PodDisruptionBudget中指定maxUnavailable和minAvailable中的一个。 maxUnavailable仅可用于控制具有关联控制器来管理容器的容器的逐出。在以下示例中,“所需副本”是管理PodDisruptionBudget选择的容器的控制器的规模。 https://kubernetes.io/docs/tasks/run-application/configure-pdb/#specifying-a-poddisruptionbudget
示例1:minAvailable为5,只要驱逐离开PodDisruptionBudget的选择器所选择的5个或更多健康豆荚,就可以这样做。
示例2:当minAvailable为30%时,只要至少有30%的所需副本健康就可以驱逐。
示例3:在maxUnavailable为5的情况下,只要所需副本总数中最多有5个不良副本,就可以逐出。
示例4:maxUnavailable为30%时,只要不超过30%的所需副本不健康就可以驱逐。
答案 1 :(得分:0)
除了Suresh Vishnoi答案:
如果未指定PodDisruptionBudget,并且您具有一个副本的部署,则吊舱将终止,并且然后将在新节点上安排新吊舱。
要确保您的应用程序在节点耗尽过程中可用,您必须指定PodDisruptionBudget并创建更多副本。如果您有1个带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
”
排干有两件事:
为节点加上密码-这意味着该节点被标记为不可调度,因此无法在该节点上调度新的Pod。很有道理-如果我们知道该节点将处于维护状态,则没有必要在该节点上调度Pod,然后由于维护而在另一个节点上重新调度它。从Kubernetes的角度来看,它为节点添加了污点:node.kubernetes.io/unschedulable:NoSchedule
退出/删除pods-在节点被标记为不可调度后,它试图退出节点上正在运行的pod。它使用Eviction API并将PodDisruptionBudgets
考虑在内(如果不支持,则会删除广告连播)。它调用K8S的DELETE方法,但考虑使用GracePeriodSeconds
,因此它可以使Pod完成其处理。