4. Ingress 与 Ingress Controller:流量入口、路由规则、TLS 终止

在 Kubernetes 蓝绿发布场景中,Ingress 是集群流量的统一入口,负责将外部 HTTP/HTTPS 请求路由到内部 Service。而 Ingress Controller 是实际执行路由规则的组件。理解两者的分工与协作,是设计蓝绿流量切换门禁的基础。

4.1 Ingress 与 Ingress Controller 的分工

组件 角色 关键职责
Ingress API 资源对象(声明式配置) 定义域名、路径、后端 Service、TLS 证书引用等路由规则
Ingress Controller 集群内运行的 Pod(实际执行者) 监听 Ingress 资源变化,动态配置反向代理(如 Nginx、Envoy)
核心理解:Ingress 是“规则说明书”,Ingress Controller 是“执行引擎”。蓝绿发布中,流量切换的本质是修改 Ingress 规则中的 serviceName 指向,由 Controller 实时生效。

4.2 典型 Ingress 资源定义

以下是一个支持蓝绿发布的 Ingress 示例,将 app.example.com 的流量路由到 service-blue:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: app-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  ingressClassName: nginx
  tls:
  - hosts:
    - app.example.com
    secretName: app-tls-secret
  rules:
  - host: app.example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: service-blue
            port:
              number: 80
蓝绿切换关键字段:spec.rules[].http.paths[].backend.service.name。当需要从蓝环境切换到绿环境时,只需将此字段值从 service-blue 改为 service-green,Ingress Controller 会自动更新代理配置。

4.3 流量路由规则详解

Ingress 支持多种路由匹配方式,在蓝绿发布中常用以下策略:

  • 基于 Host(域名):不同版本绑定不同域名,适合金丝雀发布。
  • 基于 Path(路径):同一域名下,不同路径指向不同版本。
  • 基于 Header / Cookie:通过 Ingress 注解实现灰度流量,如 canary: "true"。
路由策略 适用场景 蓝绿切换方式
Host 路由 全量切换、A/B 测试 修改 Ingress 中 host 对应的 backend
Path 路由 微服务拆分、版本隔离 修改 path 指向的 Service
Header 路由 灰度发布、内部测试 通过注解动态调整权重

4.4 TLS 终止:安全流量入口

Ingress Controller 通常负责 TLS 终止,即解密外部 HTTPS 请求,再将明文 HTTP 转发给后端 Service。蓝绿发布中,TLS 证书统一挂在 Ingress 层,后端 Service 无需关心证书管理。

spec:
  tls:
  - hosts:
    - app.example.com
    secretName: app-tls-secret   # 引用包含 tls.crt 和 tls.key 的 Secret
注意:切换流量时,TLS 证书的 Secret 无需变更。但如果新版本需要不同的域名或证书,需提前创建新的 Secret 并更新 Ingress 的 tls 字段。证书过期或配置错误会导致整个入口不可用,建议在门禁检查中加入证书有效期校验。

4.5 Ingress Controller 选型对比

Controller 基础引擎 蓝绿发布支持 动态更新延迟
nginx-ingress Nginx + Lua 原生支持,注解丰富 < 1s(reload)
traefik Go 自研 CRD 支持,热更新 毫秒级(无 reload)
contour Envoy HTTPProxy CRD,灰度权重 毫秒级(xDS 推送)
ALB Ingress AWS ALB 通过 TargetGroup 切换 秒级(API 调用)

4.6 蓝绿流量切换流程(Ingress 视角)

蓝绿发布 Ingress 流量切换流程 外部用户 Ingress Controller Ingress 规则(当前) Service Blue Service Green Pod Blue-1 Pod Blue-2 Pod Green-1 Pod Green-2 门禁检查(切换决策) 切换时:修改 Ingress 规则中 backend.service.name 从 service-blue → service-green Ingress Controller 自动 reload 配置,新流量进入绿环境

4.7 蓝绿发布中的 Ingress 最佳实践

  • 使用独立 Ingress 资源:为蓝绿环境分别创建 Ingress 或使用注解切换,避免修改生产 Ingress 时影响其他服务。
  • 开启 Controller 热重载:对于 nginx-ingress,使用 --enable-dynamic-reload 减少 reload 延迟。
  • 配合 Readiness Gate:确保新版本 Pod 通过 Readiness 探测后,Ingress 才将流量引入。
  • TLS 证书统一管理:使用 cert-manager 自动签发和续期,避免证书过期导致入口中断。
  • 监控 Ingress 指标:关注 nginx_ingress_controller_requests、upstream_latency 等指标,辅助判断切换后流量是否正常。
门禁集成点:在蓝绿切换的“门禁检查”阶段,应验证 Ingress 规则中目标 Service 的 Endpoint 是否全部 Ready,以及 Ingress Controller 是否已完成配置同步。可通过 kubectl get ingress 的 ADDRESS 字段或 Controller 的 Prometheus 指标确认。