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
版本兼容性提示:Kubernetes v1.19+ 推荐使用 networking.k8s.io/v1 API 版本,并显式指定 ingressClassName 字段,替代已弃用的 kubernetes.io/ingress.class 注解。

2.2 Ingress Controller 工作原理

Ingress 资源本身只是一个声明,真正实现流量路由的是 Ingress Controller。它是一个运行在集群中的 Pod,负责监听 Ingress 资源的变化,并将规则转换为底层反向代理(如 Nginx、Traefik)的配置。

下图展示了 Ingress Controller 的核心工作流程:

Ingress Controller 工作原理 外部用户 Ingress Controller (Nginx / Traefik) Service Pod (v1) API Server Ingress 资源 工作流程说明: 1. 用户创建/更新 Ingress 资源,写入 API Server。 2. Ingress Controller 通过 Watch 机制监听 Ingress 资源变化。 3. Controller 将规则转换为反向代理配置(如 Nginx.conf),并重新加载。 4. 外部流量到达 Controller,根据规则转发到对应 Service 和 Pod。
常见误区:Ingress 资源本身不处理流量,必须部署 Ingress Controller 才能生效。如果创建了 Ingress 资源但未部署 Controller,流量将无法路由,且 Ingress 状态会一直显示 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
灰度发布最佳实践:在生产环境中,建议先使用 Header 或 Cookie 策略进行内部验证,确认无误后再切换到权重策略逐步放量。同时,结合 Prometheus 监控和告警,实现自动化回滚。

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
适用场景 大规模、高性能生产环境 微服务、云原生、快速迭代
课程选型说明:本课程后续的自动化流水线将基于 Nginx Ingress Controller 实现,因为其 Canary 注解机制成熟、社区生态丰富,且与 CI/CD 工具(如 ArgoCD、Jenkins)集成度高。但 Traefik 的 CRD 方式同样值得掌握,两者原理相通。