在 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 后才重新使用