Nginx 与容器编排平台对接需三层协同:服务发现同步(如 Ingress Controller 或 Consul)、健康状态透传(复用 readiness probe 的 /healthz 端点)、配置热更新闭环(nginx -t 校验+reload+告警)。

Nginx 本身不感知容器生命周期,要实现与 Kubernetes、Docker Swarm 等编排平台的健康探测自动对接,关键不是让 Nginx “发现容器”,而是把容器平台的调度语义翻译成 Nginx 能理解并响应的配置与行为。核心在于三层协同:服务发现同步、健康状态透传、配置热更新闭环。
用 Service/Endpoint 或 Consul 自动同步后端节点列表
容器平台动态扩缩容时,Pod IP 频繁变化,Nginx 的静态 upstream 无法适应。必须引入外部服务发现机制:
- Kubernetes 场景下,通过 nginx-ingress-controller 原生集成:它监听 Endpoints/EndpointSlices 变更,自动生成 upstream 配置,并内置健康检查(默认基于 readiness probe 状态)
- 若使用自建 Nginx(非 Ingress Controller),可用 consul-template + nginx-upstream-conf:K8s 中部署 consul-registrator 或 kube-consul-sync,将 Service 自动注册为 Consul 服务;Nginx 节点定时拉取
/v1/health/service/myapp,生成带 IP:Port 的 upstream 块并 reload - 避免直接解析 K8s API —— 权限复杂、轮询开销大;应通过中间层(如 Consul、etcd、或专用 sidecar)做一次抽象和缓存
把容器就绪探针(readiness probe)结果映射为 Nginx 可识别的健康信号
容器平台的 readiness probe 是最权威的“是否可收流量”信号,Nginx 需复用该结论,而非重复探测:
- 在 Pod 中暴露统一健康端点(如
/healthz),该接口逻辑与 readiness probe 完全一致(检查 DB 连接、依赖服务、本地缓存等) - Nginx 主动探测该端点(用 nginx_upstream_check_module):
check type=http interval=3 rise=2 fall=5 timeout=1; check_http_send "GET /healthz HTTP/1.1\r\nHost: example.com\r\n\r\n"; - 关键细节:后端服务需支持在 HTTPS 端口上处理明文 HTTP 探针请求(即 TLS 终止前先路由健康请求),或单独暴露一个 HTTP 健康端口(如 8081),避免 TLS 握手失败干扰判断
配置变更自动触发 reload,且带语法校验与失败回滚
每次容器启停都会引起 upstream 变更,Nginx 必须安全、可靠地加载新配置:
- 生成的 upstream 配置文件(如
/etc/nginx/conf.d/upstream_backend.conf)必须被主配置include,禁止硬编码进 nginx.conf - reload 前强制执行
nginx -t;失败则保留旧文件、记录错误日志,并触发告警(如发往企业微信) - 推荐用 systemd ExecReload 或 Ansible handler 封装 reload 流程,避免脚本中直接调用
kill -HUP导致状态不一致 - OpenResty 用户可进一步用 lua_shared_dict 在内存中缓存节点健康状态,配合 init_worker_by_lua_block 定时刷新,减少配置重载频次
可观测性对齐:让 Prometheus 抓取的指标能反向定位到具体 Pod
自动化探测的价值只有在可观测闭环中才完整:
- 用 nginx-lua-prometheus 导出每个 upstream server 的
upstream_health_status{server="10.244.1.12:8080", pod="app-7f9b5c4d8-xv9kq"}指标 - Grafana 看板中按
pod标签聚合,点击异常节点可下钻查看该 Pod 的事件(kubectl describe pod)、日志(kubectl logs)及所在 Node 状况 - Prometheus 告警规则绑定容器标签:例如“连续 2 分钟
upstream_health_status == 0且pod标签存在”,自动触发kubectl scale deploy/app --replicas=+1或通知值班人


















