nginx ingress 是 kubernetes 中最常用、最成熟的七层流量入口方案,通过 ingress controller 和 ingress 资源实现 http/https 路由、tls 终止、限流、自定义错误页与跨域等功能,支持 helm 安装及动态配置热更新。

在 Kubernetes 集群中,Nginx Ingress 是最常用、最成熟的流量入口方案之一。它通过部署 Nginx Ingress Controller(一个运行在集群内的 Pod),配合 Ingress 资源对象,将外部 HTTP/HTTPS 请求按规则路由到后端 Service,实现统一的七层负载均衡与虚拟主机管理。
安装 Nginx Ingress Controller
推荐使用官方维护的 ingress-nginx 项目(https://github.com/kubernetes/ingress-nginx)。生产环境建议用 Helm 安装,兼顾可配置性与版本可控性:
- 添加 Helm 仓库:
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx - 更新本地索引:
helm repo update - 安装(默认使用 LoadBalancer 类型 Service):
helm install ingress-nginx ingress-nginx/ingress-nginx --namespace ingress-nginx --create-namespace
若集群不支持 LoadBalancer(如本地 Kind 或 Minikube),可改用 NodePort 模式,或手动指定 hostNetwork=true 启动控制器。
定义 Ingress 资源暴露服务
Ingress 是 Kubernetes 原生 API 对象,需配合已存在的 Service 使用。例如,假设有名为 web-app 的 ClusterIP Service:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: web-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /$2
spec:
ingressClassName: nginx
rules:
- host: app.example.com
http:
paths:
- path: /api(/|$)(.*)
pathType: Prefix
backend:
service:
name: web-app
port:
number: 80
注意:Ingress v1 版本必须指定 ingressClassName;pathType: Prefix 表示前缀匹配;重写注解用于处理子路径代理时的 URL 修正。
启用 HTTPS 与 TLS 终止
Nginx Ingress 支持自动 TLS 终止。先创建 Secret 存储证书(或用 cert-manager 自动签发):
- 生成 Secret:
kubectl create secret tls example-tls --cert=tls.crt --key=tls.key -n default - 在 Ingress 中引用:
tls字段声明 host 和 secretName - Ingress Controller 会自动将请求从 80 重定向至 443,并在入口侧解密 HTTPS 流量
无需修改后端应用,也无需在 Pod 内处理证书——TLS 终止发生在 Ingress 层,简化了服务开发与运维。
进阶配置:限流、自定义错误页、跨域
通过 Annotations 可快速启用常见功能,例如:
- 每秒最多 10 个请求:
nginx.ingress.kubernetes.io/rate-limit-per-second: "10" - 返回自定义 503 页面:
nginx.ingress.kubernetes.io/custom-http-errors: "503",并挂载静态页 ConfigMap 到控制器 Pod - 允许前端跨域请求:
nginx.ingress.kubernetes.io/enable-cors: "true"
所有配置均无需重启控制器,Ingress 资源更新后,Controller 会自动热重载 Nginx 配置。











