2. 虚拟服务基础配置:hosts字段详解、gateways字段详解、http路由规则基础结构

虚拟服务(VirtualService)是 Istio 流量治理的核心资源,它定义了流量如何被路由到目标服务。本章聚焦于虚拟服务配置的三个基础要素:hosts、gateways 以及 http 路由规则的基础结构。理解这三者是后续实现自动化回滚策略与性能调优的基石。

2.1 hosts 字段详解

hosts 字段指定了流量匹配的目标地址,可以是 DNS 名称、IP 地址或通配符。它是虚拟服务的入口匹配条件,决定了哪些请求会被该虚拟服务处理。

配置项 说明 示例
DNS 名称 匹配完整的域名,支持通配符 * reviews.bookinfo.svc.cluster.local
通配符 匹配所有子域名或所有服务 *.bookinfo.svc.cluster.local
IP 地址 匹配具体的 IP 或 CIDR 范围 10.0.0.1 或 10.0.0.0/24
短名称 在同一个命名空间下,可省略完整域名 reviews
最佳实践:在生产环境中,建议使用完整的 DNS 名称或明确的通配符,避免因命名空间隔离导致路由意外匹配。对于跨命名空间访问,必须使用 <service>.<namespace>.svc.cluster.local 格式。

2.2 gateways 字段详解

gateways 字段决定了虚拟服务的作用范围:是处理来自网格内部的流量(Sidecar 间通信),还是处理来自网格外部的流量(通过 Ingress Gateway),或者两者兼有。

  • 不设置 gateways:默认值为 mesh,仅处理网格内部的 Sidecar 流量。
  • 设置为 mesh:显式声明处理内部流量。
  • 设置为具体的 Gateway 名称:处理通过该 Gateway 进入的外部流量。
  • 同时设置 mesh 和 Gateway 名称:同时处理内部和外部流量。
关键区别:当虚拟服务同时绑定 mesh 和外部 Gateway 时,hosts 字段中的域名必须与 Gateway 的 servers.hosts 配置匹配,否则外部流量无法进入。

2.3 http 路由规则基础结构

http 路由规则是虚拟服务的核心,它定义了如何根据请求属性(路径、方法、头部等)将流量分发到不同的目标子集。一个完整的 http 路由规则包含以下关键部分:

  1. match:匹配条件,支持 URI、Scheme、Method、Authority、Headers、Port、SourceLabels、Gateways 等。
  2. route:目标路由,指定流量发往的 destination.host、subset 和 weight。
  3. redirect / rewrite:请求重定向或 URI 重写。
  4. timeout / retries / fault:超时、重试和故障注入策略。
  5. mirror:流量镜像,用于灰度测试。
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
  name: reviews-route
spec:
  hosts:
  - reviews.bookinfo.svc.cluster.local
  gateways:
  - mesh
  - bookinfo-gateway
  http:
  - match:
    - uri:
        prefix: /reviews/v1
    route:
    - destination:
        host: reviews.bookinfo.svc.cluster.local
        subset: v1
      weight: 100
  - match:
    - uri:
        prefix: /reviews/v2
    route:
    - destination:
        host: reviews.bookinfo.svc.cluster.local
        subset: v2
      weight: 100
  - route:
    - destination:
        host: reviews.bookinfo.svc.cluster.local
        subset: v1
      weight: 50
    - destination:
        host: reviews.bookinfo.svc.cluster.local
        subset: v2
      weight: 50
注意:路由规则的匹配顺序是从上到下,一旦匹配成功则停止后续匹配。务必把精确匹配或高优先级规则放在前面,兜底规则放在最后。

2.4 虚拟服务路由流程示意图

下图展示了从请求进入、经过 hosts 匹配、gateways 过滤,到 http 路由规则分发至不同子集的完整流程:

虚拟服务路由流程 入站请求 hosts 匹配(DNS / 通配符 / IP) gateways 过滤(mesh / 外部) http 路由规则(match → route) subset: v1 (50%) subset: v2 (50%) 说明:请求依次经过 hosts 匹配、gateways 过滤,最终由 http 路由规则分发到不同版本子集

2.5 路由规则匹配优先级与性能考量

在性能调优场景下,路由规则的匹配效率直接影响请求延迟。以下是匹配优先级和性能建议:

匹配类型 优先级 性能影响 优化建议
精确匹配(exact) 最高 低(哈希查找) 优先使用,减少正则开销
前缀匹配(prefix) 中 中(字符串比较) 避免过长的前缀,控制规则数量
正则匹配(regex) 最低 高(正则引擎回溯) 仅在必要时使用,避免复杂正则
性能调优要点:在自动化回滚场景中,建议将回滚目标版本的匹配规则放在 http 列表的最前面,利用精确匹配减少匹配时间。同时,避免在单个虚拟服务中定义超过 20 条路由规则,以降低 Envoy 配置更新的计算开销。