kubectl drain 命令用于为 Kubernetes 节点的维护做好安全准备。具体做法是将所有正在运行的 Pod 逐出节点,确保在维护完成之前不会调度新的 Pod。


在对节点进行维护(如升级操作系统或硬件)之前,必须先排空节点。排空意味着安全地驱逐所有 Pod,允许它们在其他节点上重新排程。

【代码清单】

kubectl drain <node-name> --ignore-daemonsets --delete-local-data

【执行结果】

node/<node-name> cordoned
evicting pod default/nginx-deployment-6f77f7f8d9-w9j6q
evicting pod default/nginx-deployment-6f77f7f8d9-4x9kl
pod/nginx-deployment-6f77f7f8d9-w9j6q evicted
pod/nginx-deployment-6f77f7f8d9-4x9kl evicted

kubectl drain 命令在 Kubernetes 环境中至关重要,因为它能确保节点在进行维护时不会中断其上运行的应用程序。该命令通常包括三个步骤:Cordoning: 这将节点标记为不可调度节点,阻止在其上调度新 Pod: 强制驱逐 Pod,DaemonSets 和镜像 Pod 除外。忽略守护进程标志可确保守护进程不会中断: 删除本地数据:--delete-local-data(删除本地数据)标记可确保使用本地存储的 Pod 也被安全驱逐。如果不这样做,使用本地存储的 Pod 可能不会被驱逐,从而可能导致节点维护期间出现问题。需要注意的是,kubectl drain 适用于计划维护。对于计划外或紧急节点关闭,可能需要使用其他策略来避免服务中断。

【小知识】

守护进程集: 这些是在每个节点上运行的特殊 Pod,不会被 kubectl drain 自动驱逐。例如日志和监控代理: 该过程会将节点标记为不可调度节点,这意味着不能在该节点上调度新 Pod,但不会影响已运行的 Pod。运行 kubectl drain 时会自动执行此操作。