
一、问题一:节点故障如何快速恢复服务?

在 Kubernetes 集群中,当某个节点发生故障时,通过以下机制快速恢复服务:
1、节点故障检测
-
节点控制器(Node Controller) 定期检查节点状态(默认每 5 秒一次)。
-
若节点连续不可达超过
--node-monitor-grace-period(默认 40 秒),节点会被标记为NotReady。 -
持续不可达超过
--pod-eviction-timeout(默认 5 分钟),节点上的 Pod 会被驱逐。
2、污点(Taint)自动标记
- 节点故障后,Kubernetes 会自动为故障节点添加污点:
“`shell
kubectl taint nodes <故障节点名> node.kubernetes.io/unreachable:NoExecute
“`
-
效果:
-
NoExecute:立即驱逐该节点上未配置容忍的 Pod。 -
NoSchedule:阻止新 Pod 调度到故障节点。
3、Pod 驱逐与重新调度
-
驱逐策略:
-
Pod 被驱逐后,Kubernetes 调度器会根据 Pod 的调度规则(如亲和性、资源请求)将其重新分配到健康节点。
-
示例示意图:
-
正常状态:Pod 均匀分布在 4 个节点(Node01~Node04)
-
故障状态:若 Node01 故障,其上的 Pod 被驱逐并重新调度到 Node02、Node03、Node04。
-
-
关键配置:
-
容忍(Toleration):若希望某些关键 Pod 在节点故障后暂时保留,可配置容忍污点:
yaml
tolerations:
- key: "node.kubernetes.io/unreachable"
operator: "Exists"
effect: "NoExecute"
tolerationSeconds: 3600 # 容忍时间(秒),超时后驱逐
4、服务快速恢复的优化策略
- Pod 反亲和性(Anti-Affinity)
yaml
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchLabels:
app: my-app
topologyKey: "kubernetes.io/hostname"
-
确保同一服务的 Pod 分布在多个节点,避免单点故障。
-
多副本部署:
-
通过 Deployment 或 StatefulSet 配置多个副本(Replicas),提高容错能力。
-
集群自动扩展(Cluster Autoscaler)
-
若资源不足,自动扩展新节点以承载被驱逐的 Pod
5、节点恢复后的处理
-
当故障节点恢复后,Kubernetes 自动移除污点。
-
Pod 回迁控制:
-
默认情况下,已调度到其他节点的 Pod 不会自动回迁到原节点。
-
可通过配置 Pod 的亲和性(如偏好原节点标签)实现有条件的回迁。
通过 污点驱逐、自动重新调度、多副本部署 和 反亲和性规则,Kubernetes 能在节点故障时快速恢复服务,确保业务连续性。同时结合 集群自动扩展 和 资源请求声明,可进一步提升恢复效率和资源利用率。







暂无评论内容