一、为什么需要Ingress控制器?

在Kubernetes集群中,Service负责把流量引入Pod,但它本身没法处理复杂的路由规则。想象一下你开了一家连锁便利店,但所有顾客必须通过同一个门进出——这时就需要一个"智能前台"帮忙分流转发。Nginx Ingress就是这个"前台",它能根据域名、路径等规则定向转发流量,支持SSL加密、路径重写等高级功能,成为微服务架构中不可或缺的组件。


二、部署Nginx Ingress控制器

我们先通过Helm快速部署Nginx Ingress(技术栈:Kubernetes v1.23 + Helm 3.8):

helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo update

# 安装(生产环境建议自定义values.yaml)
helm install ingress-nginx ingress-nginx/ingress-nginx \
  --namespace ingress-nginx \
  --set controller.service.type=LoadBalancer \
  --set controller.ingressClassResource.enabled=true

验证部署状态:

kubectl get pods -n ingress-nginx -l app.kubernetes.io/name=ingress-nginx

三、从零配置一个完整Ingress规则

假设我们有两个服务:用户中心(user-service)和商品服务(product-service),需要通过不同路径暴露。

示例1:基础路由配置

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: demo-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /$1
spec:
  ingressClassName: nginx
  rules:
  - host: shop.example.com
    http:
      paths:
      - path: /user/(.*)
        pathType: Prefix
        backend:
          service:
            name: user-service
            port:
              number: 8080
      - path: /product/(.*)
        backend:
          service:
            name: product-service
            port:
              number: 80

关键注释解析:

  • rewrite-target将路径中的正则捕获组内容重写转发
  • pathType定义匹配策略(Exact/Prefix/ImplementationSpecific)

四、SSL终结实战:让流量穿上铠甲

示例2:通过Cert-Manager自动申请SSL证书

# 先部署Cert-Manager(参考官方文档)
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
  name: letsencrypt-prod
spec:
  acme:
    server: https://acme-v02.api.letsencrypt.org/directory
    email: admin@example.com
    privateKeySecretRef:
      name: letsencrypt-prod
    solvers:
    - http01:
        ingress:
          class: nginx

---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: secure-ingress
  annotations:
    cert-manager.io/cluster-issuer: "letsencrypt-prod"
spec:
  tls:
  - hosts:
    - shop.example.com
    secretName: shop-tls-secret
  rules:
  - host: shop.example.com
    http:
      paths: [...] # 路由规则类似示例1

SSL配置要点:

  1. 强制HTTPS跳转的注解:nginx.ingress.kubernetes.io/force-ssl-redirect: "true"
  2. HSTS安全增强头配置
  3. TLS版本控制(推荐禁用TLS 1.1/1.0)

五、路径重写的魔法艺术

示例3:URL规范化改造

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: rewrite-demo
  annotations:
    nginx.ingress.kubernetes.io/configuration-snippet: |
      rewrite ^/v1/legacy-api/(.*) /modern-api/$1 break;
spec:
  rules:
  - host: api.example.com
    http:
      paths:
      - path: /modern-api/
        backend: 
          service:
            name: modern-service
            port: 80

进阶技巧:

  • 使用server-snippet自定义Nginx配置块
  • 正则表达式匹配分组的高级用法
  • 路径前缀追加与删除的对比方案

六、必须要知道的调优参数

示例4:限流保护配置

annotations:
  nginx.ingress.kubernetes.io/limit-connections: "100"
  nginx.ingress.kubernetes.io/limit-rps: "200"
  nginx.ingress.kubernetes.io/limit-burst: "50"

生产环境推荐优化项:

  1. 调整keepalive连接数:nginx.ingress.kubernetes.io/upstream-keepalive-connections
  2. 请求体大小限制:nginx.ingress.kubernetes.io/proxy-body-size
  3. 自定义错误页面

七、技术选型的辩证思考

优势分析

  • 配置热更新无需重启
  • 丰富的注解系统(目前支持100+种配置项)
  • 社区活跃度高,兼容各类CNI网络插件

局限性

  • 复杂配置需要深入理解Nginx底层机制
  • 横向扩展时资源消耗较明显
  • 某些高级功能依赖商业版Nginx Plus

八、我踩过的七个坑

  1. 路径匹配黑洞:忘记设置pathType导致404
  2. 重写规则顺序导致的优先级混乱
  3. 大文件上传被截断(需调整proxy-body-size
  4. WebSocket连接中断(需要开启保持连接配置)
  5. IP白名单配置的正确姿势
  6. 证书自动续期失败的排查方法
  7. 压测时的worker进程数调优

九、典型应用场景全景

  • 混合云环境下的统一入口管理
  • AB测试流量分割(Canary发布)
  • 多租户SaaS平台的路由隔离
  • 前后端分离架构的API网关
  • 灰度发布与故障注入演练

本文深入解析Kubernetes环境中Nginx Ingress控制器的核心配置技巧,涵盖SSL证书自动化管理、路径重写高级方案及生产环境调优策略。通过完整示例演示如何实现安全可靠的流量入口管理,对比分析技术方案的优缺点,提供避坑指南和实践建议,适合正在构建云原生架构的运维和开发人员参考学习。