Skip to content

Priority

优先级规则

Istio 并不显式声明“优先级”字段,而是靠 match 顺序 + 精确度 来决定哪个匹配生效:

1. 同一个 VirtualService 内

  • http 匹配规则是 自上而下顺序匹配,一旦匹配成功,就不会继续往下匹配。
  • 所以,越“精确”的规则(如 regex、长 prefix)应该写在前面。

2. 多个 VirtualService 之间

Istio 的文档中说明了以下几个关键点:

项目描述
hosts每个 VS 只能作用于其指定的 hosts(服务名或通配名)
gateways每个 VS 只作用于它绑定的 Gateway(或 mesh
URI 匹配冲突当两个 VS 对同一个 host/gateway 定义了路径匹配,Istio 不保证匹配优先顺序,可能发生不确定行为
✅ 官方建议同一个 host/gateway 只使用一个 VirtualService 来避免冲突

如何解决冲突

你可以采用以下 几种改法之一

方案一:合并成一个 VirtualService(推荐)

把两段规则放在一个 VirtualService 的 http 中,写成类似:

yaml
spec:
  gateways:
  - foobar-gateway
  hosts:
  - '*'
  http:
  - match:
    - uri:
          prefix: /probe/
    rewrite:
      uri: /
    route:
      - destination:
          host: foobar-feature-probe-api.one-sit.svc.cluster.local
          port:
            number: 4008

  # 其他 feature-probe 规则 ...
  
  - match:
    - uri:
          regex: ^((/[^/]+)(/[^/]+))/foobar/projects
      - uri:
          regex: ^(\/|(\/[^/]+){1,2}\/?((\/_[^/]|\/403)+\/?.*)?)$
      - uri:
          regex: ^/([^/]+)/_settings/foobar/(.*)
      - uri:
          prefix: /
    route:
      - destination:
          host: foobar-one-front.one-sit.svc.cluster.local
          port:
            number: 80

方案二:按子域或 Host 拆分

如果你能使用子域或指定主机名访问服务(如 feature-probe.localhostfront.localhost),就可以设置:

yaml
hosts:
- feature-probe.localhost

和:

yaml
hosts:
- front.localhost

然后两个 VS 就不会冲突了。

方案三:拆成不同 Gateway 管理

如果你能控制 Gateway 配置,可以给这两个服务设置不同的网关(比如 feature-gateway, front-gateway),避免路由打架。