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 视角)
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 指标确认。