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

在 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
这个模型上手简单,看起来也很直观。但随着 微服务 架构变得越来越复杂,这套原生的方案开始显得有些力不从心了,主要体现在以下几个方面:
-
功能单一:原生 Ingress API 的焦点基本都在路径匹配(Path Matching)和主机名路由(Host Routing)上。一旦遇上更复杂的流量治理需求,比如金丝雀发布(按权重分流)、精细的请求头匹配、失败重试、服务熔断甚至是故障注入,原生 Ingress 就没什么好办法了。
-
配置碎片化:为了实现上述的高级功能,用户只能依赖 Ingress Controller 提供的一大堆特定的 Annotations(比如 nginx.ingress.kubernetes.io/rewrite-target)。这让配置和具体的实现方案(Nginx、Traefik)紧紧绑在了一起,迁移起来很困难,也缺乏统一的配置校验机制。
-
L4/L7 能力割裂:Kubernetes Ingress 在设计时就主要考虑了 HTTP/HTTPS 流量。虽然你也能通过 ConfigMap 或者特定 Annotation 来支持 TCP/UDP,但这通常被视为一种“Hack”手段,并不是 Kubernetes 官方推荐的一等公民支持方式。
-
缺乏统一的可观测性:Ingress Controller 自己产生的指标、日志和追踪数据,往往和集群内部 Service Mesh 那一套是分开的。这就给构建一个完整的端到端全链路监控视图带来了不小的障碍。
那么,Istio Gateway 的出现,正是为了解决这些痛点。它不再仅仅是一个简单的“入口控制器”,而是一套完整的边缘流量治理方案。它到底强在哪里?我们接着往下看。
Istio Gateway 的设计哲学:解耦与分层
Istio 引入了一套全新的配置模型,核心思想就是把流量的物理接入(L4层)和逻辑路由(L7层)彻底分开。这种设计主要依靠两个 CRD(自定义资源定义)来实现:
-
Gateway:定义网格边缘的负载均衡器属性。它负责“物理”层面的配置,比如监听哪个端口、使用什么协议(HTTP、TCP、gRPC),以及配置什么样的 TLS 证书等等。简单说,就是负责“开门”。
-
VirtualService:定义流量的具体路由规则。它负责“逻辑”层面的配置,比如把 /v1 路径的流量全部导向服务的 v1 版本,或者把 5% 的流量切到金丝雀(canary)版本。简单说,就是负责“指路”。
架构图解

这种解耦的设计带来了巨大的灵活性:基础设施团队可以专心管理 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
绑定机制详解
-
gateways 字段:这是决定 VirtualService 规则生效范围的关键。
- 如果省略这个字段,VirtualService 默认只对网格内部(Mesh)的流量生效。
- 如果明确填写了 Gateway 的名称(如
my-gateway),那么这条路由规则就会被下发并应用在对应的边缘网关上。
- 如果填写了特殊的保留字
mesh,则规则只对网格内部的 Sidecar 代理生效。
- 最佳实践:通常建议显式指定。如果你的规则既需要对内(网格内)生效,也需要对外(通过网关)生效,可以写成
gateways: [my-gateway, mesh]。
-
Hosts 匹配逻辑:
- VirtualService 的
hosts 列表,必须是它所绑定的 Gateway 资源中 hosts 列表的子集(或者能匹配上)。
- 例如,Gateway 允许
*.example.com 这个域,那么 VirtualService 就可以配置 dev.example.com。
- 如果两者的 hosts 不匹配,Istio 的控制面组件 Pilot 就不会把这条 VirtualService 的路由配置下发给对应的 Gateway Pod,这会导致访问该域名的请求收到 404 错误。

为什么说 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 核心概念的解析能对你有所帮助。如果你在实践过程中有更多心得或疑问,也欢迎在 云栈社区 与更多开发者交流探讨。