nginx ingress controller 是 kubernetes 中承担反向代理、tls终止、路径重写等网关职责的执行组件,通过监听ingress资源动态生成并热重载nginx.conf;ingress资源仅声明路由规则,本身不处理流量。

在 Kubernetes 中,Nginx 本身不直接“容器化进阶”,真正进阶的是将 Nginx 作为 Ingress 控制器 部署并深度集成到集群流量管理体系中。它不是把一个 Web 服务简单打包成 Pod,而是让 Nginx 承担反向代理、路由分发、TLS 终止、重写、限流等关键网关职责,并由 Kubernetes 原生的 Ingress 资源动态驱动配置更新。
明确角色分工:Ingress 资源 vs Ingress 控制器
这是理解整个机制的前提:
- Ingress 资源 是 YAML 文件定义的 Kubernetes 对象,只描述“想要什么”——比如“把 cafe.example.com/coffee 的请求转发给 coffee-service”。它本身不运行任何进程,也不处理流量。
- Ingress 控制器(如 nginx-ingress-controller)是一个长期运行的 Pod,它持续监听集群中 Ingress 资源的变化,并实时将这些规则翻译成 Nginx 配置(nginx.conf),然后热重载 Nginx 进程。它是真正干活的“执行者”。
部署 Ingress 控制器的常见方式
生产环境推荐使用官方维护的 ingress-nginx 项目(非旧版 k8s.io/ingress-nginx),部署方式需适配基础设施:
- 公有云环境(如阿里云 ACK、腾讯云 TKE):优先使用平台托管的 Ingress 控制器组件,它会自动对接 SLB/CLB,省去 LoadBalancer Service 配置和公网 IP 管理的麻烦。
- 裸金属或私有云:需配合 MetalLB 提供 LoadBalancer 类型 Service;或用 DaemonSet + hostPort 模式,将控制器绑定到特定节点的 80/443 端口,再通过外部负载均衡器或 DNS 轮询接入。
-
轻量级集群(如 k3s):内置了轻量版 ingress-nginx,可通过参数一键启用:
k3s server --disable traefik --disable servicelb --no-deploy=local-storage后,直接启用 nginx 插件即可。
编写可落地的 Ingress 资源示例
以下是一个兼顾 HTTPS、路径重写与后端协议的典型配置(适用于 networking.k8s.io/v1):
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: app-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /$2
nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
nginx.ingress.kubernetes.io/ssl-passthrough: "false"
spec:
ingressClassName: nginx
tls:
- hosts:
- app.example.com
secretName: app-tls-secret
rules:
- host: app.example.com
http:
paths:
- path: /api(/|$)(.*)
pathType: Prefix
backend:
service:
name: api-service
port:
number: 443
- path: /(.*)
pathType: Prefix
backend:
service:
name: web-service
port:
number: 80
说明:该配置将 /api/xxx 流量重写为 /xxx 后转发给 HTTPS 后端;根路径走 HTTP 后端;TLS 证书由 Secret 提供,由控制器自动注入到 Nginx 配置中。
关键运维与调优点
控制器上线后,几个高频操作直接影响稳定性与功能性:
-
ConfigMap 驱动全局参数:修改
nginx-configurationConfigMap 可统一控制超时、Body 大小、Gzip、Proxy 缓存等,例如设置proxy-body-size: "1g"支持大文件上传。 -
自定义错误页与重定向:通过
custom-http-errors注解或挂载自定义 error-pages ConfigMap 实现 404/503 页面替换。 -
健康检查与指标暴露:启用
controller.metrics.enabled=true,Prometheus 可采集nginx_ingress_controller_requests等核心指标,配合 Grafana 快速定位异常流量。 -
灰度发布支持:结合
canary-by-header或canary-weight注解,无需改代码即可实现基于 Header 或流量比例的灰度切流。











