k8s cordon和drain使用

Kubernetes Cordon

kubectl cordon 命令用于将节点标记为不可调度。这意味着 Kubernetes 调度器不会将任何新的 Pod 调度到该节点上。但是,已经在该节点上运行的 Pod 不会受到影响,它们将继续运行。在 kubectl cordon 节点后删除节点上已有 Pod,Kubernetes 会自动将新的 Pod 调度到其他可用节点上,从而实现 Pod 的迁移。但是,请务必注意控制器、资源限制、节点亲和性/反亲和性以及 Taints 和 Tolerations 等因素,以确保 Pod 能够成功迁移。

使用场景

  • 节点维护:在对节点进行维护(例如,硬件更换、内核更新、资源调整)之前,可以使用 cordon 命令来防止新的 Pod 调度到该节点上。

  • 资源调整:在调整节点的计算资源时,可以先使用 cordon 命令,以避免资源竞争。

  • 工作负载重新分配:在需要将工作负载重新分配到其他节点时,可以使用 cordon 命令来阻止新的 Pod 调度到目标节点上。

如何使用

  1. Cordon 节点

    使用以下命令将节点标记为不可调度:

    kubectl cordon <node-name>

    将 <node-name> 替换为要 cordon 的节点的名称。

  2. 检查节点状态

    使用以下命令检查节点的状态,确认节点是否已被 cordon:

    kubectl get nodes <node-name>

    在输出中,STATUS 列将显示 Ready,SchedulingDisabled,表示节点已被 cordon。

  3. Uncordon 节点

    完成维护或调整后,可以使用以下命令将节点标记为可调度:

    kubectl uncordon <node-name>

    这将撤销 cordon 操作,允许新的 Pod 调度到该节点上。


Kubernetes Drain

kubectl drain 命令用于安全地将节点上的所有 Pod 驱逐到其他节点。在驱逐 Pod 之前,drain 命令会先 cordon 节点,以防止新的 Pod 调度到该节点上。

使用场景

  • 节点维护:在需要关闭或删除节点之前,可以使用 drain 命令将节点上的所有 Pod 驱逐到其他节点,以确保应用程序的可用性。

  • 节点缩容:在需要缩减集群规模时,可以使用 drain 命令将要移除的节点上的 Pod 驱逐到其他节点。

如何使用

  1. Drain 节点

    使用以下命令 drain 节点:

    kubectl drain <node-name> --ignore-daemonsets --force
    • --ignore-daemonsets:忽略 DaemonSet 管理的 Pod。DaemonSet 通常提供节点本地服务,即使节点被标记为不可调度,也应该在节点上运行。

    • --force:强制驱逐 Pod,即使它们没有被 ReplicationController、Job 或 DaemonSet 管理。

  2. 处理 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 驱逐到其他节点。在进行节点维护、资源调整或缩容时,可以使用这两个命令来确保应用程序的可用性。


参考:

anzhihe 安志合个人博客,版权所有 丨 如未注明,均为原创 丨 转载请注明转自:https://chegva.com/6300.html | ☆★★每天进步一点点,加油!★★☆ | 

您可能还感兴趣的文章!

发表评论

电子邮件地址不会被公开。 必填项已用*标注