首页 > 解决方案 > 无法使用“将大型虚拟服务和目标规则拆分为多个资源”

问题描述

istio 文档描述“将大型虚拟服务和目标规则拆分为多个资源”

https://istio.io/docs/ops/best-practices/traffic-management/

这是我的虚拟服务 yaml ,</p>

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: project-b
  namespace: test1
spec:
  hosts:
  - project-b.test1.svc.cluster.local
  http:
  - match:
    - headers:
        route-namespace:
          exact: "test1"
    route:
    - destination:
        host: project-b.test1.svc.cluster.local


---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: project-b-test2
  namespace: test1
spec:
  hosts:
  - project-b.test1.svc.cluster.local
  http:
  - match:
    - headers:
        route-namespace:
          exact: "test2"
    route:
    - destination:
        host: project-b.test2.svc.cluster.local

在此处输入图像描述 只有一个虚拟服务可用,

标签: istio

解决方案


是的,这是预期的行为。

根据istio文档:

在不方便为单个VirtualServiceDestinationRule资源中的特定主机定义完整的路由规则或策略集的情况下,最好在多个资源中逐步指定主机的配置。如果绑定到网关,Pilot 将合并此类目标规则并合并此类虚拟服务。


VirtualService 应用现有主机的第二个和后续时, istio-pilot 会将附加路由规则合并到主机的现有配置中。但是,使用此功能时必须仔细考虑一些注意事项。

  1. 尽管将保留任何给定源中规则的评估顺序 VirtualService ,但跨资源顺序是未定义的。换句话说,跨片段配置的规则没有保证的评估顺序,因此只有在跨片段规则之间没有冲突规则或顺序依赖时,它才会具有可预测的行为。
  2. 片段中应该只有一个“包罗万象”的规则(即,匹配任何请求路径或标头的规则)。所有此类“包罗万象”的规则将被移至合并配置中列表的末尾,但由于它们捕获所有请求,因此首先应用的规则将基本上覆盖并禁用任何其他请求。
  3. 如果 A VirtualService 绑定到网关,则只能以这种方式进行分段。Sidecar 不支持主机合并。

推荐阅读