3. 流量拓扑概念:VirtualService、DestinationRule、ServiceEntry、Gateway 在拓扑中的作用
在 Kubernetes 服务网格(如 Istio)中,流量拓扑并非物理网络拓扑,而是由一系列 CRD(Custom Resource Definition)对象共同定义的逻辑流量路径。这些对象描述了流量从入口到目标工作负载的完整路由规则、负载均衡策略、外部服务接入点以及网关边界。理解这四类核心资源在拓扑中的角色,是诊断流量拓扑漂移的基础。
3.1 四类核心资源的角色总览
| 资源类型 | 拓扑角色 | 核心职责 | 漂移影响范围 |
|---|---|---|---|
| Gateway | 流量入口边界 | 管理南北向流量,暴露服务到网格外部 | 外部访问路径断裂或错误路由 |
| VirtualService | 流量路由规则 | 定义流量匹配条件与目标转发规则 | 路由错乱、灰度失效、超时重试异常 |
| DestinationRule | 负载均衡与连接策略 | 定义子集划分、负载均衡算法、连接池、TLS 设置 | 负载不均、熔断失效、TLS 握手失败 |
| ServiceEntry | 外部服务注册 | 将网格外部的服务注册到网格内部的服务发现 | 外部服务不可达、指标丢失、访问超时 |
3.2 流量拓扑的完整路径
一个典型的服务网格流量拓扑路径如下:
- Gateway 接收外部请求,根据主机名和端口将流量转发给对应的 VirtualService。
- VirtualService 根据 HTTP 头、URI 路径、权重等规则,将流量路由到目标 Destination(通常是 Kubernetes Service 的 FQDN)。
- DestinationRule 对目标 Service 的 子集(Subset) 进行定义,并指定负载均衡策略(如 ROUND_ROBIN、LEAST_CONN)和连接池设置。
- 如果目标服务在网格外部,则通过 ServiceEntry 将其注册为网格内可识别的服务,使 VirtualService 和 DestinationRule 能够正常引用。
关键理解: 这四类资源共同构成一个有向无环图(DAG)。任何资源的变更(如 Gateway 端口修改、VirtualService 路由规则删除、DestinationRule 子集名称变更、ServiceEntry 地址更新)都可能导致流量拓扑发生漂移,即实际流量路径与预期路径不一致。
3.3 流量拓扑结构图
下图展示了四类资源在流量拓扑中的位置与连接关系:
3.4 各资源在拓扑中的详细作用
3.4.1 Gateway:流量入口边界
- 作用:作为网格的南北向流量入口,监听指定端口(如 80、443),并根据
selector匹配对应的 Envoy 代理实例。 - 拓扑位置:位于网格边界,是外部流量进入网格的第一站。
- 漂移风险:Gateway 的
servers.port或servers.hosts变更后,若未同步更新 VirtualService 的gateways字段,会导致 404 或连接拒绝。
3.4.2 VirtualService:流量路由规则
- 作用:定义流量匹配条件(如 URI 前缀、Header 匹配、权重分配)以及转发目标。
- 拓扑位置:位于 Gateway 之后、DestinationRule 之前,是路由决策的核心节点。
- 漂移风险:路由规则中的
destination.host指向不存在的 Service,或subset名称与 DestinationRule 不匹配,导致流量被丢弃或路由到错误版本。
3.4.3 DestinationRule:负载均衡与连接策略
- 作用:定义目标服务的子集(Subset)、负载均衡算法(ROUND_ROBIN、LEAST_CONN、RANDOM)、连接池大小、熔断阈值、TLS 设置。
- 拓扑位置:与 VirtualService 配合使用,VirtualService 决定“路由到哪里”,DestinationRule 决定“如何路由”。
- 漂移风险:子集标签选择器变更后,Pod 标签未同步,导致子集为空;或 TLS 配置错误导致握手失败。
3.4.4 ServiceEntry:外部服务注册
- 作用:将网格外部的服务(如数据库、第三方 API)注册到网格的服务发现中,使其可以被 VirtualService 和 DestinationRule 引用。
- 拓扑位置:作为网格逻辑拓扑的延伸节点,连接内部路由规则与外部目标。
- 漂移风险:ServiceEntry 的
hosts或endpoints.address变更后,若未更新引用它的 VirtualService,会导致流量路由到已废弃的地址。
3.5 资源之间的依赖关系
下表总结了四类资源之间的引用依赖关系,这是拓扑漂移分析的关键:
| 源资源 | 引用字段 | 目标资源 | 依赖类型 |
|---|---|---|---|
| VirtualService | gateways |
Gateway | 可选(不指定则使用网格内默认路由) |
| VirtualService | http.route.destination.host |
Kubernetes Service / ServiceEntry | 必选 |
| VirtualService | http.route.destination.subset |
DestinationRule 中的 subset | 可选(不指定则路由到所有版本) |
| DestinationRule | host |
Kubernetes Service / ServiceEntry | 必选 |
| DestinationRule | subsets.labels |
Pod 标签 | 必选(子集生效前提) |
漂移复测要点: 在复测流程中,应重点检查上述依赖关系是否完整且一致。例如,VirtualService 引用的
subset 必须在对应的 DestinationRule 中存在;DestinationRule 的 host 必须与 VirtualService 的 destination.host 指向同一个 Service 或 ServiceEntry。
3.6 拓扑漂移的典型场景
结合上述资源角色,以下场景是拓扑漂移告警的高发区:
- Gateway 端口漂移:Gateway 将 80 端口改为 8080,但 VirtualService 仍绑定
gateways: ["my-gateway"],导致外部请求无法匹配。 - VirtualService 路由目标漂移:灰度发布后,VirtualService 的
weight: 100指向新版本,但新版本的 Pod 尚未就绪,导致流量丢失。 - DestinationRule 子集漂移:子集标签从
version: v2改为version: v3,但 VirtualService 仍引用subset: v2,导致路由规则失效。 - ServiceEntry 端点漂移:外部服务的 IP 地址变更,但 ServiceEntry 未更新,导致内部服务调用外部 API 超时。