Istio 中 VirtualService 的注意事項
Istio 要求叢集中ofollow,noindex">VirtualService
定義的所有目標主機都是唯一的。當使用目標主機的短名稱時(不包含'.'
的目標主機,例如使用reviews
,而不是reviews.default.svc.cluster.local
),Istio 會將該短名稱轉換為 VirtualService 規則所在的名稱空間的FQDN
,而不是轉換為目標主機所在的名稱空間的 FQDN。因此,當在不同的名稱空間中定義 VirtualService 資源時允許目標主機的短名稱重複。當你的目標主機包含*
萬用字元字首、IP 地址或 Web 地址時,VirtualService 不會將其視為短名稱,也就不會嘗試將其轉換為 FQDN。反正無論如何,目標主機必須是唯一的。
1. 目標主機衝突示例
下面舉幾個目標主機衝突的例子,以幫助大家加深對這方面的理解。
示例 1
下面兩個VirtualService
的目標主機的 FQDN 分別是reviews.foo.svc.cluster.local
和reviews.bar.svc.cluster.local
,這是允許的。
apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: vs1 namespace: foo spec: hosts: - reviews ... --- apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: vs2 namespace: bar spec: hosts: - reviews ...
示例 2
下面兩個VirtualService
的目標主機的 FQDN 都是reviews.default.svc.cluster.local
,這是不推薦的,會導致不確定的路由行為。
apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: vs3 namespace: default spec: hosts: - reviews ... --- apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: vs4 namespace: default spec: hosts: - reviews ...
優化方案請參考下文的使目標主機唯一。
示例 3
下面這種寫法也是不推薦的,因為它在兩個不同的 VirtualService 資源中定義了相同的 Web 地址,會導致路由冗餘。
apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: vs5 namespace: foo spec: hosts: - google.com http: - match: - uri: prefix: /search route: - destination: host: search.foo.svc.cluster.local --- apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: vs6 namespace: foo spec: hosts: - google.com http: - match: - uri: prefix: /mail route: - destination: host: mail.foo.svc.cluster.local
優化方案請參考下文的合併衝突的 VirtualService 。
2. 優化方案
這裡給出兩個優化準則,可以改進上文的不恰當寫法。
使目標主機唯一
可以將衝突的 VirtualService 中定義的目標主機更改為唯一的。以下的 VirtualServices 具有唯一的目標主機reviews
和ratings
,可以用來優化上面示例 2 的寫法。
apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: vs3 namespace: default spec: hosts: - reviews ... --- apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: vs4 namespace: default spec: hosts: - ratings ...
合併衝突的 VirtualService
可以將衝突的 VirtualService 中定義的路由規則合併到同一個 VirtualService 中。下面的 VirtualService 可以解決示例 3 的問題,因為規則已合併,並且僅保留具有目標主機google.com
的單個 VirtualService。
apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: vs5 namespace: foo spec: hosts: - google.com http: - match: - uri: prefix: /search route: - destination: host: search.foo.svc.cluster.local - match: - uri: prefix: /mail route: - destination: host: mail.foo.svc.cluster.local
-----------他日江湖相逢 再當杯酒言歡-----------