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とサンプルテストアプリケーションを削除するには、アンビエントモードのアンインストールガイドに従ってください。

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

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