nginx在云原生中演变为可编排、可声明、自动同步的流量网关,docker用于本地验证与配置调试,kubernetes ingress controller则使其感知集群状态并动态更新路由与tls,二者分层协作而非替代。

云原生架构中,Nginx 不再只是单机反向代理,而是演变为可编排、可声明、可自动同步的流量网关。Docker 部署用于快速验证和本地开发,Kubernetes Ingress 则是生产环境的标准入口方案。两者不是替代关系,而是分层协作:Docker 帮你理解 Nginx 本身如何工作;Ingress Controller 让它“活”在 K8s 里,自动响应服务变化。
Docker 部署 Nginx:轻量验证与配置调试
适合本地开发、CI 流水线中的集成测试或边缘网关简易部署。关键不是“跑起来”,而是掌握配置生效逻辑:
- 用官方镜像启动:
docker run -d --name my-nginx -p 8080:80 -v $(pwd)/nginx.conf:/etc/nginx/nginx.conf:ro nginx:alpine,挂载自定义配置确保可维护 - 修改配置后无需重启容器,执行
docker exec my-nginx nginx -s reload即可热重载(前提是配置语法正确) - 调试时加
-v参数查看详细日志:docker logs -f my-nginx,重点关注nginx: [emerg]类错误 - 若需 TLS 终止,把证书文件(
tls.crt和tls.key)一并挂载进容器,并在server块中启用ssl_certificate指令
Kubernetes Ingress Controller:让 Nginx “感知”集群状态
Ingress Controller 不是 Nginx 的简单封装,而是监听 K8s API 的智能适配器。它把 Ingress 资源翻译成 Nginx 配置,并动态更新上游服务列表:
- 部署推荐使用官方 Helm Chart:
helm upgrade --install ingress-nginx ingress-nginx/ingress-nginx --namespace ingress-nginx --create-namespace - Ingress 资源必须关联已存在的 Service,且该 Service 的
spec.selector能匹配到 Pod 标签,否则 Ingress Controller 无法发现后端实例 - 当 Pod IP 变化(如滚动更新),Controller 通过 Endpoints 或 EndpointSlice 资源实时感知,利用 Lua 模块更新 upstream,避免全量重载 Nginx 进程
- Secret 中存放 TLS 证书后,Ingress 中只需引用其名称:
tls: [{hosts: ["app.example.com"], secretName: "app-tls"}],无需手动导出证书到容器
从 Docker 到 Ingress 的关键思维转变
很多问题源于仍用传统运维方式对待声明式系统:
- 不直接编辑容器内
/etc/nginx/conf.d/—— 所有路由规则应通过 Ingress、ConfigMap(如自定义 error_page)或 Annotation(如nginx.ingress.kubernetes.io/rewrite-target)声明 - 不依赖固定 IP 或主机名做健康检查 —— Ingress Controller 默认使用 K8s 内置就绪探针(readinessProbe)判断后端可用性
- 不手动 reload 配置 —— Controller 自动 diff 配置变更,仅在必要时触发 reload;Endpoint 变更走内存级热更新,毫秒级生效
- 不把证书硬编码进镜像 —— Secret 是 K8s 原生凭证管理机制,Controller 会自动挂载并轮换,比文件挂载更安全可控
常见组合场景与配置要点
真实业务往往需要叠加能力,这些不是插件,而是 Ingress Controller 原生支持的模式:
-
HTTPS + 路径重写:Ingress 中设
path: /api/,加 annotationnginx.ingress.kubernetes.io/rewrite-target: /$2,配合正则path: /api(/|$)(.*),实现/api/users→ 后端/users -
Basic Auth 保护:用
htpasswd生成用户密码文件,创建 Secret 类型为generic,再通过 annotationnginx.ingress.kubernetes.io/auth-type: basic启用 -
限流防刷:通过 ConfigMap 全局开启
limit-req,或对特定 Ingress 加 annotationnginx.ingress.kubernetes.io/limit-rps: "10" -
gRPC 支持:Ingress 必须使用 HTTPS(HTTP/2),Service 的
port.targetPort需指向 gRPC 应用端口,且 Ingress annotation 中显式声明nginx.ingress.kubernetes.io/backend-protocol: "GRPC"











