kubectl 流失和滚动更新,停机时间

use*_*803 6 kubernetes kubectl kubernetes-deployment

是否kubectl drain首先确保replicas=1其他节点上的Pod是健康的?
假设 pod 由部署控制,并且确实可以将 pod 移动到其他节点。目前,我认为它只从节点中驱逐(删除 pod),而不先调度它们。

Mar*_* K. 8

除了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.
Run Code Online (Sandbox Code Playgroud)

简而言之,这就是排水过程的工作原理:

如文档kubectl drain命令中所述,“在节点上执行维护之前,从节点安全地驱逐所有 Pod,并允许 Pod 的容器正常终止并尊重PodDisruptionBudgets您指定的”

Drain 做两件事:

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

  2. evicts/ 删除 pods - 在节点被标记为不可调度后,它会尝试驱逐在节点上运行的 pods。它使用Eviction API考虑PodDisruptionBudgets在内(如果它不受支持,它将删除 pod)。它向 K8S 调用 DELETE 方法,但认为GracePeriodSeconds它可以让 pod 完成它的进程。


Sur*_*noi 5

当 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% 的所需副本不健康,就允许驱逐。