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 プロキシによって提供される機能を拡張するメカニズムを提供します。

フィールドタイプ説明必須
セレクターWorkloadSelector

このプラグイン設定を適用する特定のPod/VMセットを選択するために使用される基準。省略した場合、この設定は同じ名前空間内のすべてのワークロードインスタンスに適用されます。 WasmPlugin が設定ルート名前空間に存在する場合、任意の名前空間内のすべての該当するワークロードに適用されます。

特定のポリシーに対して、selector または targetRefs のいずれか1つだけを設定できます。

いいえ
targetRefsPolicyTargetReference[]

オプション。 targetRefs は、ポリシーを適用するリソースのリストを指定します。指定されたターゲットリソースは、ポリシーが適用されるワークロードを決定します。

現在、以下のリソース添付タイプがサポートされています。

  • 同じ名前空間内の group: gateway.networking.k8s.io を持つ kind: Gateway
  • 同じ名前空間内の group: "" または group: "core" を持つ kind: Service。このタイプはウェイポイントに対してのみサポートされています。

設定されていない場合、ポリシーはセレクターで定義されているとおりに適用されます。セレクターと targetRefs のいずれか1つだけを設定できます。

注:Istio バージョン 1.22 より前のマルチリビジョン環境で targetRefs フィールドを使用している場合は、istio.io/rev ラベルを使用してポリシーを 1.22 以降を実行しているリビジョンに固定することを強くお勧めします。これは、アップグレードプロセス中に、(targetRefs フィールドを認識していない)古いコントロールプレーンに接続されたプロキシが、ポリシーを名前空間全体として誤って解釈するのを防ぐためです。

注:ウェイポイントプロキシは、ポリシーを適用するためにこのフィールドを使用する必要があります。 selector ポリシーは無視されます。

いいえ
urlstring

Wasm モジュールまたは OCI コンテナの URL。スキームが存在しない場合、デフォルトは oci:// で、OCI イメージを参照します。その他の有効なスキームは、プロキシコンテナ内にローカルに存在する .wasm モジュールファイルを参照するための file://、およびリモートでホストされている .wasm モジュールファイルを参照するための http[s]:// です。

はい
sha256string

Wasm モジュールまたは OCI コンテナの検証に使用される SHA256 チェックサム。 url フィールドが既に SHA256 を参照している場合(@sha256: 表記を使用)、このフィールドの値と一致する必要があります。OCI イメージがタグによって参照され、このフィールドが設定されている場合、プル後にチェックサムがこのフィールドの内容と照合されます。

いいえ
imagePullPolicyPullPolicy

OCI イメージまたは http/https によって Wasm モジュールを取得する際に適用されるプル動作。OCI イメージ URL または vm_configsha256 フィールドを含む、ダイジェストなしで Wasm モジュールを参照する場合にのみ関連します。デフォルトは IfNotPresent です。ただし、url で OCI イメージが参照され、latest タグが使用されている場合は、Kubernetes の動作を反映して Always がデフォルトになります。

いいえ
imagePullSecretstring

OCI イメージのプルに使用する資格情報。 WasmPlugin と同じ名前空間にある Kubernetes Secret の名前。これには、イメージをプルするときにレジストリに対して認証するために使用される Docker プルシークレットが含まれています。

いいえ
pluginConfig構造体

プラグインに渡される設定。

いいえ
pluginNamestring

Envoy 設定で使用されるプラグイン名(以前は rootID と呼ばれていました)。一部の .wasm モジュールは、実行する Wasm プラグインを選択するためにこの値を必要とする場合があります。

いいえ
phasePluginPhase

フィルターチェーン内のどこにこの WasmPlugin を挿入するかを決定します。

いいえ
priorityInt32Value

同じ phase 内の WasmPlugins の順序を決定します。複数の WasmPlugins が同じワークロードの同じ phase に適用される場合、優先順位の高い順に適用されます。 priority が設定されていない場合、または同じ値を持つ 2 つの WasmPlugins が存在する場合、順序は WasmPlugins の名前と名前空間から決定論的に導出されます。デフォルトは 0 です。

いいえ
failStrategyFailStrategy

致命的なエラーによるプラグインの障害動作を指定します。

いいえ
vmConfigVmConfig

Wasm VM の設定。詳細はこちらを参照してください。

いいえ
matchTrafficSelector[]

WasmPlugin に渡されるトラフィックを決定するための基準を指定します。トラフィックが TrafficSelectors のいずれかを満たす場合、トラフィックは WasmPlugin を通過します。

いいえ
typePluginType

使用する Wasm 拡張のタイプを指定します。

いいえ

VmConfig

Wasm VM の設定。詳細はこちらを参照してください。

フィールドタイプ説明必須
envEnvVar[]

この VM に挿入する環境変数を指定します。キーが存在しない場合は無視されます。

いいえ

EnvVar

フィールドタイプ説明必須
namestring

環境変数の名前。C_IDENTIFIER である必要があります。

はい
valueFromEnvValueSource

環境変数の値のソース。

いいえ
valuestring

環境変数の値。 valueFromHOST の場合にのみ適用可能です。デフォルトは "" です。

いいえ

WasmPlugin.TrafficSelector

TrafficSelector は、この Wasm プラグインが有効になる特定のトラフィックフローを選択するメカニズムを提供します。 TrafficSelector のすべてのサブ条件が満たされると、トラフィックが選択されます。

フィールドタイプ説明必須
modeWorkloadMode

方向によってトラフィックを選択するための基準。 CLIENTSERVER は、それぞれ OUTBOUND と INBOUND に類似しています。ゲートウェイの場合、フィールドは CLIENT または CLIENT_AND_SERVER である必要があります。指定しない場合、デフォルト値は CLIENT_AND_SERVER です。

いいえ
portsPortSelector[]

宛先ポートによってトラフィックを選択するための基準。具体的には、送信トラフィックの場合、宛先ポートはターゲットサービスのポートになります。一方、受信トラフィックの場合、宛先ポートは同じ Pod 内のサーバープロセスによってバインドされたポートです。

指定された ports のいずれかが一致する場合、この条件は true と評価されます。指定しない場合、この条件は任意のポートに対して true と評価されます。

いいえ

PluginType

PluginType は、使用する Wasm 拡張のタイプを示します。拡張には、HTTPNETWORK の 2 つのタイプがあります。

HTTP 拡張はレイヤー 7 で機能します(たとえば、Envoy の HTTP フィルターとして)。詳細な HTTP インターフェースは、こちらにあります。

NETWORK 拡張はレイヤー 4 で機能します(たとえば、Envoy のネットワークフィルターとして)。詳細な NETWORK インターフェースは、こちらにあります。

NETWORK 拡張は HTTP トラフィックにも適用できます。

名前説明
UNSPECIFIED_PLUGIN_TYPE

デフォルトは HTTP です。

HTTP

HTTP Wasm 拡張を使用します。

NETWORK

ネットワーク Wasm 拡張を使用します。

PluginPhase

フィルターチェーン内のプラグインが挿入されるフェーズ。

名前説明
UNSPECIFIED_PHASE

コントロールプレーンは、プラグインを挿入する場所を決定します。これは一般に、フィルターチェーンの最後、ルーターの直前になります。プラグインが他のプラグインから独立している場合は、PluginPhase を指定しないでください。

AUTHN

Istio 認証フィルターの前にプラグインを挿入します。

AUTHZ

Istio 認証フィルターの後、Istio 認可フィルターの前にプラグインを挿入します。

STATS

Istio 認可フィルターの後、Istio 統計フィルターの前にプラグインを挿入します。

PullPolicy

Wam モジュールを取得する際に適用されるプル動作。K8s の動作を反映します。

名前説明
UNSPECIFIED_POLICY

デフォルトは IfNotPresent です。ただし、タグ latest を持つ OCI イメージの場合は、デフォルトは Always になります。

IfNotPresent

イメージの既存バージョンが以前にプルされている場合、それが使用されます。イメージのバージョンがローカルに存在しない場合、最新バージョンをプルします。

Always

このプラグインを変更すると、常にイメージの最新バージョンをプルします。変更には metadata フィールドも含まれることに注意してください。

EnvValueSource

名前説明
INLINE

この VM に挿入される明示的に指定されたキーと値のペア。

HOST

この VM に公開されている *Istio-proxy* の環境変数。

FailStrategy

名前説明
FAIL_CLOSE

バイナリフェッチ中またはプラグイン実行中の致命的なエラーにより、後続のすべてのリクエストが 5xx で失敗します。

FAIL_OPEN

Wasm プラグインの致命的なエラーに対してフェイルオープン動作を有効にして、プラグインの実行をバイパスします。致命的なエラーとは、リモートバイナリのフェッチの失敗、例外、または VM での abort() です。このフラグは、認証プラグインまたは認可プラグインには推奨されません。

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

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