WebAssemblyプラグインによるウェイポイントの拡張
Istioは、WebAssembly(Wasm)を使用して機能を拡張する機能を提供します。Wasm拡張性の主な利点の1つは、拡張機能をランタイム時に動的にロードできることです。このドキュメントでは、Istio内のアンビエントモードをWasm機能で拡張する方法の概要を説明します。アンビエントモードでは、Wasm構成は各名前空間にデプロイされたウェイポイントプロキシに適用する必要があります。
始める前に
アンビエントモードの入門ガイドの手順に従ってIstioを設定します。
Bookinfoサンプルアプリケーションをデプロイします。
リクエストを送信するためのテストソースとして、curlサンプルアプリをデプロイします。
$ 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フィルターをゲートウェイに挿入します。
ゲートウェイ経由のトラフィックの検証
認証情報なしで
/productpage
をテストします。$ kubectl exec deploy/curl -- curl -s -w "%{http_code}" -o /dev/null "http://bookinfo-gateway-istio.default.svc.cluster.local/productpage" 401
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
ウェイポイントプロキシ経由のトラフィックの検証
認証情報なしで内部の
/productpage
をテストします。$ kubectl exec deploy/curl -- curl -s -w "%{http_code}" -o /dev/null http://productpage:9080/productpage 401
認証情報ありで内部の
/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
サービスをターゲットとするトラフィックの検証
汎用的な
waypoint
プロキシで構成された認証情報を使用して、内部の/productpage
をテストします。$ kubectl exec deploy/curl -- curl -s -w "%{http_code}" -o /dev/null -H "Authorization: Basic YWRtaW4zOmFkbWluMw==" http://productpage:9080/productpage 200
特定の
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
認証情報なしで内部の
/reviews
をテストします。$ kubectl exec deploy/curl -- curl -s -w "%{http_code}" -o /dev/null http://reviews:9080/reviews/1 401
認証情報なしで指定されたコマンドを実行すると、内部の/productpage
へのアクセスが401 Unauthorizedレスポンスになることを検証し、適切な認証情報なしでリソースへのアクセスに失敗するという期待される動作を示します。
クリーンアップ
WasmPlugin構成を削除します。
$ kubectl delete wasmplugin basic-auth-at-gateway basic-auth-at-waypoint basic-auth-for-service
Istioとサンプルテストアプリケーションを削除するには、アンビエントモードのアンインストールガイドに従ってください。