K8s drain和cordon的区别
K8s drain和cordon的区别
Kubernetes中Drain和Cordon的区别
Cordon(封锁节点)
作用
- 标记节点为不可调度
- 新的Pod不会被调度到该节点
- 现有Pod不受影响,继续正常运行
使用场景
1 | # 封锁节点 |
实际效果
1 | 节点状态变化: |
Drain(排空节点)
作用
- 首先执行Cordon操作(封锁节点)
- 优雅地驱逐节点上的所有Pod
- 等待Pod在其他节点上重新启动
- 节点变为空节点
使用场景
1 | # 排空节点(默认行为) |
详细对比
特性 | Cordon | Drain |
---|---|---|
调度影响 | ✓ 封锁调度 | ✓ 封锁调度 |
Pod驱逐 | ✗ 不驱逐 | ✓ 驱逐所有Pod |
节点状态 | 有Pod运行 | 空节点(除DaemonSet) |
使用场景 | 临时维护 | 节点下线/升级 |
对服务影响 | 无直接影响 | 短暂中断后恢复 |
实际操作示例
Cordon操作流程
1 | # 1. 查看节点状态 |
Drain操作流程
1 | # 1. 排空节点 |
保护的Pod类型
Drain不会删除的Pod
- DaemonSet管理的Pod
- Mirror Pod(由kubelet管理)
- 静态Pod
处理DaemonSet
1 | # 忽略DaemonSet Pod |
使用场景对比
Cordon适用场景
1 | # 1. 临时维护 |
Drain适用场景
1 | # 1. 节点硬件维护 |
恢复操作
恢复Cordon节点
1 | kubectl uncordon node-name |
恢复Drain节点
1 | # 1. 完成维护后解除封锁 |
注意事项
Drain的注意事项
1 | # 1. 优雅终止时间 |
最佳实践
1 | # 1. 先Cordon再Drain |
总结
操作 | 主要目的 | 影响范围 | 适用场景 |
---|---|---|---|
Cordon | 阻止新调度 | 调度器 | 临时维护、问题排查 |
Drain | 完全清空节点 | 所有Pod | 节点维护、升级、退役 |
简单记忆:
- Cordon = “请勿入内”(现有住户可以继续住)
- Drain = “请搬走”(所有住户都要搬走,房子要装修)
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Roger-Lv's space!
评论