排水在做什么
排水把节点标记为不可调度,并逐个请求删除节点上的 Pod,让副本在其他节点重建。它用于节点维护、升级与下线前的安全腾空。整个过程能不能顺利推进,取决于几个参数是否给对,以及工作负载的冗余是否真的够用。
基本信息
| 适用平台 | kubectl 1.20+,与集群发行版无关 |
|---|---|
| 前置效果 | 节点被标记为不可调度 |
| 终止时机 | 需要自行确认何时解除不可调度状态 |
| 阻塞来源 | 守护进程集 Pod、临时数据、无控制器管理的 Pod、中断预算 |
| 必要检查 | 副本冗余是否足够,中断预算是否允许腾空 |
典型使用场景
- 节点内核升级与重启前的腾空
- 把节点从集群中摘除并重新加入
- 硬件维修或磁盘更换前的准备
- 压测或扩容前把节点清空,用于调整资源布局
- 排查节点侧异常时先把业务迁走再动手
常用参数
| 参数 | 作用 | 注意点 |
|---|---|---|
| 忽略守护进程集 | 跳过守护进程管理的 Pod | 这类 Pod 不会被驱逐,属于预期行为 |
| 允许临时目录数据 | 允许驱逐使用临时目录的 Pod | 本地数据会随 Pod 消失 |
| 强制删除 | 删除没有控制器管理的 Pod | 这类 Pod 不会被重建,确认后可用 |
| 整体超时 | 等待上限 | 超时退出时节点可能只排了一半 |
| 优雅宽限 | 覆盖 Pod 声明的终止宽限 | 缩短可能导致进程被强杀 |
组合示例
组合示例
kubectl get pods -A -o wide --field-selector spec.nodeName=node1 # 先看节点上有什么
kubectl drain node1 --ignore-daemonsets --delete-emptydir-data --timeout=300s
kubectl get nodes # 确认节点进入不可调度状态
kubectl get pods -A -o wide --field-selector spec.nodeName=node1 # 确认残留
kubectl uncordon node1 # 维护完成后恢复调度排水命令本身不改动工作负载的副本数,能否腾空完全取决于集群其他节点是否有足够容量。容量不足时 Pod 会停在等待调度状态,看起来像卡住,其实是装不下。
排水会中断有状态服务的本地数据。使用临时目录且没有持久卷的工作负载,被驱逐后数据无法恢复,确认业务可容忍再执行。