1. 理解K8s节点维护的核心需求
当你管理一个Kubernetes集群时,节点维护是绕不开的日常工作。想象一下,这就像管理一支足球队——有时候你需要让某个球员暂时休息(节点升级),有时候球员受伤需要治疗(硬件故障),还有些时候球队需要精简人员(集群缩容)。这时候,你就需要三把"瑞士军刀":cordon、drain和delete。
我刚开始接触K8s时,经常搞混这三个命令。直到有一次线上事故,因为用错了命令导致服务中断,才真正明白它们的区别。简单来说:
- cordon:就像给节点贴个"请勿打扰"的标签,新来的Pod不会分配到这里,但现有的Pod照常工作
- drain:更礼貌的"请离开",会优雅地迁移现有Pod到其他节点
- delete:直接"开除",节点从集群中彻底消失
选择哪个命令,取决于你的维护目标:
- 无损隔离(cordon):临时性维护,比如安全检查
- 优雅驱逐(drain):计划性维护,比如内核升级
- 永久移除(delete):节点退役或硬件报废
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. cordon:最温和的隔离手段
2.1 适用场景与实操
上周我们集群有个节点需要安装安全补丁,我就用了cordon。这个命令特别适合:
- 短期维护(<30分钟)
- 不需要重启节点的操作
- 测试新节点稳定性时隔离观察
实际操作很简单:
bash复制# 查看当前节点状态
kubectl get nodes
# 隔离节点
kubectl cordon node-01
# 验证状态
kubectl describe node node-01 | grep -i schedul
你会看到SchedulingDisabled: true的标记。这时候新创建的Pod会自动避开这个节点,但原有的Pod纹丝不动。
2.2 常见误区
新手容易犯两个错误:
- 以为cordon能迁移Pod:实际上它只阻止新调度,不会影响已有Pod
- 忘记恢复调度:维护完成后一定要执行:
bash复制kubectl uncordon node-01
我有个同事曾经cordon了一个节点后忘记uncordon,三天后那个节点还处于隔离状态,导致集群资源利用率不均。
