Kubernetes安全清空节点

2023-12-15 60

PodDisruptionBudget(PDB)是一种Kubernetes用于保护应用程序免受意外删除或驱逐的保护机制,允许管理员指定在一段时间内最多可以中断或删除多少个 Pod。然而,在某些情况下,可能需要清空一个节点以进行维护或其他操作。

一、准备

此任务假定已经满足了以下先决条件:

  • 在节点清空期间,不要求应用具有高可用性;
  • 已经了解了 PodDisruptionBudget 的概念, 并为需要它的应用配置了 PodDisruptionBudget。

二、配置干扰预算

为了确保负载在维护期间仍然可用,可以配置一个 PodDisruptionBudget(可选)。 如果可用性对于正在清空的该节点上运行或可能在该节点上运行的任何应用程序很重要, 首先 配置一个 PodDisruptionBudgets 并继续遵循本教程。

建议为 PodDisruptionBudgets 设置 AlwaysAllow 不健康 Pod 驱逐策略, 以在节点清空期间支持驱逐异常的应用程序。 默认行为是等待应用程序的 Pod 变为 健康后, 才能进行清空操作。

三、从服务中删除一个节点

在对节点执行维护(例如内核升级、硬件维护等)之前, 可以使用 kubectl drain 从节点安全地逐出所有 Pod。 安全的驱逐过程允许 Pod 的容器体面地终止, 并确保满足指定的 PodDisruptionBudgets。

默认情况下,kubectl drain 将忽略节点上不能杀死的特定系统 Pod; 有关更多细节,请参阅 kubectl drain 文档。

kubectl drain 的成功返回,表明所有的 Pod(除了上一段中描述的被排除的那些), 已经被安全地逐出(考虑到期望的终止宽限期和定义的 PodDisruptionBudget)。 然后就可以安全地关闭节点, 比如关闭物理机器的电源,如果它运行在云平台上,则删除它的虚拟机。

如果存在新的、能够容忍 node.kubernetes.io/unschedulable 污点的 Pod, 那么这些 Pod 可能会被调度到已经清空的节点上。 除了 DaemonSet 之外,请避免容忍此污点。如果或另一个 API 用户(绕过调度器)直接为 Pod 设置了 nodeName字段, 则即使已将该节点清空并标记为不可调度,Pod 仍将被绑定到这个指定的节点并在该节点上运行。

首先,确定想要清空的节点的名称。可以用以下命令列出集群中的所有节点:

kubectl get nodes

接下来,告诉 Kubernetes 清空节点:

kubectl drain --ignore-daemonsets <节点名称>

如果存在 DaemonSet 管理的 Pod,将需要为 kubectl 设置 –ignore-daemonsets 以成功地清空节点。 kubectl drain 子命令自身实际上不清空节点上的 DaemonSet Pod 集合: DaemonSet 控制器(作为控制平面的一部分)会立即用新的等效 Pod 替换缺少的 Pod。 DaemonSet 控制器还会创建忽略不可调度污点的 Pod,这种污点允许在正在清空的节点上启动新的 Pod。

一旦它返回(没有报错), 就可以下线此节点(或者等价地,如果在云平台上,删除支持该节点的虚拟机)。 如果要在维护操作期间将节点留在集群中,则需要运行:

kubectl uncordon <node name>

然后告诉 Kubernetes,它可以继续在此节点上调度新的 Pod。

四、并行清空多个节点

kubectl drain 命令一次只能发送给一个节点。 但是,可以在不同的终端或后台为不同的节点并行地运行多个 kubectl drain 命令。 同时运行的多个 drain 命令仍然遵循指定的 PodDisruptionBudget。

例如,如果有一个三副本的 StatefulSet, 并设置了一个 PodDisruptionBudget,指定 minAvailable: 2。 如果所有的三个 Pod 处于健康(healthy)状态, 并且并行地发出多个 drain 命令,那么 kubectl drain 只会从 StatefulSet 中逐出一个 Pod, 因为 Kubernetes 会遵守 PodDisruptionBudget 并确保在任何时候只有一个 Pod 不可用 (最多不可用 Pod 个数的计算方法:replicas – minAvailable)。 任何会导致处于健康(healthy) 状态的副本数量低于指定预算的清空操作都将被阻止。

五、驱逐 API

如果不喜欢使用 kubectl drain (比如避免调用外部命令,或者更细化地控制 Pod 驱逐过程), 也可以用驱逐 API 通过编程的方式达到驱逐的效果。

  • 广告合作

  • QQ群号:707632017

温馨提示:
1、本网站发布的内容(图片、视频和文字)以原创、转载和分享网络内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。邮箱:2942802716#qq.com(#改为@)。 2、本站原创内容未经允许不得转裁,转载请注明出处“站长百科”和原文地址。