ingress controller 是独立部署的七层流量网关,监听 ingress 等资源变化,动态生成代理配置(如 nginx),实现基于域名/路径的路由、tls 终止与负载均衡,依赖 service 作为唯一后端。

Nginx 本身不直接处理 Pod 宕机后的“转移”,它作为反向代理或负载均衡器,只负责把请求转发给后端服务。真正实现“Pod 宕机后自动转移流量”的,是容器编排平台(如 Kubernetes)+ Nginx(或 Ingress Controller)协同完成的。
关键不在 Nginx 单独怎么做,而在于整个链路如何设计:让 Nginx 始终只连健康 Pod,且当 Pod 消失时,上游自动更新、下游无感切换。
下面分三部分讲清楚怎么落地:
Nginx 如何感知后端 Pod 是否宕机
Nginx 自身不主动探活,必须靠外部机制提供“动态健康列表”。常见方式有两种:
通过 Kubernetes Service + Endpoints 自动同步
Service 是虚拟 IP,背后绑定一组 Pod 的 Endpoint。只要 Pod 处于 Running + Ready 状态,就会被自动加入 Endpoints;一旦 Pod 崩溃或就绪探针失败,Kubernetes 会秒级将其从 Endpoints 中剔除。
Nginx(尤其是用作 Ingress Controller 时)监听 Endpoints 变化,实时更新 upstream 列表。无需手动 reload,也无 DNS 缓存问题。-
配合主动健康检查(可选增强)
若使用自建 Nginx(非 Ingress),可在 upstream 中开启被动健康检查:upstream backend { server 10.244.1.10:8080 max_fails=3 fail_timeout=30s; server 10.244.1.11:8080 max_fails=3 fail_timeout=30s; keepalive 32; }max_fails和fail_timeout让 Nginx 在连续失败后临时摘除节点——但这只是兜底,不能替代 Kubernetes 的 Ready 探针。
Pod 宕机后,谁来重建?怎么保证新 Pod 能被 Nginx 发现?
这是容器层的核心能力,依赖两个机制:
-
Liveness + Readiness 探针定义“是否真挂了”
- Liveness 探针失败 → Kubernetes 杀掉并重启容器(解决僵死进程)
- Readiness 探针失败 → 立即从 Service 的 Endpoints 中移除该 Pod(这才是“对 Nginx 不可见”的关键)
示例配置:
readinessProbe: httpGet: path: /healthz port: 8080 initialDelaySeconds: 5 periodSeconds: 5 livenessProbe: httpGet: path: /healthz port: 8080 initialDelaySeconds: 20 periodSeconds: 10 Deployment 控制器自动拉起新实例
只要 Pod 因任何原因退出(包括被 OOM Kill、探针失败、节点宕机),Deployment 就会按replicas数量补足。新 Pod 启动后,若 Readiness 探针通过,几秒内就进入 Endpoints,Nginx 自动开始转发流量。
Nginx 层要不要做故障转移?怎么做才不冗余?
不需要自己写“主备 Nginx”或 Keepalived —— 那是传统虚拟机时代的做法。在 Kubernetes 中:
- 把 Nginx 本身也容器化为 Deployment 或 DaemonSet(推荐用官方
ingress-nginx) - 设置
replicas: 2+,配合 Pod 反亲和性(podAntiAffinity),确保多个副本分散在不同节点 - 用 Service(ClusterIP/NodePort/LoadBalancer)暴露 Nginx,前端流量由云厂商 LB 或物理 F5 分发
- 这样,即使一个 Nginx Pod 宕机,Service 会自动将请求转给其他健康的 Nginx 实例,完全透明
换句话说:故障转移是分层的
- 应用 Pod 层:K8s 负责重建 + Readiness 摘流
- Nginx 层:多副本 + Service 负载均衡,避免自身单点
- 流量入口层:云 LB 或硬件设备做 Nginx 实例的健康探测与切换
整套机制下,一次 Pod 宕机,用户通常感知不到错误(HTTP 5xx











