概览

Ingress NGINX 是最常用的 Kubernetes 北向流量入口控制器(Ingress Controller),具备域名与路径路由、TLS 终止、重写、限速、灰度、WebSocket、超时与缓存等能力。合理配置 Ingress 既能提升可用性与安全性,又能控制成本与复杂度。

安装与基础路由

使用 Helm 安装(生产建议固定版本与自定义参数):

1
2
3
4
5
6
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo update
helm install ingress ingress-nginx/ingress-nginx \
-n ingress-nginx --create-namespace \
--set controller.service.type=LoadBalancer \
--set controller.metrics.enabled=true

基础 Ingress 示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: demo
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
tls:
- hosts: [demo.example.com]
secretName: demo-tls
rules:
- host: demo.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: web
port:
number: 80

常用注解与路由技巧

  • 超时与缓冲
1
2
3
4
5
6
metadata:
annotations:
nginx.ingress.kubernetes.io/proxy-read-timeout: "30"
nginx.ingress.kubernetes.io/proxy-send-timeout: "30"
nginx.ingress.kubernetes.io/proxy-body-size: "20m"
nginx.ingress.kubernetes.io/proxy-buffering: "on"
  • WebSocket 支持
1
nginx.ingress.kubernetes.io/enable-websocket: "true"
  • HSTS/强制 HTTPS
1
2
3
nginx.ingress.kubernetes.io/force-ssl-redirect: "true"
nginx.ingress.kubernetes.io/hsts: "true"
nginx.ingress.kubernetes.io/hsts-max-age: "31536000"
  • 限速与IP 白名单
1
2
nginx.ingress.kubernetes.io/limit-rps: "50"
nginx.ingress.kubernetes.io/whitelist-source-range: "10.0.0.0/8,192.168.0.0/16"
  • 路由重写与正则
1
2
3
nginx.ingress.kubernetes.io/use-regex: "true"
nginx.ingress.kubernetes.io/rewrite-target: /$1
# path 示例: ^/api/?(.*)

灰度发布与金丝雀

使用 canary 注解实现基于权重或 Header 的灰度:

1
2
3
4
5
6
7
metadata:
annotations:
nginx.ingress.kubernetes.io/canary: "true"
nginx.ingress.kubernetes.io/canary-weight: "10" # 10% 流量
# 或基于Header
# nginx.ingress.kubernetes.io/canary-by-header: "X-Canary"
# nginx.ingress.kubernetes.io/canary-by-header-value: "1"

灰度最佳实践:

  • 仅对无状态或可回滚的服务开启
  • 搭配熔断与限流,避免新版本放大故障
  • 结合 Prometheus 监控关键指标(P95、错误率)

TLS 与证书管理

  • 建议结合 cert-manager 自动签发与续期
  • 同一域名下多 Ingress 时,确保证书 secret 一致
  • 使用 TLS1.2/1.3 与安全加密套件,禁用弱算法

cert-manager 简例:

1
2
3
4
5
6
7
8
9
10
11
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
name: demo-cert
spec:
secretName: demo-tls
issuerRef:
kind: ClusterIssuer
name: letsencrypt
dnsNames:
- demo.example.com

观测与日志

  • 开启 metrics 暴露,配合 Prometheus/Grafana
  • 统一 access log 格式,便于检索与审计
1
2
3
4
controller:
config:
log-format-escape-json: "true"
log-format-upstream: '{"time":"$time_iso8601","remote_addr":"$remote_addr","x_forwarded_for":"$http_x_forwarded_for","request_method":"$request_method","request_uri":"$request_uri","status":$status,"body_bytes_sent":$body_bytes_sent,"referer":"$http_referer","user_agent":"$http_user_agent","request_time":$request_time,"upstream_response_time":"$upstream_response_time"}'

安全与性能

  • 安全

    • 仅暴露 80/443,内网访问管理接口
    • 使用 IP 白名单/黑名单、限速、WAF(ModSecurity)等
    • 关闭不必要的 HTTP 方法与目录遍历
  • 性能

    • 合理设置 worker_processeskeepalive
    • 尽量使用前缀路由,减少复杂正则
    • 静态资源建议绕过后端(CDN/对象存储)

常见踩坑

  • 正则与重写冲突:use-regex 开启后注意捕获组与 rewrite-target
  • 大文件上传 413:提升 proxy-body-size 与后端 client_max_body_size
  • 连接超时 504:检查后端服务超时与 NGINX proxy-read-timeout
  • 多 Ingress 覆盖顺序:同 host 的规则可能被后创建的资源覆盖,保持规则集中管理
  • WebSocket 断连:开启 enable-websocket,并检查长连接超时策略

FAQ

  • 如何固定公网IP?在云上使用 LB 绑定静态 IP;本地可使用 MetalLB
  • 支持 gRPC 吗?支持,配置 nginx.ingress.kubernetes.io/backend-protocol: "GRPC"
  • 多租户隔离?按命名空间划分 + 路由规范 + RBAC;必要时多控制器分池运行

总结

Ingress NGINX 功能强大但配置众多。遵循“最小暴露面、最少正则、就近TLS终止、链路可观测”的原则,结合灰度、限速与审计,可在可靠与安全之间取得良好平衡。