Pages - Menu

2021年4月5日 星期一

[istio]istio Virtual Service 跨namespace讀取 DestinationRule

前言

因為在寫 vs的match uri,有發生一些坑,使用了prefix導致其他的VS都去抓到另一個VS的路徑,
於是想要讓所有的VS都用同一個VS,避免未來發生同樣的錯誤,不好找原因。


正文

目前的狀況是 A服務在 A 的namespace上面, B服務在 B 的 namespace上面。
正常的方式,
VirtualService 跟 DestinationRule 都會各自在所屬服務上面的 namespace上面。
所以,如果有 三個服務,就會有 三個 VirtualService ,
同時 match uri的prefix部分,也都寫 /api /api2 /api3 的話,就會發現,服務不管怎麼呼叫都是呼叫到api
其實這也算我發生的錯誤,prefix 是只針對前面的字串符合就過了。
ref. HTTPMatchRequest

但這個錯誤未來不知道有沒有辦法避免,是也能夠使用exact 完全符合的關鍵字來避免上面的錯誤發生。
但此時我就在思考,能不能未來都統一使用一個 VirtualService 就好,
這樣也方便管理。

過程中的血淚,就不細說了。

目前能做到的是 A、B 共用一個 VirtualService,此 VS在A的 namespace上面,
然後 DestinationRule 則分別在A、B 的namespace上面各架設一個。

如果DR也想要共用的話,會發生錯誤,

  This subset’s labels are not found in any matching host

想過使用指定的FQDN的label,來強迫他去指定的地方找deployment,但失敗了。
如果有人有看到方法還麻煩告知。

剛在寫文章的時候,有看到DR 也有exportTO的指令,
所以應該也是可以透過exportTO的方法,來共用同一個DR。

目前的yaml寫法如下

  exportTo:
    - '*'
  http:
    - match:
        - uri:
            prefix: /v2
      name: bale-api-v2
      rewrite:
        uri: /api
      route:
        - destination:
            host: bale-api.sex-system.svc.cluster.local
            port:
              number: 80
            subset: bale-api2
          weight: 80
        - destination:
            host: bale-api.sex-system.svc.cluster.local
            port:
              number: 80
            subset: bale-api
          weight: 20

這邊在kiali會看到警告 Subnet not found (Fig.1),

但如果直接從Graph看流量分佈的話,是有在分流的。


(Fig.1)

這邊要注意,一定要加上 exportTO ,允許該服務可以跨過邊界去尋找到DR。

exportTO:
  - '*'

ref.
VirtualService
Destination Rule is not applied to traffic from all namespaces it’s exported to
Istio 的配置分析
VirtualService資源詳解

沒有留言:

張貼留言