2. Kubernetes Ingress 基础回顾
在构建自动化灰度发布流水线之前,必须先理解 Ingress 的核心概念。Ingress 是 Kubernetes 中管理集群外部访问集群内服务的 API 对象,它提供了 HTTP/HTTPS 路由、TLS 终止、虚拟主机和负载均衡等能力。本章将系统回顾 Ingress 资源定义、Ingress Controller 工作原理以及主流实现方案。
2.1 Ingress 资源定义
Ingress 资源本身只是一个路由规则声明,它定义了外部流量如何到达集群内的 Service。一个典型的 Ingress 资源包含:域名规则、路径匹配、后端 Service 映射以及可选的 TLS 配置。
spec.rules.host:定义域名,支持精确匹配和通配符(如*.example.com)。spec.rules.http.paths.path:定义 URL 路径,支持前缀匹配(Prefix)和精确匹配(Exact)。spec.rules.http.paths.backend.service:指定流量转发的目标 Service 名称和端口。spec.tls:配置 TLS 证书,实现 HTTPS 访问。
以下是一个完整的 Ingress 资源示例,将 app.example.com 的流量路由到 my-service 的 80 端口:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
ingressClassName: nginx
rules:
- host: app.example.com
http:
paths:
- path: /api
pathType: Prefix
backend:
service:
name: my-service
port:
number: 80
tls:
- hosts:
- app.example.com
secretName: my-tls-secret
networking.k8s.io/v1 API 版本,并显式指定 ingressClassName 字段,替代已弃用的 kubernetes.io/ingress.class 注解。
2.2 Ingress Controller 工作原理
Ingress 资源本身只是一个声明,真正实现流量路由的是 Ingress Controller。它是一个运行在集群中的 Pod,负责监听 Ingress 资源的变化,并将规则转换为底层反向代理(如 Nginx、Traefik)的配置。
下图展示了 Ingress Controller 的核心工作流程:
404 或 No endpoints。
2.3 常见的 Ingress Controller
社区中有多种 Ingress Controller 实现,其中 Nginx Ingress Controller 和 Traefik 是最主流的两个选择。下表从多个维度对比它们的特性:
| 特性 | Nginx Ingress Controller | Traefik |
|---|---|---|
| 底层引擎 | Nginx(C 语言,高性能) | Go 语言自研反向代理 |
| 配置热更新 | 需 reload Nginx 进程(有短暂连接中断) | 动态配置,无需重启 |
| 自动 HTTPS | 支持 cert-manager 集成 | 内置 Let's Encrypt 自动签发 |
| 灰度发布支持 | 通过 Annotation 实现 Canary(权重/Header/Cookie) | 原生支持中间件和流量分割 |
| 性能 | 极高,适合大规模生产 | 中等,适合中小规模 |
| 社区生态 | 最成熟,文档丰富 | 活跃,云原生友好 |
| 部署复杂度 | 中等(需配置 ConfigMap) | 简单(单二进制部署) |
2.4 Nginx Ingress Controller 的灰度发布能力
Nginx Ingress Controller 通过 Canary 注解 实现灰度发布,这是本课程流水线集成的核心能力。它支持三种流量分割策略:
- 基于权重(Weight):按百分比将流量分配到灰度版本,适合 A/B 测试。
- 基于 Header:匹配特定 HTTP Header 的请求进入灰度版本,适合内部测试。
- 基于 Cookie:匹配特定 Cookie 值的请求进入灰度版本,适合会话保持。
以下是一个基于权重的 Canary Ingress 示例,将 10% 的流量路由到灰度 Service:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-app-canary
annotations:
nginx.ingress.kubernetes.io/canary: "true"
nginx.ingress.kubernetes.io/canary-weight: "10"
spec:
ingressClassName: nginx
rules:
- host: app.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: my-service-canary
port:
number: 80
2.5 Traefik 的灰度发布能力
Traefik 通过 中间件(Middleware) 和 流量分割(Traffic Splitting) 实现灰度发布。它原生支持 CRD(Custom Resource Definition),配置更符合云原生理念。
Traefik 的灰度发布通常使用 TraefikService 资源进行流量分割:
apiVersion: traefik.containo.us/v1alpha1
kind: TraefikService
metadata:
name: my-app-split
spec:
weighted:
services:
- name: my-service-stable
weight: 90
port: 80
- name: my-service-canary
weight: 10
port: 80
下表总结了 Nginx 和 Traefik 在灰度发布场景下的关键差异:
| 维度 | Nginx Ingress Controller | Traefik |
|---|---|---|
| 配置方式 | Annotation 注解 | CRD 资源(TraefikService、Middleware) |
| 流量分割粒度 | 权重、Header、Cookie | 权重、Header、Cookie、IP 白名单 |
| 动态更新 | 需 reload(有短暂中断) | 热更新,零中断 |
| 可观测性 | 需额外集成 Prometheus | 内置 Metrics 和 Dashboard |
| 适用场景 | 大规模、高性能生产环境 | 微服务、云原生、快速迭代 |