多副本不等于高可用,根本原因在于未配置探针、pdb和服务对齐:readinessprobe缺失导致endpoints为空、livenessprobe误配引发crashloopbackoff、selector与labels不一致使流量无法到达pod,即使3个pod均显示running,服务仍不可用。

多副本本身不等于高可用,没配探针、没设PDB、没做服务对齐,3个Pod照样集体不可用。
为什么replicas: 3起不到作用
常见现象是 kubectl get pods 全显示 Running,但 curl 服务地址却超时或返回空响应。根本原因不是副本数不够,而是流量根本没打到 Pod 上,或者 Pod 虽然 Running 却无法处理请求。
- Pod 的
readinessProbe没配或失败 → Service 的Endpoints为空 → 流量进不来 -
livenessProbe初始延迟太短(initialDelaySeconds: 5)→ Go 应用还没监听完就触发重启 → 进入CrashLoopBackOff - Go HTTP server 绑定的是
127.0.0.1:8080而非0.0.0.0:8080→ 容器内通,Service 流量不通 - Deployment 的
selector和 Pod template 的labels不一致(比如大小写、拼错 key)→ Endpoints 无法自动关联
必须配的三个探针:startup/readiness/liveness
Go 应用冷启动慢(比如要连 Redis、加载配置、预热缓存),用 initialDelaySeconds 硬等容易误杀。推荐组合使用:
-
startupProbe:只在启动阶段生效,判断“真就绪”。例如用exec执行./health --ready或httpGet访问/health/ready,成功后才启用其他探针 -
readinessProbe:决定是否把 Pod 加入 Service 的 Endpoint 列表。建议路径设为/health/ready,失败即摘流 -
livenessProbe:决定是否重启容器。路径建议用/health/live,只检查进程存活和基本依赖(如 DB 连接池是否活着),避免因临时超时反复重启
三者参数需错开:startupProbe 的 failureThreshold × periodSeconds 应覆盖最慢启动时间;readinessProbe 的 periodSeconds 建议设为 5–10s;livenessProbe 的 periodSeconds 可稍长(15–30s),避免抖动误判。
滚动更新时如何防止全量中断
Kubernetes 默认滚动更新会逐个替换 Pod,但如果节点维护或资源紧张,可能同时驱逐多个副本——尤其当没设 PodDisruptionBudget 时。
- 加
PDB:例如minAvailable: 2或maxUnavailable: 1,确保任意时刻至少有 2 个 Pod 在线 - 避免
maxSurge: 0+maxUnavailable: 100%这类危险组合,这等于允许一次干掉全部副本 - Init Container 做前置依赖检查:比如用
curl -f http://redis:6379/ping确认依赖就绪再启动主容器,防止主容器反复 Crash 导致 PDB 失效
另外,terminationGracePeriodSeconds 至少设为 30s,并在 Go 代码中正确处理 SIGTERM,调用 server.Shutdown() 等待活跃请求完成,否则连接会被粗暴断开。
Service 和 Ingress 对齐是最后防线
再多副本、再准探针,如果流量链路断在中间,一样白搭。
- 检查
kubectl describe service <name></name>,确认Endpoints字段有 IP 列表。为空?立刻查selector和 Pod labels 是否匹配 - Ingress 的
serviceName和servicePort必须和后端 Service 的metadata.name和spec.ports[0].port(不是targetPort)严格一致 - 跨 namespace 调用必须用全限定名:
my-svc.my-ns.svc.cluster.local,光写my-svc只在同 ns 生效 - Service 的
type: ClusterIP无法被集群外访问,对外暴露必须用LoadBalancer或NodePort,或配 Ingress
真正容易被忽略的点:Go 应用日志里没打探针健康检查的访问记录,说明 readiness/liveness 路径压根没被调用——大概率是探针配置里的 port 或 path 写错了,或者 Service 没转发到对应端口。











