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.localhost
、front.localhost
),就可以设置:
yaml
hosts:
- feature-probe.localhost
和:
yaml
hosts:
- front.localhost
然后两个 VS 就不会冲突了。
方案三:拆成不同 Gateway 管理
如果你能控制 Gateway 配置,可以给这两个服务设置不同的网关(比如 feature-gateway
, front-gateway
),避免路由打架。