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 配置)。

核心工作流程

  1. 监听与同步: Controller 通过 Informer 机制监听 Ingress、Service、Endpoint、Secret 等资源的变化。
  2. 配置生成: 将 Ingress 规则转换为网关代理的配置文件(如 Nginx 的 server block、Envoy 的 RouteConfiguration)。
  3. 热加载/动态更新: 将新配置应用到网关进程,通常通过 reload 或 xDS 协议实现无中断更新。
  4. 流量转发: 网关根据配置将外部请求转发到对应的后端 Service Pod。
关键区别: Ingress 资源是“声明”,Ingress Controller 是“执行者”。没有 Controller,Ingress 资源不会产生任何网络效果。
Ingress Controller 工作原理流程 用户 / 客户端 Ingress 资源 API Server Ingress Controller 网关代理实例 后端 Service Pod ① 用户创建 Ingress 资源 → ② API Server 存储并通知 Controller → ③ Controller 生成配置 → ④ 网关代理热加载 → ⑤ 流量转发至后端

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 协作分层架构 声明层:Ingress 资源(YAML) 定义 host、path、backend、tls 等路由规则 控制层:Ingress Controller 监听 API Server → 生成代理配置 → 下发至数据层 数据层:网关代理实例(Nginx / Envoy) 实际处理 HTTP 请求,执行路由、负载均衡、TLS 终止 回滚护栏覆盖范围 声明层 → 控制层
课程要点: 回滚护栏的核心目标是:当控制层(Ingress Controller)将错误的配置下发到数据层之前,能够通过快照比对机制自动识别异常并触发回退,避免故障扩散到生产流量。