首页/云/Kubernetes 速查/drain 排水节点
集群运维与排障54 条

drain 排水节点

drain = cordon + 逐个驱逐可驱逐的 Pod:受 PDB 与 DaemonSet 约束,是节点维护、升级前的标准动作。

Kubernetes 速查云更新于 2026-10-13

排水节点是什么

排水节点等于两步操作:先把节点标记为不可调度,阻止新对象落上来;再逐个驱逐节点上可驱逐的对象,让它们在其他节点重建。它是节点维护、内核升级、硬件更换前的标准前置动作。执行过程会等待实例优雅退出,因此耗时取决于实例的终止行为与约束设置。

为什么会被卡住

两个原因最常见:一是节点上运行着由控制器托管、必须在每台节点上都有一份的组件,它们不会被驱逐;二是驱逐受可用性保护策略限制,如果驱逐会导致某服务可用副本不足,操作会一直被拒绝并反复重试。前者需要显式确认忽略,后者需要先解决副本就绪问题。

基本信息

适用环境任何 Kubernetes 发行版
两个动作标记不可调度与驱逐现有对象
跳过对象由控制器托管、必须在每节点运行的组件
受阻原因可用性保护策略不允许可用副本进一步减少
数据风险临时卷中的数据会随对象删除而丢失
恢复方式维护结束后取消不可调度标记,让新对象可以重新落上来

典型使用场景

  • 节点升级:内核或运行时升级前把业务迁走
  • 硬件维护:更换磁盘、内存或整机前清空节点
  • 节点下线:缩容集群时安全移除机器
  • 故障隔离:节点出现疑似硬件问题时先排空
  • 资源整理:把分散的小负载集中,腾出整块节点
  • 演练验证:验证业务在其他节点上能否正常承接流量

标准排水流程

标准排水流程
kubectl get pods -A -o wide --field-selector spec.nodeName=node-1   # 先看节点上有什么
kubectl cordon node-1                                                 # 只标记不可调度,稳妥起见先做这一步
kubectl drain node-1 --ignore-daemonsets --delete-emptydir-data       # 驱逐可驱逐的对象
kubectl get nodes                                                      # 确认节点状态
kubectl uncordon node-1                                                # 维护结束后恢复调度

选项与含义

选项含义注意事项
忽略托管组件跳过必须在每节点运行的组件不加会直接报错中断
允许删除临时卷数据确认可以丢弃临时卷里的数据不加则遇到这类对象会中止
等待终止等待实例优雅退出后继续耗时取决于终止宽限期
强制删除跳过优雅流程直接移除仅在确认无状态依赖时使用
排水前先确认目标服务在其他节点上还有足够的可用副本,否则驱逐会被可用性保护策略一直拒绝。
临时卷中的数据会随对象删除而永久丢失,排水前必须确认这些数据可以丢弃。

易错点

  • 不带跳过托管组件的参数:遇到这类组件直接报错中断,排水流程半途而止
  • 临时卷数据未确认就丢弃:数据永久丢失且无法恢复
  • 业务未评估就排水:其他节点容量不足或副本不够,实例无处重建导致长时间不可用
  • 维护完成忘记恢复调度:节点长期处于不可调度状态,容量白白浪费

数据来源与参考

  • Kubernetes 官方文档 · kubectl drain
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌