Kubernetes Cordon
kubectl cordon
命令用于将节点标记为不可调度。这意味着 Kubernetes 调度器不会将任何新的 Pod 调度到该节点上。但是,已经在该节点上运行的 Pod 不会受到影响,它们将继续运行。在 kubectl cordon
节点后删除节点上已有 Pod,Kubernetes 会自动将新的 Pod 调度到其他可用节点上,从而实现 Pod 的迁移。但是,请务必注意控制器、资源限制、节点亲和性/反亲和性以及 Taints 和 Tolerations 等因素,以确保 Pod 能够成功迁移。
使用场景
节点维护:在对节点进行维护(例如,硬件更换、内核更新、资源调整)之前,可以使用
cordon
命令来防止新的 Pod 调度到该节点上。资源调整:在调整节点的计算资源时,可以先使用
cordon
命令,以避免资源竞争。工作负载重新分配:在需要将工作负载重新分配到其他节点时,可以使用
cordon
命令来阻止新的 Pod 调度到目标节点上。
如何使用
Cordon 节点
使用以下命令将节点标记为不可调度:
kubectl cordon <node-name>
将
<node-name>
替换为要 cordon 的节点的名称。检查节点状态
使用以下命令检查节点的状态,确认节点是否已被 cordon:
kubectl get nodes <node-name>
在输出中,
STATUS
列将显示Ready,SchedulingDisabled
,表示节点已被 cordon。Uncordon 节点
完成维护或调整后,可以使用以下命令将节点标记为可调度:
kubectl uncordon <node-name>
这将撤销 cordon 操作,允许新的 Pod 调度到该节点上。
Kubernetes Drain
kubectl drain
命令用于安全地将节点上的所有 Pod 驱逐到其他节点。在驱逐 Pod 之前,drain
命令会先 cordon 节点,以防止新的 Pod 调度到该节点上。
使用场景
节点维护:在需要关闭或删除节点之前,可以使用
drain
命令将节点上的所有 Pod 驱逐到其他节点,以确保应用程序的可用性。节点缩容:在需要缩减集群规模时,可以使用
drain
命令将要移除的节点上的 Pod 驱逐到其他节点。
如何使用
Drain 节点
使用以下命令 drain 节点:
kubectl drain <node-name> --ignore-daemonsets --force
--ignore-daemonsets
:忽略 DaemonSet 管理的 Pod。DaemonSet 通常提供节点本地服务,即使节点被标记为不可调度,也应该在节点上运行。--force
:强制驱逐 Pod,即使它们没有被 ReplicationController、Job 或 DaemonSet 管理。处理 Grace Period
如果 Pod 有较长的 grace period,
drain
命令可能需要较长时间才能完成。可以使用--grace-period
标志来覆盖 Pod 的终止宽限期,并强制立即驱逐:kubectl drain <node-name> --grace-period 0 --force --ignore-daemonsets
请谨慎使用此选项,因为强制停止 Pod 可能会导致数据丢失或应用程序错误。
Cordon 和 Drain 的区别
cordon
命令只是将节点标记为不可调度,不会影响已经在节点上运行的 Pod。drain
命令会先 cordon 节点,然后将节点上的所有 Pod 驱逐到其他节点。
总结
cordon
和 drain
命令是 Kubernetes 中用于节点管理的重要工具。cordon
命令用于防止新的 Pod 调度到节点上,而 drain
命令用于安全地将节点上的所有 Pod 驱逐到其他节点。在进行节点维护、资源调整或缩容时,可以使用这两个命令来确保应用程序的可用性。
参考: