1. 初识Kubernetes Ingress:为什么需要它?

想象一个场景:你的Kubernetes集群运行了10个微服务,每个服务都需要通过域名或路径对外暴露。如果直接使用NodePortLoadBalancer,不仅端口管理混乱,SSL证书的更新更是噩梦。这时候Ingress应运而生——它像集群的"智能路由器",统一管理外部请求的路由规则、TLS终止、负载均衡。

举个例子,通过Ingress你可以轻松实现:

  • www.yourdomain.com/app1 转发到后端服务A
  • api.yourdomain.com/v2 转发到服务B的v2版本
  • 自动为所有域名申请Let's Encrypt证书

2. 技术栈选择:为什么是Nginx Ingress?

在众多Ingress Controller中(如Traefik、HAProxy),Nginx Ingress Controller以性能稳定、功能丰富著称。其核心优势包括:

  • 成熟生态:支持灰度发布、熔断、自定义注解
  • 高性能:单实例可支持5万+ QPS
  • 灵活配置:通过ConfigMap深度定制Nginx参数
kubectl get pods -n ingress-nginx
# 预期输出(部分):
# NAME                                        READY   STATUS    RESTARTS
# ingress-nginx-controller-7658785c8b-tq5j2   1/1     Running   0

3. 部署Nginx Ingress Controller

3.1 基础安装(Helm方式)
# 添加Helm仓库
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
# 安装到ingress-nginx命名空间
helm install ingress-nginx ingress-nginx/ingress-nginx \
  --namespace ingress-nginx \
  --set controller.service.type=LoadBalancer
3.2 验证安装
# 检查服务External-IP(AWS/GCP会显示负载均衡器地址)
kubectl get svc -n ingress-nginx
# 预期输出:
# NAME                       TYPE           CLUSTER-IP     EXTERNAL-IP      PORT(S)                      
# ingress-nginx-controller   LoadBalancer   10.96.32.117   35.189.76.102    80:32456/TCP,443:31902/TCP

4. 编写你的第一个Ingress规则

假设需要将请求按路径分发到不同服务:

  • /user → 用户服务(user-service:8080)
  • /order → 订单服务(order-service:80)
# ingress-basic.yaml(技术栈:Nginx)
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: demo-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /$1  # 路径重写
spec:
  rules:
  - host: demo.yourdomain.com  # 绑定的域名
    http:
      paths:
      - path: /user/(.*)      # 捕获路径参数
        pathType: Prefix
        backend:
          service:
            name: user-service
            port: 
              number: 8080
      - path: /order
        pathType: Exact       # 精确匹配路径
        backend:
          service:
            name: order-service
            port: 
              number: 80

5. HTTPS配置实战:自动证书管理

通过Cert-Manager实现Let's Encrypt证书自动申请:

# 安装Cert-Manager(需提前部署CRD)
kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.13.1/cert-manager.yaml

# 创建ClusterIssuer(生产环境使用Let's Encrypt)
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
  name: letsencrypt-prod
spec:
  acme:
    server: https://acme-v02.api.letsencrypt.org/directory
    email: admin@yourdomain.com
    privateKeySecretRef:
      name: letsencrypt-prod
    solvers:
    - http01:
        ingress:
          class: nginx  # 指定使用的Ingress Controller
# 在Ingress中启用TLS
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: tls-demo
spec:
  tls:
  - hosts:
    - demo.yourdomain.com
    secretName: demo-tls-secret  # 证书存储的Secret名称
  rules:
  - host: demo.yourdomain.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: frontend-service
            port: 
              number: 80

6. 高阶功能:熔断与超时控制

通过注解实现生产级保护策略:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: advanced-ingress
  annotations:
    nginx.ingress.kubernetes.io/proxy-connect-timeout: "15"
    nginx.ingress.kubernetes.io/proxy-read-timeout: "20"
    nginx.ingress.kubernetes.io/limit-rpm: "100"  # 每分钟100请求
    nginx.ingress.kubernetes.io/circuit-breaker: "5XX=10,10s"  # 10秒内5XX错误触发熔断
spec:
  rules:
  - host: api.yourdomain.com
    http:
      paths:
      - path: /v1
        backend:
          service:
            name: api-v1
            port: 8000

7. 应用场景与最佳实践

典型应用场景

  1. 多域名/多路径托管:用单一入口管理数十个微服务
  2. 灰度发布:通过canary注解分流部分流量到新版本
  3. 跨命名空间路由:将admin.yourdomain.com路由到独立的运维命名空间

避坑指南

  • 路径冲突:避免同时使用PrefixExact匹配同一路径
  • 证书管理:提前设置证书自动续期监控
  • 性能优化:配置HPA自动扩展Ingress Controller实例

8. 技术方案对比

方案 优点 缺点
NodePort 简单快速 端口冲突风险
LoadBalancer 云厂商集成 成本高(每个服务独立LB)
Ingress 统一入口、成本最优 需维护路由规则

9. 总结

通过Nginx Ingress,我们实现了:

  • 灵活的路由规则配置
  • 零停机时间的证书轮换
  • 生产级的流量管控能力

未来可探索的方向:

  1. 结合Service Mesh做更细粒度流量治理
  2. 通过OpenTelemetry实现链路监控
  3. 多集群Ingress联邦管理