找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

2598

积分

0

好友

360

主题
发表于 昨天 02:47 | 查看: 0| 回复: 0

前言:为什么 Kubernetes Ingress 还不“够”?

传统K8s Ingress与Istio Gateway架构对比

在 Kubernetes 原生生态中,Ingress 资源是将集群内服务暴露到外部网络的标准方式。如果你用过 Nginx Ingress Controller 或者 Traefik,你一定对下面这个配置不陌生:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: simple-ingress
spec:
  rules:
  - host: my.example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: my-service
            port:
              number: 80

这个模型上手简单,看起来也很直观。但随着 微服务 架构变得越来越复杂,这套原生的方案开始显得有些力不从心了,主要体现在以下几个方面:

  1. 功能单一:原生 Ingress API 的焦点基本都在路径匹配(Path Matching)和主机名路由(Host Routing)上。一旦遇上更复杂的流量治理需求,比如金丝雀发布(按权重分流)、精细的请求头匹配、失败重试、服务熔断甚至是故障注入,原生 Ingress 就没什么好办法了。

  2. 配置碎片化:为了实现上述的高级功能,用户只能依赖 Ingress Controller 提供的一大堆特定的 Annotations(比如 nginx.ingress.kubernetes.io/rewrite-target)。这让配置和具体的实现方案(Nginx、Traefik)紧紧绑在了一起,迁移起来很困难,也缺乏统一的配置校验机制。

  3. L4/L7 能力割裂:Kubernetes Ingress 在设计时就主要考虑了 HTTP/HTTPS 流量。虽然你也能通过 ConfigMap 或者特定 Annotation 来支持 TCP/UDP,但这通常被视为一种“Hack”手段,并不是 Kubernetes 官方推荐的一等公民支持方式。

  4. 缺乏统一的可观测性:Ingress Controller 自己产生的指标、日志和追踪数据,往往和集群内部 Service Mesh 那一套是分开的。这就给构建一个完整的端到端全链路监控视图带来了不小的障碍。

那么,Istio Gateway 的出现,正是为了解决这些痛点。它不再仅仅是一个简单的“入口控制器”,而是一套完整的边缘流量治理方案。它到底强在哪里?我们接着往下看。

Istio Gateway 的设计哲学:解耦与分层

Istio 引入了一套全新的配置模型,核心思想就是把流量的物理接入(L4层)和逻辑路由(L7层)彻底分开。这种设计主要依靠两个 CRD(自定义资源定义)来实现:

  1. Gateway:定义网格边缘的负载均衡器属性。它负责“物理”层面的配置,比如监听哪个端口、使用什么协议(HTTP、TCP、gRPC),以及配置什么样的 TLS 证书等等。简单说,就是负责“开门”。

  2. VirtualService:定义流量的具体路由规则。它负责“逻辑”层面的配置,比如把 /v1 路径的流量全部导向服务的 v1 版本,或者把 5% 的流量切到金丝雀(canary)版本。简单说,就是负责“指路”。

架构图解

Istio Gateway核心架构:物理接入与逻辑路由解耦

这种解耦的设计带来了巨大的灵活性:基础设施团队可以专心管理 Gateway 资源(配置证书、开放端口),而业务开发团队可以独立地管理 VirtualService(配置各种路由和灰度策略)。两者职责清晰,互不干扰,大大提升了协作效率。

深入剖析 Gateway 资源

理论说完了,我们来看一个具体的 Gateway 资源定义,通过它来理解其结构:

apiVersion: networking.istio.io/v1beta1
kind: Gateway
metadata:
  name: my-gateway
  namespace: istio-system
spec:
  selector:
    istio: ingressgateway # 1. 关键:选择器
  servers:
  - port:
      number: 80
      name: http
      protocol: HTTP
    hosts:
    - "dev.example.com"   # 2. 允许的域名
  - port:
      number: 443
      name: https
      protocol: HTTPS
    tls:
      mode: SIMPLE         # 3. TLS 模式
      credentialName: my-cert-secret
    hosts:
    - "*.example.com"

1. Selector:绑定实体网关

spec.selector 是让 Gateway 配置生效的关键。Istio 默认安装时,会部署一个名为 istio-ingressgateway 的 Deployment,它的 Pod 上被打上了 istio: ingressgateway 这个标签。

通过配置 selector: {istio: ingressgateway},我们就把这份配置下发给了这个具体的 Envoy 代理实例。这意味着你可以根据业务需要,部署多套独立的 Ingress Gateway(比如一套处理公网流量,一套处理内网流量),然后通过不同的标签选择器来分别管理它们的配置,非常灵活。

2. Server:定义监听规则

servers 列表定义了网关具体对外暴露哪些端口,以及使用什么协议:

  • Port:必须包含 number(端口号)、name(端口名称,建议使用 协议-后缀 的格式)和 protocol(支持 HTTP, HTTPS, GRPC, HTTP2, MONGO, TCP, TLS)。
  • Hosts:这是一个白名单,指定了允许哪些 Host 头的请求通过这个端口进入网关。支持通配符 *
    • 重要提示:这里的 Hosts 仅仅是“允许进入”,并不代表网关“知道怎么路由它”。如果请求成功进入了网关,但没有找到任何与之匹配的 VirtualService 来处理,客户端最终收到的将是 404 错误。

3. TLS 配置

Gateway 在 TLS 支持方面非常强大,远超 K8s 原生 Ingress:

  • SIMPLE:标准的单向 TLS。网关负责终结 SSL 连接,然后将解密后的明文流量(或重新加密后)转发给后端服务。
  • PASSTHROUGH:TLS 透传模式。网关不解密流量,而是根据 SNI(Server Name Indication)信息,直接将加密的流量转发给对应的后端服务。
  • MUTUAL:双向 TLS (mTLS)。除了服务器端有证书,网关还会验证客户端提供的证书。
  • AUTO_PASSTHROUGH:一种特殊的模式,主要用于多集群服务网格之间的互通场景。

路由绑定:VirtualService 的 Gateway 模式

门已经用 Gateway 资源开好了,接下来就需要用 VirtualService 来告诉流量该往哪里走。

apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
  name: bookinfo
spec:
  hosts:
  - "dev.example.com"      # 1. 必须与 Gateway 中的 hosts 匹配
  gateways:
  - my-gateway             # 2. 显式绑定 Gateway
  http:
  - match:
    - uri:
        prefix: /reviews
    route:
    - destination:
        host: reviews
        port:
          number: 9080

绑定机制详解

  1. gateways 字段:这是决定 VirtualService 规则生效范围的关键。

    • 如果省略这个字段,VirtualService 默认只对网格内部(Mesh)的流量生效。
    • 如果明确填写了 Gateway 的名称(如 my-gateway),那么这条路由规则就会被下发并应用在对应的边缘网关上。
    • 如果填写了特殊的保留字 mesh,则规则只对网格内部的 Sidecar 代理生效。
    • 最佳实践:通常建议显式指定。如果你的规则既需要对内(网格内)生效,也需要对外(通过网关)生效,可以写成 gateways: [my-gateway, mesh]
  2. Hosts 匹配逻辑

    • VirtualService 的 hosts 列表,必须是它所绑定的 Gateway 资源中 hosts 列表的子集(或者能匹配上)。
    • 例如,Gateway 允许 *.example.com 这个域,那么 VirtualService 就可以配置 dev.example.com
    • 如果两者的 hosts 不匹配,Istio 的控制面组件 Pilot 就不会把这条 VirtualService 的路由配置下发给对应的 Gateway Pod,这会导致访问该域名的请求收到 404 错误。

Gateway与VirtualService绑定匹配示意图

为什么说 Istio Gateway 是 L4-L7 全栈网关?

很多人有一个误解,认为 Istio Gateway 只能处理 HTTP 流量。实际上,得益于底层 Envoy 代理的强大能力,它能够处理多种网络协议:

  • TCP 路由:你可以创建一个监听 3306 端口的 Gateway,协议配置为 TCP,然后通过 VirtualService 的 tcp 路由配置,将进入的数据库连接流量转发到内部不同的 MySQL 集群实例。
  • gRPC:天然支持 gRPC 协议的负载均衡、基于元数据(Header)的匹配以及故障注入等高级特性。
  • TLS 路由:利用 SNI 信息,Gateway 可以在不解密 HTTPS 流量的情况下,仅仅根据域名就将加密流量转发到不同的后端服务(TLS Passthrough 模式)。这对于银行、金融等对安全性和审计有极高要求的核心系统场景至关重要。

总结

Istio Gateway 的设计思路,放弃了 Kubernetes Ingress 那种简单的“路由表”思维,转而采用了“物理接入”与“逻辑路由”相分离的模型。

  • Gateway 资源:负责“开门”,专注于端口、协议、TLS证书等边缘基础设施的配置。
  • VirtualService 资源:负责“指路”,它直接复用了 Istio 在服务网格内部那套强大的流量治理能力,如流量切分、故障注入、重试熔断等。

这种设计虽然引入了一定的配置复杂度(需要管理两个 CRD),但换来的是企业级应用所需的灵活性、配置的统一性和强大的可扩展性。对于正在构建复杂微服务体系的团队来说,这套方案的价值是显而易见的。

希望这篇关于 Istio Gateway 核心概念的解析能对你有所帮助。如果你在实践过程中有更多心得或疑问,也欢迎在 云栈社区 与更多开发者交流探讨。




上一篇:近期反馈:Apple ID切换海外地区或致国内应用闪退
下一篇:机器人Scaling Law的验证者:Generalist如何用27万小时数据打造通用机器人模型
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2026-2-1 00:15 , Processed in 1.284772 second(s), 47 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2026 云栈社区.

快速回复 返回顶部 返回列表