在 Kubernetes 集群中,节点故障是常见的事故之一。Kubernetes 提供了节点故障检测与容错能力,可以最大限度地避免节点故障对 Pod 和服务的影响。
节点故障处理的主要流程是:
- 节点故障检测:通过 kubelet 的心跳机制监控节点状态,一旦超过指定时间间隔没有接收到心跳,则标记节点为 NotReady 状态。
- 标记故障节点:将节点的状态更新为 NotReady,以防止新的 Pod 被调度到该节点。
- 驱逐已存在的 Pod:在故障节点上运行的 Pod 会根据不同策略被驱逐,常见的有:
- 删除 Pod:直接将 Pod 从 API Server 中删除,Pod 会重建。
- 迁移 Pod:将 Pod 迁移到其他正常节点上,这需要 Pod 支持迁移。
- 保证服务可用性:对于以 Pod 为后端的 Service,要根据服务类型采取不同策略保证服务可用。
- ClusterIP 类型:直接删除后端 Pod,等待其重建或迁移后重新注册到 Service。
- NodePort/LoadBalancer 类型:除了处理后端 Pod 外,还需要更新云提供商对应的端口映射和负载均衡配置,指向正常的节点和 Pod。
- 隔离与替换故障节点:根据集群配置,可将故障节点隔离或直接替换,防止其对集群产生进一步影响。
以 NodePort 类型 Service 为例,节点故障处理流程是:
- kubelet 超过一定时间未接收到 Node2 的心跳,将其标记为 NotReady 状态。
- Node2 上的 Pod 根据策略被删除或迁移至其他节点。
- Service Controller 检测到 Node2 上的后端 Pod 发生变化,从而更新与该 Service 对应的 NodePort 槽位和云 LB 等。
- apiserver 将 Node2 的状态更新为 NotReady,防止新的 Pod 被调度至其上。
- 人工或控制器对 Node2 进行隔离或替换。
- Node2 恢复后,需要手动将其 Ready 后,apiserver 才会重新使用该节点。
所以总结来说,节点故障处理的主要流程是:
- 故障检测:监控节点状态并标记 NotReady
- 操作已存在 Pod:删除或迁移至其他节点
- 保证服务可用:更新 Service 对应配置和端口映射
- 隔离/替换故障节点:防止进一步影响
- 节点恢复:人工标记 Ready 后才重新使用