安全下线kubernetes物理worker节点需先检查状态与依赖、驱逐pod并解除存储网络绑定,再删除node对象;具体包括cordon隔离、drain迁移负载(注意local-path/hostpath数据备份)、最后delete node。

在Kubernetes集群中安全下线一台物理Worker节点,必须确保其上所有业务Pod已迁移、状态服务无数据丢失、网络与存储依赖已解除,否则直接删除节点会导致服务中断或etcd残留异常。
确认节点当前负载与关键依赖
先检查目标节点是否处于Ready状态且无紧急告警:kubectl get node worker31.whisky.cloud -o wide
执行kubectl describe node worker31.whisky.cloud,重点查看Conditions里Allocatable和Capacity是否匹配、Events中是否有DiskPressure/MemoryPressure/NetworkUnavailable等异常条目——【若出现MemoryPressure,必须先清理或迁移高内存Pod,否则drain会卡住】
列出该节点上运行的所有Pod,特别关注StatefulSet、DaemonSet和带PDB(PodDisruptionBudget)的控制器:kubectl get pods -A -o wide | grep worker31.whisky.cloud
检查是否有使用local-path-provisioner或hostPath卷的Pod:kubectl get pv -o wide | grep worker31.whisky.cloud;若有,需人工确认数据已备份或可丢弃——【local卷数据不会随Pod迁移自动带走,必须提前处理】
标记节点为不可调度并驱逐工作负载
第一步:立即隔离节点,阻止新Pod被调度到该物理机:kubectl cordon worker31.whisky.cloud
第二步:执行驱逐命令,强制迁移所有可迁移Pod。推荐使用以下完整参数组合:
kubectl drain worker31.whisky.cloud \
--ignore-daemonsets \
--delete-emptydir-data \
--force \
--timeout=600s \
--pod-selector="!controller-revision-hash"
其中--delete-emptydir-data会清空节点本地emptyDir卷内容,适用于无状态服务;但若存在依赖emptyDir缓存中间结果的关键任务(如某些CI构建Pod),需提前确认是否允许丢失——【该参数不可逆,执行即删,无回收站】
驱逐过程中用watch kubectl get pods -A -o wide | grep worker31.whisky.cloud实时观察剩余Pod数量,直到输出为空。
从集群中彻底删除节点对象
当kubectl get nodes不再显示worker31.whisky.cloud,或其状态变为NotReady且无Pod关联后,执行最终移除:
kubectl delete node worker31.whisky.cloud
该操作仅删除APIServer中该节点的Node对象,不会影响物理机本身。执行后再次运行kubectl get nodes验证其已消失。











