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 被删除后数据仍留在原节点,需要确认这些数据能否重建,或者提前迁移,否则节点重建时数据会一并丢失。