2. Ingress 控制器基础回顾:Ingress 资源、Ingress Controller 的工作原理与核心配置
在 Kubernetes 集群中,Service 和 Pod 的网络暴露通常局限于集群内部或 NodePort/LoadBalancer 类型的简单四层转发。当需要基于 HTTP/HTTPS 域名、路径、TLS 证书进行精细化流量路由时,Ingress 资源与 Ingress Controller 的组合成为标准方案。本节将系统回顾 Ingress 资源定义、Ingress Controller 的工作机制以及核心配置项,为后续回滚护栏与自动化测试集成打下基础。
2.1 Ingress 资源:声明式路由规则
Ingress 是 Kubernetes 原生的 API 对象(networking.k8s.io/v1),用于定义集群外部流量如何路由到内部 Service。它本身只是一个规则声明,不执行任何网络转发;真正的流量处理由 Ingress Controller 实现。
spec.rules 定义路由规则,每个规则包含 host(域名)、http.paths(路径匹配列表),每个路径关联一个 backend(目标 Service + port)。
以下是一个典型的 Ingress 资源配置示例:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: demo-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: api-service
port:
number: 8080
- path: /web
pathType: Prefix
backend:
service:
name: web-service
port:
number: 80
tls:
- hosts:
- app.example.com
secretName: app-tls-secret
| 字段 | 说明 | 常见取值 |
|---|---|---|
ingressClassName |
指定使用的 Ingress Controller 名称 | nginx, traefik, istio |
rules[].host |
域名匹配,支持精确匹配和通配符 | *.example.com, foo.bar.com |
pathType |
路径匹配模式 | Prefix, Exact, ImplementationSpecific |
backend.service |
目标 Service 名称和端口 | 任意存在的 Service |
tls |
HTTPS 证书绑定 | 引用 Secret 中的 TLS 证书 |
ingressClassName,避免多个 Controller 同时监听未指定类名的 Ingress 资源导致冲突。
2.2 Ingress Controller 工作原理
Ingress Controller 是一个运行在集群中的 Pod(通常以 Deployment + Service 形式部署),它持续监听 Kubernetes API Server 中的 Ingress、Service、Endpoint、Secret 等资源变化,动态生成反向代理配置(如 Nginx 的 nginx.conf、Traefik 的动态路由规则),并 reload 或热更新代理进程。
下图展示了 Ingress Controller 的核心工作流程:
- 用户创建/更新 Ingress 资源 → 写入 etcd → API Server 通知所有监听者。
- Ingress Controller 通过
Informer机制实时感知 Ingress、Service、Endpoint、Secret 变化。 - Controller 根据 Ingress 规则生成反向代理配置文件(如 Nginx 的
nginx.conf)。 - Controller 执行 reload 或热更新,使新配置生效。
- 外部流量到达 Controller 的 Service(NodePort/LoadBalancer),按规则转发到后端 Pod。
2.3 主流 Ingress Controller 对比与核心配置
社区中最常用的 Ingress Controller 包括 Nginx Ingress Controller 和 Traefik,两者在配置方式、功能特性和生态集成上存在差异。
| 特性 | Nginx Ingress Controller | Traefik |
|---|---|---|
| 配置方式 | 通过 Ingress 资源 + Annotation 扩展 | Ingress 资源 + CRD (IngressRoute) + 动态配置 |
| 性能 | 高吞吐,低延迟(基于 Nginx 内核) | 中等,适合中小规模 |
| 热更新 | 支持 reload(短暂连接中断) | 支持热更新(无中断) |
| 自动 HTTPS | 需配合 cert-manager | 内置 ACME 支持 |
| 可观测性 | Prometheus 指标 + 访问日志 | 内置 Dashboard + Prometheus + OpenTelemetry |
| 典型 Annotation | nginx.ingress.kubernetes.io/rewrite-target |
traefik.ingress.kubernetes.io/router.middlewares |
2.4 Nginx Ingress Controller 核心配置示例
Nginx Ingress Controller 通过 ConfigMap 进行全局配置(如 worker-processes、proxy-body-size),通过 Annotation 实现 Ingress 级别的精细化控制。
全局 ConfigMap 配置:
apiVersion: v1
kind: ConfigMap
metadata:
name: nginx-configuration
namespace: ingress-nginx
data:
worker-processes: "4"
proxy-body-size: "50m"
proxy-connect-timeout: "30"
proxy-read-timeout: "60"
ssl-protocols: "TLSv1.2 TLSv1.3"
use-forwarded-headers: "true"
Ingress 级别 Annotation 配置:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: api-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /$2
nginx.ingress.kubernetes.io/ssl-redirect: "true"
nginx.ingress.kubernetes.io/cors-enabled: "true"
nginx.ingress.kubernetes.io/limit-rps: "100"
spec:
ingressClassName: nginx
rules:
- host: api.example.com
http:
paths:
- path: /v1(/|$)(.*)
pathType: ImplementationSpecific
backend:
service:
name: api-v1-service
port:
number: 8080
2.5 Traefik 核心配置示例
Traefik 除了支持标准 Ingress 资源外,还提供了更强大的 IngressRoute CRD,支持中间件链、权重路由、重定向等高级功能。
标准 Ingress 方式:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: traefik-demo
annotations:
traefik.ingress.kubernetes.io/router.entrypoints: web,websecure
traefik.ingress.kubernetes.io/router.middlewares: default-strip-prefix@kubernetescrd
spec:
ingressClassName: traefik
rules:
- host: traefik.example.com
http:
paths:
- path: /app
pathType: Prefix
backend:
service:
name: app-service
port:
number: 80
IngressRoute CRD 方式(更灵活):
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
name: app-route
spec:
entryPoints:
- web
- websecure
routes:
- match: Host(`app.example.com`) && PathPrefix(`/api`)
kind: Rule
services:
- name: api-service
port: 8080
middlewares:
- name: rate-limit
tls:
certResolver: letsencrypt
2.6 Ingress 控制器在回滚场景中的关键角色
在回滚护栏与自动化测试集成课程中,Ingress Controller 是流量切换和灰度验证的核心组件:
- 流量切分: 通过 Annotation 或 CRD 实现金丝雀发布(Canary),将部分流量导向新版本。
- 健康检查: Ingress Controller 依赖后端 Service 的 Endpoint 健康状态,回滚时需确保旧版本 Pod 就绪。
- 配置一致性: 回滚 Ingress 资源或 Controller 配置时,需验证 Annotation 和 ConfigMap 的版本兼容性。
- 自动化测试集成: 测试环境中的 Ingress 规则变更应纳入 CI/CD 流水线,通过自动化测试验证路由正确性。
下图展示了 Ingress Controller 在回滚与测试集成中的位置:
- Ingress 资源只定义规则,Ingress Controller 负责执行和转发。
- Nginx Ingress Controller 通过 Annotation 实现精细化控制,Traefik 通过 CRD 提供更灵活的配置模型。
- Ingress Controller 的配置变更(Annotation、ConfigMap、CRD)是回滚和自动化测试的核心关注点。
- 理解 Ingress Controller 的工作原理,是构建可靠回滚护栏和测试集成方案的前提。