はじめに
Istioが持つTraffic Management機能にて、 Virtual ServiceとDestination Ruleを組み合わせることで異なるバージョンのアプリへのトラフィックの割合を指定することが可能となります。
本記事ではUser-Agentを元にGoogleChormeとInternetExplorerのトラフィックを別のPodに流すように設定を入れて確認しました。
環境情報
- Openshift v4.6
- Red Hat OpenShift Service Mesh(2.1.0-0 provided by Red Hat, Inc)Operator
想定状況
以下の記事と同様の環境を想定して
DestinationRuleも同様のものを準備します。
apiVersion: networking.istio.io/v1beta1 kind: DestinationRule metadata: annotations: name: reviews namespace: istio-test spec: host: reviews subsets: - labels: version: v1 name: pod1 - labels: version: v2 name: pod2 - labels: version: v3 name: pod3
また、Header情報としてNginx等のアクセスログにてChormeとIEのUser-Agentを確認しておきます。
...Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36...
...Mozilla/5.0 (Windows NT 10.0; Win64; x64; Trident/7.0; Touch; rv:11.0) like Gecko...
Headerによる割り振り
冒頭で記載したトラフィック管理を実現するためにVirtualServiceのmatch.headersを利用します。
$ oc explain vs.spec.http.match.headers KIND: VirtualService VERSION: networking.istio.io/v1beta1 RESOURCE: headers <map[string]Object> DESCRIPTION: <empty> FIELDS: exact <string> prefix <string> regex <string> RE2 style regex-based match (https://github.com/google/re2/wiki/Syntax).
サンプルとして以下のVirtualServiceを適用すると
apiVersion: networking.istio.io/v1beta1 kind: VirtualService metadata: annotations: name: reviews namespace: istio-test spec: hosts: - reviews http: - match: - headers: user-agent: regex: .*Chrome.* route: - destination: host: reviews subset: pod3 - route: - destination: host: reviews subset: pod1
ヘッダーのUser-Agentに"Google"という文言があればv3というラベルが付与されたPodに通信を割り振ります。
試しに以下のようにcurlコマンドでヘッダーを指定することで動作確認ができます。
$ curl -H "user-agent: ---Chorme---" http://xx/productpage
実際にChromeで同ページを開くとVersion3の画面が開き、IEで開くとVersion1の画面が開きました。
終わりに
今回はRE2 style regex-based matchという正規表現を用いましたが、Header情報部分を詳細に絞ることでバージョンや端末のOS毎にトラフィックの送り先を変更することも可能となります。
以上、ご参考になれば幸いです。