3. 流量拓扑策略概念:VirtualService、DestinationRule、Gateway、ServiceEntry 的作用与关系

在 Istio 服务网格中,流量管理是核心能力之一。为了实现精细化的流量路由、负载均衡、故障注入和灰度发布,Istio 引入了四个关键的 自定义资源定义(CRD):VirtualService、DestinationRule、Gateway 和 ServiceEntry。它们共同构成了服务网格的流量拓扑策略基础。

理解这四个资源的作用及其相互关系,是使用 Helm 进行策略模板化部署的前提。下面通过一个整体关系图来建立直观认知:

流量拓扑策略四大核心资源关系图 Istio 服务网格 Gateway 南北向流量入口/出口 VirtualService 路由规则定义 DestinationRule 目标子集与策略 ServiceEntry 外部服务注册 绑定 路由 引用 扩展 💡 说明:Gateway 定义入口,VirtualService 定义路由规则,DestinationRule 定义目标策略,ServiceEntry 定义外部服务。 四者配合使用,构成完整的流量拓扑策略。

3.1 核心资源详解

3.1.1 VirtualService(虚拟服务)

VirtualService 是流量路由的核心规则引擎。它定义了流量如何从客户端路由到一个或多个目标服务。它不直接修改服务本身,而是在网格的数据平面(Envoy 代理)中注入路由规则。

  • 主要功能:基于请求的 host、URI、Header、权重等条件,将流量分发到不同的服务版本或子集。
  • 典型场景:金丝雀发布(5% 流量到 v2)、基于 Header 的灰度路由(用户为 test 的请求路由到 v2)、超时与重试配置。

关键字段:hosts(匹配的目标服务)、gateways(绑定的网关)、http/tcp(路由规则列表)、match(匹配条件)、route(目标与权重)。

3.1.2 DestinationRule(目标规则)

DestinationRule 定义了在路由决策之后,流量到达目标服务时应用的策略。它负责定义服务的子集(Subset)、负载均衡算法、连接池大小、熔断器设置以及 mTLS 模式。

  • 主要功能:定义服务的版本子集(如 v1、v2),配置负载均衡策略(轮询、随机、最少请求),设置熔断和连接池限制。
  • 典型场景:为服务定义多个版本子集供 VirtualService 引用;为特定服务开启 mTLS 严格模式;限制最大连接数防止雪崩。

注意:VirtualService 通过 destination.subset 字段引用 DestinationRule 中定义的子集名称。两者必须配合使用才能实现版本路由。

3.1.3 Gateway(网关)

Gateway 管理网格的南北向流量(即从外部进入网格或从网格流出到外部的流量)。它配置在网格边缘的 Envoy 代理上,负责监听特定的端口和协议,并应用 TLS 证书。

  • 主要功能:暴露服务给外部客户端;配置 TLS 终止;管理入口流量的端口和协议。
  • 典型场景:将微服务 API 通过 HTTPS 暴露到公网;为多个域名配置不同的证书;控制哪些外部流量可以进入网格。

区分:Gateway 只负责“接入”流量,不负责“路由”流量。路由逻辑由 VirtualService 通过 gateways 字段绑定到 Gateway 后实现。

3.1.4 ServiceEntry(服务条目)

ServiceEntry 用于将外部服务(如数据库、遗留系统、第三方 API)注册到服务网格的服务注册中心。这使得网格内的服务可以通过统一的 Istio 规则(如流量策略、可观测性)访问外部服务。

  • 主要功能:将网格外部的服务纳入网格管理;定义外部服务的 host、端口、协议和解析模式。
  • 典型场景:允许网格内服务访问外部 api.example.com;为外部数据库添加超时和重试策略;监控对外部服务的调用。

3.2 资源关系与协作流程

这四个资源并非孤立存在,它们通过明确的引用关系构成一个完整的流量处理流水线。下面的表格总结了它们之间的核心关系:

资源 A 资源 B 关系描述 关键字段
Gateway VirtualService VirtualService 通过 gateways 字段绑定到 Gateway,将外部流量引入网格路由规则。 spec.gateways
VirtualService DestinationRule VirtualService 的 route.destination.subset 引用 DestinationRule 中定义的子集。 route.destination.subset
VirtualService ServiceEntry VirtualService 的 hosts 字段可以匹配 ServiceEntry 中定义的外部服务 host。 spec.hosts
DestinationRule ServiceEntry DestinationRule 可以为 ServiceEntry 定义的外部服务配置流量策略(如 mTLS、负载均衡)。 spec.host

为了更清晰地展示一次完整的流量请求如何穿越这些资源,请看下面的请求处理流程图:

一次完整的外部请求处理流程 ① 外部请求 ② Gateway ③ VirtualService ④ DestinationRule ⑤ 目标服务 Pod 💡 流程说明:外部请求 → Gateway(接入) → VirtualService(路由规则匹配) → DestinationRule(子集选择与策略应用) → 目标服务 Pod(最终处理请求)

3.3 典型配置示例

以下是一个完整的流量拓扑策略配置示例,展示了如何将四个资源组合使用,实现“将 90% 流量路由到 v1,10% 路由到 v2”的金丝雀发布:

# 1. Gateway:定义入口
apiVersion: networking.istio.io/v1beta1
kind: Gateway
metadata:
  name: bookinfo-gateway
spec:
  selector:
    istio: ingressgateway
  servers:
  - port:
      number: 80
      name: http
      protocol: HTTP
    hosts:
    - "bookinfo.example.com"
---
# 2. VirtualService:定义路由规则
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
  name: bookinfo
spec:
  hosts:
  - "bookinfo.example.com"
  gateways:
  - bookinfo-gateway          # 绑定到 Gateway
  http:
  - match:
    - uri:
        prefix: /reviews
    route:
    - destination:
        host: reviews
        subset: v1            # 引用 DestinationRule 中的子集
      weight: 90
    - destination:
        host: reviews
        subset: v2
      weight: 10
---
# 3. DestinationRule:定义子集与策略
apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:
  name: reviews
spec:
  host: reviews
  trafficPolicy:
    loadBalancer:
      simple: RANDOM
  subsets:
  - name: v1
    labels:
      version: v1
  - name: v2
    labels:
      version: v2
---
# 4. ServiceEntry:注册外部服务(可选)
apiVersion: networking.istio.io/v1beta1
kind: ServiceEntry
metadata:
  name: external-db
spec:
  hosts:
  - "mysql.example.com"
  ports:
  - number: 3306
    name: tcp
    protocol: TCP
  resolution: DNS
  location: MESH_EXTERNAL

Helm 集成提示:在 Helm Chart 中,上述四个资源通常被定义为独立的模板文件(如 gateway.yaml、virtualservice.yaml 等),并通过 values.yaml 中的参数(如 canary.weight)动态控制路由权重和子集标签,实现策略的模板化部署。

3.4 总结

这四个资源构成了 Istio 流量管理的基石:

  • Gateway 负责“开门”,决定哪些外部流量可以进入网格。
  • VirtualService 负责“指路”,决定流量如何在不同服务间流转。
  • DestinationRule 负责“定策”,决定流量到达目标后的具体行为。
  • ServiceEntry 负责“扩界”,将网格外的服务纳入统一管理。