在 Kubernetes 集群中,节点是承载业务 Pod 运行的基础设施单元。对节点进行有序维护,例如系统升级、硬件更换或内核修补,是保障集群长期稳定与高可用的关键运维操作。本文将介绍一套在生产环境中经过验证的安全维护流程与核心注意事项。
1. 维护前检查与规划
在开始动手前,充分的准备工作至关重要。
确认节点健康状况
执行以下命令,确保目标节点状态为 Ready:
kubectl get nodes
如果节点状态异常(如 NotReady),应先排查问题,再进行维护。
清点节点上的Pod
了解当前在目标节点上运行的所有工作负载:
kubectl get pods -A -o wide | grep <NODE_NAME>
重点关注:
- 关键业务Pod:识别哪些Pod属于核心服务。
- 特殊存储Pod:确认是否有Pod使用了
Local Persistent Volumes(本地持久卷),这类Pod需要特殊处理。
- DaemonSet Pod:它们是节点级守护进程,通常不会被驱逐。
选择维护窗口
尽可能安排在业务流量低峰期进行维护,以最大限度减少对用户体验的影响。
2. 封锁节点
首要步骤是“冻结”节点,阻止新的Pod被调度到该节点上,为后续维护创造一个稳定的环境。
kubectl cordon <NODE_NAME>
执行此命令后,节点状态会变为 SchedulingDisabled,新的Pod将不会被调度到此节点,但已有Pod仍会继续运行。
3. 安全驱逐Pod
这是维护的核心环节,目的是将节点上的Pod优雅地迁移到集群中的其他健康节点上。
kubectl drain <NODE_NAME> --ignore-daemonsets --delete-emptydir-data
参数解释:
--ignore-daemonsets:忽略由 DaemonSet 管理的Pod,它们通常负责日志收集、网络插件等节点级任务,不应被驱逐。
--delete-emptydir-data:删除使用 emptyDir 临时卷的Pod的数据。请确保这些数据不重要。
关键前提:确保关键业务服务配置了多个副本,并且能够分布在不同的节点上,否则驱逐单副本Pod会导致服务中断。
驱逐完成后,务必验证业务是否正常运行,再进行下一步操作。
为什么 drain 命令会卡住?
在实际的运维/DevOps工作中,drain 过程可能因以下原因受阻:
| 原因 |
表现 |
解决方法 |
| Pod 副本数为1 |
drain 命令等待,因为驱逐会导致服务不可用 |
先对Deployment进行扩容,增加副本数 |
| 配置了 PodDisruptionBudget (PDB) |
PDB 限制了同时不可用的Pod数量,可能阻塞驱逐 |
临时调整PDB的minAvailable值或确保有足够健康副本 |
| 使用了 Local PV |
Pod 无法迁移到其他节点,因为数据是本地存储 |
需确认业务可停机,或使用网络存储方案 |
| StatefulSet Pod |
默认策略下,drain 不会驱逐 StatefulSet 管理的Pod |
需确认业务允许中断,或进行特殊迁移 |
| 节点资源紧张 |
集群其他节点资源不足,无法接纳被驱逐的Pod |
先释放其他节点资源,或临时扩容集群 |
4. 执行节点维护操作
当节点上的Pod被成功驱逐后,它便处于“空载”状态,此时可以进行计划内的维护工作:
- 升级操作系统或内核。
- 更新容器运行时(如 Docker 或 containerd)。
- 进行硬件维护:检查或更换磁盘、内存、网卡等。
- 调整系统参数。
5. 恢复节点服务
维护工作完成后,需要让节点重新加入集群,并恢复其接收新Pod调度的能力。
# 取消节点的封锁状态
kubectl uncordon <NODE_NAME>
# 验证节点状态已恢复为 Ready
kubectl get nodes
# 观察Pod是否被重新调度回该节点(取决于调度策略)
kubectl get pods -o wide
6. 核心注意事项与最佳实践
- 数据持久化:业务的重要数据必须通过
PersistentVolumeClaim (PVC) 挂载网络存储或使用可靠的分布式存储方案,避免依赖 emptyDir 导致数据丢失。
- 高可用部署:生产环境的核心服务必须采用多副本部署,并利用 Pod 反亲和性等策略分散在不同节点,确保单节点维护时服务不中断。
- 滚动维护:对于多节点集群,不要一次性维护所有节点。应采用分批、滚动的方式进行,始终保持足够的服务容量。
- 关注 DaemonSet 与静态 Pod:维护前需了解节点上的 DaemonSet(如网络插件、监控Agent)和静态 Pod(如 kube-apiserver 等)。它们不会被
drain 自动迁移,需要根据具体组件的要求进行单独处理。
- 预留资源缓冲:在节点资源使用率接近饱和时执行维护风险较高,迁移Pod可能失败。建议日常保持一定的资源余量,或在维护前主动释放部分负载。
总结来看,一次标准的 Kubernetes 节点维护流程可以概括为四个清晰步骤:封锁(Cordon)-> 驱逐(Drain)-> 维护 -> 解除封锁(Uncordon)。遵循此流程并充分考虑上述注意事项,能够最大程度保障维护期间业务的连续性。
