WebAssemblyプラグインによるウェイポイントの拡張

Istioは、WebAssembly(Wasm)を使用して機能を拡張する機能を提供します。Wasm拡張性の主な利点の1つは、拡張機能をランタイム時に動的にロードできることです。このドキュメントでは、Istio内のアンビエントモードをWasm機能で拡張する方法の概要を説明します。アンビエントモードでは、Wasm構成は各名前空間にデプロイされたウェイポイントプロキシに適用する必要があります。

始める前に

  1. アンビエントモードの入門ガイドの手順に従ってIstioを設定します。

  2. Bookinfoサンプルアプリケーションをデプロイします。

  3. デフォルトの名前空間をアンビエントメッシュに追加します。.

  4. リクエストを送信するためのテストソースとして、curlサンプルアプリをデプロイします。

    Zip
    $ kubectl apply -f samples/curl/curl.yaml

ゲートウェイにて

Kubernetes Gateway APIを使用すると、Istioはサービスメッシュへのトラフィックを管理するための集中エントリポイントを提供します。ゲートウェイレベルでWasmPluginを構成し、ゲートウェイを通過するすべてのトラフィックが拡張された認証ルールに従うようにします。

ゲートウェイ用のWebAssemblyプラグインの構成

この例では、HTTP Basic認証モジュールをメッシュに追加します。IstioがリモートのイメージレジストリからBasic認証モジュールをプルしてロードするように構成します。このモジュールは/productpageへの呼び出しで実行されるように構成されます。これらの手順は、WebAssemblyモジュールの配布の手順と似ていますが、ラベルセレクターの代わりにtargetRefsフィールドを使用する点が異なります。

リモートWasmモジュールでWebAssemblyフィルターを構成するには、bookinfo-gatewayをターゲットとするWasmPluginリソースを作成します。

$ kubectl get gateway
NAME CLASS ADDRESS PROGRAMMED AGE bookinfo-gateway istio bookinfo-gateway-istio.default.svc.cluster.local True 42m
$ kubectl apply -f - <<EOF apiVersion: extensions.istio.io/v1alpha1 kind: WasmPlugin metadata: name: basic-auth-at-gateway spec: targetRefs: - kind: Gateway group: gateway.networking.k8s.io name: bookinfo-gateway # gateway name retrieved from previous step url: oci://ghcr.io/istio-ecosystem/wasm-extensions/basic_auth:1.12.0 phase: AUTHN pluginConfig: basic_auth_rules: - prefix: "/productpage" request_methods: - "GET" - "POST" credentials: - "ok:test" - "YWRtaW4zOmFkbWluMw==" EOF

HTTPフィルターは、認証フィルターとしてゲートウェイに挿入されます。Istioエージェントは、WasmPlugin構成を解釈し、リモートのWasmモジュールをOCIイメージレジストリからローカルファイルにダウンロードし、そのファイルを参照してHTTPフィルターをゲートウェイに挿入します。

ゲートウェイ経由のトラフィックの検証

  1. 認証情報なしで/productpageをテストします。

    $ kubectl exec deploy/curl -- curl -s -w "%{http_code}" -o /dev/null "http://bookinfo-gateway-istio.default.svc.cluster.local/productpage"
    401
  2. WasmPluginリソースで構成された認証情報を使用して/productpageをテストします。

    $ kubectl exec deploy/curl -- curl -s -o /dev/null -H "Authorization: Basic YWRtaW4zOmFkbWluMw==" -w "%{http_code}" "http://bookinfo-gateway-istio.default.svc.cluster.local/productpage"
    200

名前空間内のすべてのサービスに対するウェイポイントにて

ウェイポイントプロキシは、Istioのアンビエントモードにおいて、サービスメッシュ内での安全かつ効率的な通信を促進する上で重要な役割を果たします。以下では、Wasm構成をウェイポイントに適用し、プロキシの機能を動的に強化する方法について説明します。

ウェイポイントプロキシのデプロイ

ブックインフォ名前空間にウェイポイントプロキシをデプロイするには、ウェイポイントのデプロイ手順に従ってください。

$ istioctl waypoint apply --enroll-namespace --wait

トラフィックがサービスに到達することを確認します。

$ kubectl exec deploy/curl -- curl -s -w "%{http_code}" -o /dev/null http://productpage:9080/productpage
200

ウェイポイント用のWebAssemblyプラグインの構成

リモートWasmモジュールでWebAssemblyフィルターを構成するには、waypointゲートウェイをターゲットとするWasmPluginリソースを作成します。

$ kubectl get gateway
NAME CLASS ADDRESS PROGRAMMED AGE bookinfo-gateway istio bookinfo-gateway-istio.default.svc.cluster.local True 23h waypoint istio-waypoint 10.96.202.82 True 21h
$ kubectl apply -f - <<EOF apiVersion: extensions.istio.io/v1alpha1 kind: WasmPlugin metadata: name: basic-auth-at-waypoint spec: targetRefs: - kind: Gateway group: gateway.networking.k8s.io name: waypoint # gateway name retrieved from previous step url: oci://ghcr.io/istio-ecosystem/wasm-extensions/basic_auth:1.12.0 phase: AUTHN pluginConfig: basic_auth_rules: - prefix: "/productpage" request_methods: - "GET" - "POST" credentials: - "ok:test" - "YWRtaW4zOmFkbWluMw==" EOF

構成されたプラグインの表示

$ kubectl get wasmplugin
NAME AGE basic-auth-at-gateway 28m basic-auth-at-waypoint 14m

ウェイポイントプロキシ経由のトラフィックの検証

  1. 認証情報なしで内部の/productpageをテストします。

    $ kubectl exec deploy/curl -- curl -s -w "%{http_code}" -o /dev/null http://productpage:9080/productpage
    401
  2. 認証情報ありで内部の/productpageをテストします。

    $ kubectl exec deploy/curl -- curl -s -w "%{http_code}" -o /dev/null -H "Authorization: Basic YWRtaW4zOmFkbWluMw==" http://productpage:9080/productpage
    200

特定のサービスに対するウェイポイントにて

特定のサービスのリモートWasmモジュールでWebAssemblyフィルターを構成するには、特定のサービスを直接ターゲットとするWasmPluginリソースを作成します。

拡張機能がreviewsサービスのみに適用されるように、reviewsサービスをターゲットとするWasmPluginを作成します。この構成では、認証トークンとプレフィックスはレビューサービス専用に調整されており、そのサービスに向けられたリクエストのみがこの認証メカニズムの対象となるようにします。

$ kubectl apply -f - <<EOF apiVersion: extensions.istio.io/v1alpha1 kind: WasmPlugin metadata: name: basic-auth-for-service spec: targetRefs: - kind: Service group: "" name: reviews url: oci://ghcr.io/istio-ecosystem/wasm-extensions/basic_auth:1.12.0 phase: AUTHN pluginConfig: basic_auth_rules: - prefix: "/reviews" request_methods: - "GET" - "POST" credentials: - "ok:test" - "MXQtaW4zOmFkbWluMw==" EOF

サービスをターゲットとするトラフィックの検証

  1. 汎用的なwaypointプロキシで構成された認証情報を使用して、内部の/productpageをテストします。

    $ kubectl exec deploy/curl -- curl -s -w "%{http_code}" -o /dev/null -H "Authorization: Basic YWRtaW4zOmFkbWluMw==" http://productpage:9080/productpage
    200
  2. 特定のreviews-svc-waypointプロキシで構成された認証情報を使用して、内部の/reviewsをテストします。

    $ kubectl exec deploy/curl -- curl -s -w "%{http_code}" -o /dev/null -H "Authorization: Basic MXQtaW4zOmFkbWluMw==" http://reviews:9080/reviews/1
    200
  3. 認証情報なしで内部の/reviewsをテストします。

    $ kubectl exec deploy/curl -- curl -s -w "%{http_code}" -o /dev/null http://reviews:9080/reviews/1
    401

認証情報なしで指定されたコマンドを実行すると、内部の/productpageへのアクセスが401 Unauthorizedレスポンスになることを検証し、適切な認証情報なしでリソースへのアクセスに失敗するという期待される動作を示します。

クリーンアップ

  1. WasmPlugin構成を削除します。

    $ kubectl delete wasmplugin basic-auth-at-gateway basic-auth-at-waypoint basic-auth-for-service
  2. Istioとサンプルテストアプリケーションを削除するには、アンビエントモードのアンインストールガイドに従ってください。

この情報は役に立ちましたか?
改善のための提案はありますか?

フィードバックありがとうございます!