(O+P)ut

アウトプット



(O+P)ut

エンジニアのアウトプット

【Istio/Virtualservice】Headerのブラウザ情報を用いてトラフィック管理を行う

スポンサーリンク

はじめに

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毎にトラフィックの送り先を変更することも可能となります。

以上、ご参考になれば幸いです。