2. 云原生网关基础:Kubernetes Ingress 资源定义与 Ingress Controller 工作原理
在云原生架构中,网关是南北向流量的统一入口。Kubernetes 原生提供了 Ingress 资源对象来定义外部流量如何路由到集群内部服务,而真正实现这一路由逻辑的是 Ingress Controller。理解这两者的关系与工作原理,是构建网关回滚护栏的前提。
2.1 Ingress 资源定义
Ingress 是一个 Kubernetes API 对象,用于定义从集群外部到内部服务的 HTTP 和 HTTPS 路由规则。它本身只是一个声明式配置,不执行任何网络功能。
核心字段与示例
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: tls-secret
关键字段说明
| 字段 | 说明 | 典型值 |
|---|---|---|
| spec.ingressClassName | 指定使用的 Ingress Controller 类型 | nginx, istio, traefik |
| spec.rules[].host | 基于域名的路由匹配 | app.example.com |
| spec.rules[].http.paths[].path | URL 路径匹配规则 | /api, /web |
| spec.rules[].http.paths[].pathType | 路径匹配模式 | Prefix, Exact, ImplementationSpecific |
| spec.rules[].http.paths[].backend | 流量转发的目标 Service | api-service:8080 |
| spec.tls | HTTPS 证书配置 | secretName: tls-secret |
最佳实践:生产环境中建议始终指定
ingressClassName,避免集群中存在多个 Controller 时产生歧义。同时,pathType 推荐使用 Prefix 或 Exact,避免使用 ImplementationSpecific 带来的跨 Controller 兼容性问题。
2.2 Ingress Controller 工作原理
Ingress Controller 是一个运行在集群中的 Pod,它负责监听 Kubernetes API Server 中的 Ingress 资源变化,并将这些声明式规则转换为实际的反向代理配置(如 Nginx 的 nginx.conf、Envoy 的 Listener/Route 配置)。
核心工作流程
- 监听与同步: Controller 通过 Informer 机制监听 Ingress、Service、Endpoint、Secret 等资源的变化。
- 配置生成: 将 Ingress 规则转换为网关代理的配置文件(如 Nginx 的 server block、Envoy 的 RouteConfiguration)。
- 热加载/动态更新: 将新配置应用到网关进程,通常通过 reload 或 xDS 协议实现无中断更新。
- 流量转发: 网关根据配置将外部请求转发到对应的后端 Service Pod。
关键区别: Ingress 资源是“声明”,Ingress Controller 是“执行者”。没有 Controller,Ingress 资源不会产生任何网络效果。
2.3 主流 Ingress Controller 对比
| Controller | 底层代理 | 配置热更新方式 | 高级路由特性 | 适用场景 |
|---|---|---|---|---|
| Nginx Ingress | Nginx | Reload(优雅重载) | 重写、重定向、认证 | 传统企业、兼容性要求高 |
| Istio Ingress Gateway | Envoy | xDS 动态更新(无中断) | 流量镜像、熔断、灰度发布 | 服务网格、精细化流量治理 |
| Traefik | 自研 Go 代理 | 动态配置(无 reload) | 自动 HTTPS、中间件链 | 微服务、边缘路由、快速迭代 |
| Kong Ingress | OpenResty | DB-less / Admin API | 插件生态、API 管理 | API 网关、认证限流 |
回滚护栏关注点: Nginx Ingress 的 Reload 机制在配置错误时可能导致网关短暂中断;Envoy 的 xDS 动态更新虽然更平滑,但配置版本管理不当可能引发路由黑洞。在后续章节中,我们将利用 Ingress 快照机制来规避这些风险。
2.4 Ingress 资源与 Controller 的协作模型
下图展示了 Ingress 资源定义与 Controller 实现之间的分层协作关系,这也是回滚护栏需要覆盖的配置变更链路。
课程要点: 回滚护栏的核心目标是:当控制层(Ingress Controller)将错误的配置下发到数据层之前,能够通过快照比对机制自动识别异常并触发回退,避免故障扩散到生产流量。