リクエストルーティング
このタスクでは、複数のバージョンのマイクロサービスにリクエストを動的にルーティングする方法を示します。
始める前に
このタスクについて
Istio Bookinfoサンプルは、それぞれに複数のバージョンを持つ4つの個別のマイクロサービスで構成されています。マイクロサービスの1つである`reviews`の3つの異なるバージョンがデプロイされ、同時に実行されています。これが引き起こす問題を説明するために、ブラウザでBookinfoアプリケーションの`/productpage`にアクセスし、数回更新します。URLは`http://$GATEWAY_URL/productpage`です。ここで、`$GATEWAY_URL`はBookinfoドキュメントで説明されているイングレスの外部IPアドレスです。
書籍レビューの出力に星評価が含まれる場合と含まれない場合があることに気付くでしょう。これは、ルーティング先の明示的なデフォルトサービスバージョンがない場合、Istioがラウンドロビン方式ですべての利用可能なバージョンにリクエストをルーティングするためです。
このタスクの最初の目標は、すべてのトラフィックをマイクロサービスのv1
(バージョン1)にルーティングするルールを適用することです。後で、HTTPリクエストヘッダーの値に基づいてトラフィックをルーティングするルールを適用します。
バージョン1へのルーティング
1つのバージョンにのみルーティングするには、マイクロサービスのデフォルトバージョンにトラフィックを送信するルートルールを設定します。
- ルートルールを作成するには、次のコマンドを実行します。
Istioは、仮想サービスを使用してルートルールを定義します。各マイクロサービスのv1
にすべてのトラフィックをルーティングする仮想サービスを適用するには、次のコマンドを実行します。
$ kubectl apply -f @samples/bookinfo/networking/virtual-service-all-v1.yaml@
設定の伝播は最終的に整合性が取れるため、仮想サービスが有効になるまで数秒待ってください。
$ kubectl apply -f - <<EOF
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: reviews
spec:
parentRefs:
- group: ""
kind: Service
name: reviews
port: 9080
rules:
- backendRefs:
- name: reviews-v1
port: 9080
EOF
- 定義されたルートは、次のコマンドで表示できます。
$ kubectl get virtualservices -o yaml
- apiVersion: networking.istio.io/v1
kind: VirtualService
...
spec:
hosts:
- details
http:
- route:
- destination:
host: details
subset: v1
- apiVersion: networking.istio.io/v1
kind: VirtualService
...
spec:
hosts:
- productpage
http:
- route:
- destination:
host: productpage
subset: v1
- apiVersion: networking.istio.io/v1
kind: VirtualService
...
spec:
hosts:
- ratings
http:
- route:
- destination:
host: ratings
subset: v1
- apiVersion: networking.istio.io/v1
kind: VirtualService
...
spec:
hosts:
- reviews
http:
- route:
- destination:
host: reviews
subset: v1
対応するsubset
定義は、次のコマンドで表示することもできます。
$ kubectl get destinationrules -o yaml
$ kubectl get httproute reviews -o yaml
...
spec:
parentRefs:
- group: gateway.networking.k8s.io
kind: Service
name: reviews
port: 9080
rules:
- backendRefs:
- group: ""
kind: Service
name: reviews-v1
port: 9080
weight: 1
matches:
- path:
type: PathPrefix
value: /
status:
parents:
- conditions:
- lastTransitionTime: "2022-11-08T19:56:19Z"
message: Route was valid
observedGeneration: 8
reason: Accepted
status: "True"
type: Accepted
- lastTransitionTime: "2022-11-08T19:56:19Z"
message: All references resolved
observedGeneration: 8
reason: ResolvedRefs
status: "True"
type: ResolvedRefs
controllerName: istio.io/gateway-controller
parentRef:
group: gateway.networking.k8s.io
kind: Service
name: reviews
port: 9080
リソースステータスで、reviews
親のAccepted
条件がTrue
であることを確認してください。
Bookinfoマイクロサービス、特にreviews
サービスバージョン1のv1
バージョンにルーティングするようにIstioを設定しました。
新しいルーティング設定のテスト
ブラウザでBookinfoアプリの/productpage
をもう一度更新することで、新しい構成を簡単にテストできます。ページのレビュー部分は、何回更新しても、評価星が表示されません。これは、reviewsサービスのすべてのトラフィックをバージョンreviews:v1
にルーティングするようにIstioを設定し、このバージョンのサービスが星評価サービスにアクセスしないためです。
このタスクの最初の部分である、サービスの1つのバージョンへのトラフィックのルーティングを正常に完了しました。
ユーザーIDに基づくルーティング
次に、特定のユーザーからのすべてのトラフィックが特定のサービスバージョンにルーティングされるように、ルート構成を変更します。この場合、Jasonという名前のユーザーからのすべてのトラフィックは、サービスreviews:v2
にルーティングされます。
この例は、productpage
サービスがreviewsサービスへのすべてのアウトバウンドHTTPリクエストにカスタムend-user
ヘッダーを追加するという事実によって有効になっています。
Istioは、イングレスゲートウェイでの強力に認証されたJWTに基づくルーティングもサポートしています。詳細については、JWTクレームベースのルーティングを参照してください。
reviews:v2
は、星評価機能を含むバージョンであることに注意してください。
- ユーザーベースのルーティングを有効にするには、次のコマンドを実行します。
$ kubectl apply -f @samples/bookinfo/networking/virtual-service-reviews-test-v2.yaml@
次のコマンドを使用して、ルールが作成されたことを確認できます。
$ kubectl get virtualservice reviews -o yaml
apiVersion: networking.istio.io/v1
kind: VirtualService
...
spec:
hosts:
- reviews
http:
- match:
- headers:
end-user:
exact: jason
route:
- destination:
host: reviews
subset: v2
- route:
- destination:
host: reviews
subset: v1
$ kubectl apply -f - <<EOF
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: reviews
spec:
parentRefs:
- group: ""
kind: Service
name: reviews
port: 9080
rules:
- matches:
- headers:
- name: end-user
value: jason
backendRefs:
- name: reviews-v2
port: 9080
- backendRefs:
- name: reviews-v1
port: 9080
EOF
Bookinfoアプリの
/productpage
で、ユーザーjason
としてログインします。ブラウザを更新します。何が表示されますか?星評価が各レビューの横に表示されます。
別のユーザーとしてログインします(任意の名前を選択します)。
ブラウザを更新します。 अब तारे गायब हो गए हैं. これは、Jason以外のすべてのユーザーのトラフィックが
reviews:v1
にルーティングされるためです。
ユーザーIDに基づいてトラフィックをルーティングするようにIstioを正常に設定しました。
何が起こったのかを理解する
このタスクでは、Istioを使用して、トラフィックの100%を各Bookinfoサービスのv1
バージョンに送信しました。次に、productpage
サービスによってリクエストに追加されたカスタムend-user
ヘッダーに基づいて、reviews
サービスのバージョンv2
にトラフィックを選択的に送信するルールを設定しました。
このタスクで使用されているBookinfoなどのKubernetesサービスは、IstioのL7ルーティング機能を利用するために、特定の制限事項を遵守する必要があることに注意してください。詳細については、ポッドとサービスの要件を参照してください。
トラフィックシフトタスクでは、ここで学習したのと同じ基本パターンに従って、サービスのあるバージョンから別のバージョンに徐々にトラフィックを送信するルートルールを設定します。
クリーンアップ
- アプリケーションルートルールを削除します。
$ kubectl delete -f @samples/bookinfo/networking/virtual-service-all-v1.yaml@
$ kubectl delete httproute reviews
- フォローアップタスクを実行する予定がない場合は、Bookinfoクリーンアップの手順を参照して、アプリケーションをシャットダウンしてください。