Wasm プラグイン
WasmPlugins は、WebAssembly フィルターを通じて Istio プロキシによって提供される機能を拡張するメカニズムを提供します。
実行順序 (Envoy のフィルターチェーンの一部として) は、フェーズと優先順位の設定によって決定され、ユーザー提供の WasmPlugins と Istio の内部フィルター間の複雑な相互作用の設定を可能にします。
例
OpenIDフローを実装し、Istio AuthN が消費する JWT で `Authorization` ヘッダーを設定する、イングレスゲートウェイにデプロイされた AuthN フィルター。
apiVersion: extensions.istio.io/v1alpha1
kind: WasmPlugin
metadata:
name: openid-connect
namespace: istio-ingress
spec:
selector:
matchLabels:
istio: ingressgateway
url: file:///opt/filters/openid.wasm
sha256: 1ef0c9a92b0420cf25f7fe5d481b231464bc88f486ca3b9c83ed5cc21d2f6210
phase: AUTHN
pluginConfig:
openid_server: authn
openid_realm: ingress
これは最後の例と同じですが、OCIイメージを使用しています。
apiVersion: extensions.istio.io/v1alpha1
kind: WasmPlugin
metadata:
name: openid-connect
namespace: istio-ingress
spec:
selector:
matchLabels:
istio: ingressgateway
url: oci://private-registry:5000/openid-connect/openid:latest
imagePullPolicy: IfNotPresent
imagePullSecret: private-registry-pull-secret
phase: AUTHN
pluginConfig:
openid_server: authn
openid_realm: ingress
これは最後の例と同じですが、VM で環境変数を設定するために VmConfig を使用しています。
apiVersion: extensions.istio.io/v1alpha1
kind: WasmPlugin
metadata:
name: openid-connect
namespace: istio-ingress
spec:
selector:
matchLabels:
istio: ingressgateway
url: oci://private-registry:5000/openid-connect/openid:latest
imagePullPolicy: IfNotPresent
imagePullSecret: private-registry-pull-secret
phase: AUTHN
pluginConfig:
openid_server: authn
openid_realm: ingress
vmConfig:
env:
- name: POD_NAME
valueFrom: HOST
- name: TRUST_DOMAIN
value: "cluster.local"
これも最後の例と同じですが、Wasm モジュールは https 経由でプルされ、このプラグインリソースが変更されるたびに更新されます。
apiVersion: extensions.istio.io/v1alpha1
kind: WasmPlugin
metadata:
name: openid-connect
namespace: istio-ingress
spec:
selector:
matchLabels:
istio: ingressgateway
url: https://private-bucket/filters/openid.wasm
imagePullPolicy: Always
phase: AUTHN
pluginConfig:
openid_server: authn
openid_realm: ingress
vmConfig:
env:
- name: POD_NAME
valueFrom: HOST
- name: TRUST_DOMAIN
value: "cluster.local"
3 つの WasmPlugins をデプロイし、`phase` と `priority` を使用して順序付ける、より複雑な例。(仮説的な) セットアップでは、`openid-connect` フィルターは OpenID Connect フローを実行してユーザーを認証し、リクエストの Authorization ヘッダーに署名付き JWT を書き込みます。これは Istio authn プラグインによって検証できます。次に、`acl-check` プラグインが起動し、JWT をポリシーサーバーに渡します。ポリシーサーバーは、以前に認証されたユーザーがシステムのどのファイルと関数を使用できるかについての情報を含む署名付きトークンで応答します。 `acl-check` フィルターはこのトークンをヘッダーに書き込みます。最後に、`check-header` フィルターはヘッダー内のトークンを検証し、トークンの内容 (許可された「関数」) がプラグインの設定と一致することを確認します。
結果のフィルターチェーンは次のようになります。-> openid-connect -> istio.authn -> acl-check -> check-header -> router
apiVersion: extensions.istio.io/v1alpha1
kind: WasmPlugin
metadata:
name: openid-connect
namespace: istio-ingress
spec:
selector:
matchLabels:
istio: ingressgateway
url: oci://private-registry:5000/openid-connect/openid:latest
imagePullPolicy: IfNotPresent
imagePullSecret: private-registry-pull-secret
phase: AUTHN
pluginConfig:
openid_server: authn
openid_realm: ingress
apiVersion: extensions.istio.io/v1alpha1
kind: WasmPlugin
metadata:
name: acl-check
namespace: istio-ingress
spec:
selector:
matchLabels:
istio: ingressgateway
url: oci://private-registry:5000/acl-check/acl:latest
imagePullPolicy: Always
imagePullSecret: private-registry-pull-secret
phase: AUTHZ
priority: 1000
pluginConfig:
acl_server: some_server
set_header: authz_complete
apiVersion: extensions.istio.io/v1alpha1
kind: WasmPlugin
metadata:
name: check-header
namespace: istio-ingress
spec:
selector:
matchLabels:
istio: ingressgateway
url: oci://private-registry:5000/check-header:latest
imagePullPolicy: IfNotPresent
imagePullSecret: private-registry-pull-secret
phase: AUTHZ
priority: 10
pluginConfig:
read_header: authz_complete
verification_key: a89gAzxvls0JKAKIJSBnnvvvkIO
function: read_data
WasmPlugin
WasmPlugins は、WebAssembly フィルターを通じて Istio プロキシによって提供される機能を拡張するメカニズムを提供します。
VmConfig
Wasm VM の設定。詳細はこちらを参照してください。
EnvVar
WasmPlugin.TrafficSelector
TrafficSelector は、この Wasm プラグインが有効になる特定のトラフィックフローを選択するメカニズムを提供します。 TrafficSelector のすべてのサブ条件が満たされると、トラフィックが選択されます。
PluginType
PluginType は、使用する Wasm 拡張のタイプを示します。拡張には、HTTP
と NETWORK
の 2 つのタイプがあります。
HTTP
拡張はレイヤー 7 で機能します(たとえば、Envoy の HTTP フィルターとして)。詳細な HTTP インターフェースは、こちらにあります。
NETWORK
拡張はレイヤー 4 で機能します(たとえば、Envoy のネットワークフィルターとして)。詳細な NETWORK
インターフェースは、こちらにあります。
NETWORK
拡張は HTTP トラフィックにも適用できます。
名前 | 説明 |
---|---|
UNSPECIFIED_PLUGIN_TYPE | デフォルトは HTTP です。 |
HTTP | HTTP Wasm 拡張を使用します。 |
NETWORK | ネットワーク Wasm 拡張を使用します。 |
PluginPhase
フィルターチェーン内のプラグインが挿入されるフェーズ。
名前 | 説明 |
---|---|
UNSPECIFIED_PHASE | コントロールプレーンは、プラグインを挿入する場所を決定します。これは一般に、フィルターチェーンの最後、ルーターの直前になります。プラグインが他のプラグインから独立している場合は、 |
AUTHN | Istio 認証フィルターの前にプラグインを挿入します。 |
AUTHZ | Istio 認証フィルターの後、Istio 認可フィルターの前にプラグインを挿入します。 |
STATS | Istio 認可フィルターの後、Istio 統計フィルターの前にプラグインを挿入します。 |
PullPolicy
Wam モジュールを取得する際に適用されるプル動作。K8s の動作を反映します。
名前 | 説明 |
---|---|
UNSPECIFIED_POLICY | デフォルトは |
IfNotPresent | イメージの既存バージョンが以前にプルされている場合、それが使用されます。イメージのバージョンがローカルに存在しない場合、最新バージョンをプルします。 |
Always | このプラグインを変更すると、常にイメージの最新バージョンをプルします。変更には |
EnvValueSource
名前 | 説明 |
---|---|
INLINE | この VM に挿入される明示的に指定されたキーと値のペア。 |
HOST | この VM に公開されている *Istio-proxy* の環境変数。 |
FailStrategy
名前 | 説明 |
---|---|
FAIL_CLOSE | バイナリフェッチ中またはプラグイン実行中の致命的なエラーにより、後続のすべてのリクエストが 5xx で失敗します。 |
FAIL_OPEN | Wasm プラグインの致命的なエラーに対してフェイルオープン動作を有効にして、プラグインの実行をバイパスします。致命的なエラーとは、リモートバイナリのフェッチの失敗、例外、または VM での abort() です。このフラグは、認証プラグインまたは認可プラグインには推奨されません。 |