3. 流量拓扑策略概念:VirtualService、DestinationRule、Gateway、ServiceEntry 的作用与关系
在 Istio 服务网格中,流量管理是核心能力之一。为了实现精细化的流量路由、负载均衡、故障注入和灰度发布,Istio 引入了四个关键的 自定义资源定义(CRD):VirtualService、DestinationRule、Gateway 和 ServiceEntry。它们共同构成了服务网格的流量拓扑策略基础。
理解这四个资源的作用及其相互关系,是使用 Helm 进行策略模板化部署的前提。下面通过一个整体关系图来建立直观认知:
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 |
为了更清晰地展示一次完整的流量请求如何穿越这些资源,请看下面的请求处理流程图:
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 负责“扩界”,将网格外的服务纳入统一管理。