必须严格遵循“标记不可调度→安全驱逐→验证迁移→执行维护”流程:先cordon隔离节点,再drain驱逐Pod(区分StatefulSet/emptyDir等场景),实时监控PDB与Endpoints确保服务不中断,最后uncordon恢复调度。

在Kubernetes集群中执行节点维护时,必须确保业务不中断——这意味着不能简单停机或强制终止Pod,而要让所有工作负载平滑迁移到其他可用节点后再下线目标节点。这要求严格遵循“标记不可调度→安全驱逐→验证迁移→执行维护”的原子流程,任何跳步都可能导致服务抖动或数据丢失。
确认目标节点与当前负载分布
运行 kubectl get nodes 列出所有节点,找到待维护节点名称(例如 worker-03)。
检查该节点是否处于 Ready 状态且无磁盘/内存压力事件:
执行 kubectl describe node worker-03 | grep -A 10 "Conditions",确认 Type=Ready 且 Status=True,同时 MemoryPressure 和 DiskPressure 均为 False。
统计该节点上运行的Pod类型及关键性:kubectl get pods --all-namespaces -o wide | grep worker-03 | awk '{print $5}' | sort | uniq -c。
若输出含 StatefulSet 或 DaemonSet,需额外检查其PDB和存储绑定方式;若含大量 Job 或 CronJob Pod,说明可能有定时任务正在运行,应避开其执行窗口。
标记节点为不可调度(Cordon)
执行 kubectl cordon worker-03。
这一步会将节点 Spec.Unschedulable 字段设为 true,阻止新Pod被调度进来,但不影响已有Pod继续运行。
验证结果:kubectl get nodes | grep worker-03 应显示 Ready,SchedulingDisabled。
执行安全排水(Drain)并处理特殊Pod
方法一:标准无状态服务排水kubectl drain worker-03 --ignore-daemonsets --grace-period=30 --timeout=120s
方法二:含本地临时存储(emptyDir)的Pod必须显式清理kubectl drain worker-03 --ignore-daemonsets --delete-emptydir-data --grace-period=30 --timeout=120s
【--delete-emptydir-data 是强制开关,不加会导致排水卡住】
方法三:有StatefulSet且使用local PV时,禁止直接drain
先手动迁移Pod:kubectl patch statefulset <name> -p '{"spec":{"replicas":0}}'</name> → 等Pod全部终止 → 删除对应PV绑定 → 再执行drain。否则【local PV数据将永久丢失】。
实时监控排水进度与服务可用性
第一步:观察目标节点上Pod是否持续减少watch kubectl get pods --all-namespaces -o wide | grep worker-03
第二步:确认关键服务副本数未低于PDB阈值kubectl get pdb --all-namespaces -o wide,找出约束目标服务的PDB对象,再运行:kubectl get pods -l app=my-app --field-selector spec.nodeName!=worker-03 | wc -l,确保数量 ≥ PDB中定义的 minAvailable。
第三步:检查服务端点是否始终在线kubectl get endpoints my-service -n default,确认 SUBSETS.ADDRESSES 中仍有非worker-03的IP地址,且NOT READY ADDRESSES为空。
完成维护后恢复节点调度能力
1. 确认硬件/系统更新已完成,kubelet进程正常运行:ssh worker-03 'systemctl is-active kubelet' 返回 active。
2. 执行 kubectl uncordon worker-03。
3. 验证节点重新变为可调度:kubectl get nodes worker-03 -o jsonpath='{.spec.unschedulable}' 输出应为空字符串。
4. 观察是否有新Pod自动调度到该节点:kubectl get pods --all-namespaces -o wide | grep worker-03 | head -3。


















