kubectl排水和滚动更新,停机

时间:2019-12-15 11:06:02

标签: kubernetes kubectl kubernetes-deployment

kubectl drain首先要确保带有replicas=1的豆荚在其他某个节点上健康吗?
假设吊舱由部署控制,并且吊舱确实可以移动到其他节点。 目前,如我所见,它仅从节点逐出(删除Pod),而无需先调度它们。

2 个答案:

答案 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

排干有两件事:

  1. 为节点加上密码-这意味着该节点被标记为不可调度,因此无法在该节点上调度新的Pod。很有道理-如果我们知道该节点将处于维护状态,则没有必要在该节点上调度Pod,然后由于维护而在另一个节点上重新调度它。从Kubernetes的角度来看,它为节点添加了污点:node.kubernetes.io/unschedulable:NoSchedule

  2. 退出/删除pods-在节点被标记为不可调度后,它试图退出节点上正在运行的pod。它使用Eviction API并将PodDisruptionBudgets考虑在内(如果不支持,则会删除广告连播)。它调用K8S的DELETE方法,但考虑使用GracePeriodSeconds,因此它可以使Pod完成其处理。