Skip to content

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强制驱逐不受控制器管理的 Podkubectl 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

工作原理

  1. 自动执行 cordon:首先将节点标记为不可调度(SchedulingDisabled)
  2. 驱逐 Pod:根据策略驱逐节点上所有可驱逐的 Pod
  3. 等待重新调度:确保被驱逐的 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-daemonsets

2. 处理有本地存储的 Pod

bash
# 确保有备份方案后再删除本地数据
kubectl drain node1 --delete-emptydir-data

3. 处理 PodDisruptionBudget

bash
# 查看PDB限制
kubectl get poddisruptionbudgets -A

# 必要时临时修改PDB限制
kubectl edit pdb/my-app-pdb

注意事项

  1. DaemonSet 处理:必须使用 --ignore-daemonsets,否则命令会失败
  2. 数据持久性:使用 --delete-emptydir-data 会删除临时数据,需谨慎
  3. 资源检查:确保集群有足够资源接收被驱逐的 Pod
  4. 服务影响
    • 检查 PodDisruptionBudget 限制
    • 避免在业务高峰期执行
    • 考虑分批操作(对大集群)

与相关命令对比

命令功能Pod 影响典型场景
cordon标记不可调度不驱逐临时隔离
drain标记+驱逐驱逐所有可迁移Pod节点维护
uncordon恢复可调度不直接影响维护后恢复

kubectl drain 是 Kubernetes 节点生命周期管理的核心命令,正确使用可以确保集群维护过程平稳无感知。建议在执行前通过 --dry-run 参数测试,并确保有完整的回滚方案。