3. 流量拓扑概念:VirtualService、DestinationRule、ServiceEntry、Gateway 在拓扑中的作用

在 Kubernetes 服务网格(如 Istio)中,流量拓扑并非物理网络拓扑,而是由一系列 CRD(Custom Resource Definition)对象共同定义的逻辑流量路径。这些对象描述了流量从入口到目标工作负载的完整路由规则、负载均衡策略、外部服务接入点以及网关边界。理解这四类核心资源在拓扑中的角色,是诊断流量拓扑漂移的基础。

3.1 四类核心资源的角色总览

资源类型 拓扑角色 核心职责 漂移影响范围
Gateway 流量入口边界 管理南北向流量,暴露服务到网格外部 外部访问路径断裂或错误路由
VirtualService 流量路由规则 定义流量匹配条件与目标转发规则 路由错乱、灰度失效、超时重试异常
DestinationRule 负载均衡与连接策略 定义子集划分、负载均衡算法、连接池、TLS 设置 负载不均、熔断失效、TLS 握手失败
ServiceEntry 外部服务注册 将网格外部的服务注册到网格内部的服务发现 外部服务不可达、指标丢失、访问超时

3.2 流量拓扑的完整路径

一个典型的服务网格流量拓扑路径如下:

  1. Gateway 接收外部请求,根据主机名和端口将流量转发给对应的 VirtualService。
  2. VirtualService 根据 HTTP 头、URI 路径、权重等规则,将流量路由到目标 Destination(通常是 Kubernetes Service 的 FQDN)。
  3. DestinationRule 对目标 Service 的 子集(Subset) 进行定义,并指定负载均衡策略(如 ROUND_ROBIN、LEAST_CONN)和连接池设置。
  4. 如果目标服务在网格外部,则通过 ServiceEntry 将其注册为网格内可识别的服务,使 VirtualService 和 DestinationRule 能够正常引用。
关键理解: 这四类资源共同构成一个有向无环图(DAG)。任何资源的变更(如 Gateway 端口修改、VirtualService 路由规则删除、DestinationRule 子集名称变更、ServiceEntry 地址更新)都可能导致流量拓扑发生漂移,即实际流量路径与预期路径不一致。

3.3 流量拓扑结构图

下图展示了四类资源在流量拓扑中的位置与连接关系:

服务网格流量拓扑核心资源关系图 服务网格流量拓扑核心资源关系图 外部客户端 Gateway VirtualService DestinationRule 内部目标服务 ServiceEntry 外部目标服务 说明:Gateway 处理南北向流量;VirtualService 定义路由规则;DestinationRule 定义负载均衡策略;ServiceEntry 注册外部服务。 虚线箭头表示可选路径(外部服务通过 ServiceEntry 接入)。

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 超时。