首页/云/云与容器速查/kubectl drain 驱逐节点工作负载
Kubernetes68 条

kubectl drain 驱逐节点工作负载

驱逐节点上的 Pod 以便安全维护:对可迁移 Pod 执行优雅驱逐(走 PDB),DaemonSet 与本地存储 Pod 需显式参数处理;先 cordon 再 drain。

云与容器速查云更新于 2026-10-13

kubectl drain 是什么

kubectl drain 驱逐节点上的工作负载,为节点维护做准备:它把可迁移的 Pod 逐个优雅删除,由控制器在别的节点上重建。执行时通常要加 --ignore-daemonsets,因为守护进程类 Pod 由节点级控制器管理、本身无法迁移;加上 --delete-emptydir-data 表示接受使用本地临时存储的 Pod 被删除、数据随之丢失。驱逐过程遵守 PodDisruptionBudget,预算不满足时会阻塞等待,所以正确顺序是先 cordon 再 drain。

基本信息

执行命令kubectl drain node-1 --ignore-daemonsets --delete-emptydir-data
预算约束遵守 PodDisruptionBudget,不满足时阻塞等待而不是强行删除
常用参数--ignore-daemonsets 通常必须加;--delete-emptydir-data 表示接受临时数据丢失
恢复调度维护完成后执行 kubectl uncordon 让节点重新接受调度
确认结果kubectl get pods -o wide --field-selector spec.nodeName=node-1

典型使用场景

  • 节点硬件维护或内核升级前清空负载,避免业务随机中断
  • 集群缩容前把节点上的业务迁移到其他节点
  • 节点出现异常征兆时先转移 Pod,把影响面降到最低
  • 重启 kubelet 或容器运行时前腾空节点,减少重启导致的抖动
  • 更换系统盘等必须停机的操作前,确保节点上没有业务残留

标准流程

标准流程
kubectl cordon node-1   # 先禁止新 Pod 调度上来
kubectl drain node-1 --ignore-daemonsets --delete-emptydir-data --timeout=300s
# 维护操作……
kubectl uncordon node-1   # 维护完成后恢复调度

常用参数与风险

参数作用风险
--ignore-daemonsets跳过守护进程类 Pod不加会直接报错退出
--delete-emptydir-data允许删除使用本地临时存储的 Pod该 Pod 的本地数据随之丢失
--force允许删除不受控制器管理的 Pod这类 Pod 不会被重建,可能造成服务缺失
--timeout设置驱逐等待超时超时中止后需人工确认剩余 Pod
--dry-run=client预演但不实际执行建议先预演确认影响范围
单副本服务被驱逐会直接中断:执行前检查副本数与预算设置,或者在业务低峰期操作,必要时先临时扩容再驱逐。
drain 只处理 Pod,不处理数据:使用本地盘的 Pod 被删除后数据仍留在原节点,需要确认这些数据能否重建,或者提前迁移,否则节点重建时数据会一并丢失。

易错点

  • 驱逐卡住不动:多半是预算或本地存储 Pod 挡路,查看事件定位具体对象,不要急着加 --force
  • 不加参数直接执行导致报错,随后随手加上 --force,有状态 Pod 的数据丢失风险同时升高
  • 忘记给节点加不可调度标记就直接驱逐,新 Pod 又被调度回来,形成来回迁移
  • 维护完成后忘记恢复调度,节点长期空转,资源利用率下降却难以察觉

数据来源与参考

  • Kubernetes Docs:kubectl drain
  • Kubernetes Docs:Pod Disruption Budget

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌