排水节点是什么
排水节点等于两步操作:先把节点标记为不可调度,阻止新对象落上来;再逐个驱逐节点上可驱逐的对象,让它们在其他节点重建。它是节点维护、内核升级、硬件更换前的标准前置动作。执行过程会等待实例优雅退出,因此耗时取决于实例的终止行为与约束设置。
为什么会被卡住
两个原因最常见:一是节点上运行着由控制器托管、必须在每台节点上都有一份的组件,它们不会被驱逐;二是驱逐受可用性保护策略限制,如果驱逐会导致某服务可用副本不足,操作会一直被拒绝并反复重试。前者需要显式确认忽略,后者需要先解决副本就绪问题。
基本信息
| 适用环境 | 任何 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 # 维护结束后恢复调度选项与含义
| 选项 | 含义 | 注意事项 |
|---|---|---|
| 忽略托管组件 | 跳过必须在每节点运行的组件 | 不加会直接报错中断 |
| 允许删除临时卷数据 | 确认可以丢弃临时卷里的数据 | 不加则遇到这类对象会中止 |
| 等待终止 | 等待实例优雅退出后继续 | 耗时取决于终止宽限期 |
| 强制删除 | 跳过优雅流程直接移除 | 仅在确认无状态依赖时使用 |
排水前先确认目标服务在其他节点上还有足够的可用副本,否则驱逐会被可用性保护策略一直拒绝。
临时卷中的数据会随对象删除而永久丢失,排水前必须确认这些数据可以丢弃。