kubectl drain - Kubernetes 节点安全清空命令
kubectl drain 是 Kubernetes 中用于安全清空节点的关键命令,主要功能是优雅地驱逐节点上的所有 Pod 并将其标记为不可调度状态。该命令是节点维护、升级或下线前的标准操作流程,确保工作负载能够平滑迁移到其他可用节点。
语法格式
bash
kubectl drain <NODE_NAME> [options]核心选项参数
| 选项 | 描述 | 示例 |
|---|---|---|
--ignore-daemonsets | 忽略 DaemonSet 管理的 Pod(必须指定) | kubectl drain node1 --ignore-daemonsets |
--delete-emptydir-data | 删除使用 emptyDir 卷的 Pod 数据 | kubectl drain node1 --delete-emptydir-data |
--force | 强制驱逐不受控制器管理的 Pod | kubectl drain node1 --force |
--grace-period | 设置 Pod 终止的宽限期(秒) | kubectl drain node1 --grace-period=300 |
--timeout | 设置命令执行的超时时间 | kubectl drain node1 --timeout=5m |
--dry-run | 试运行模式(不实际执行) | kubectl drain node1 --dry-run=client |
工作原理
- 自动执行 cordon:首先将节点标记为不可调度(SchedulingDisabled)
- 驱逐 Pod:根据策略驱逐节点上所有可驱逐的 Pod
- 等待重新调度:确保被驱逐的 Pod 在其他节点上成功运行
标准维护流程示例
bash
# 1. 查看节点状态
kubectl get nodes
# 2. 安全清空节点(完整参数推荐)
kubectl drain node1 \
--ignore-daemonsets \
--delete-emptydir-data \
--force \
--grace-period=300
# 3. 执行节点维护操作(系统升级/硬件更换等)
# 4. 恢复节点可调度状态
kubectl uncordon node1
# 5. 验证节点状态
kubectl get nodes特殊场景处理
1. 处理静态 Pod
bash
# 需要手动迁移静态Pod配置文件
kubectl drain node1 --force --ignore-daemonsets2. 处理有本地存储的 Pod
bash
# 确保有备份方案后再删除本地数据
kubectl drain node1 --delete-emptydir-data3. 处理 PodDisruptionBudget
bash
# 查看PDB限制
kubectl get poddisruptionbudgets -A
# 必要时临时修改PDB限制
kubectl edit pdb/my-app-pdb注意事项
- DaemonSet 处理:必须使用
--ignore-daemonsets,否则命令会失败 - 数据持久性:使用
--delete-emptydir-data会删除临时数据,需谨慎 - 资源检查:确保集群有足够资源接收被驱逐的 Pod
- 服务影响:
- 检查 PodDisruptionBudget 限制
- 避免在业务高峰期执行
- 考虑分批操作(对大集群)
与相关命令对比
| 命令 | 功能 | Pod 影响 | 典型场景 |
|---|---|---|---|
cordon | 标记不可调度 | 不驱逐 | 临时隔离 |
drain | 标记+驱逐 | 驱逐所有可迁移Pod | 节点维护 |
uncordon | 恢复可调度 | 不直接影响 | 维护后恢复 |
kubectl drain 是 Kubernetes 节点生命周期管理的核心命令,正确使用可以确保集群维护过程平稳无感知。建议在执行前通过 --dry-run 参数测试,并确保有完整的回滚方案。
