Wasm 插件

WasmPlugins 提供了一種機制,可透過 WebAssembly 過濾器擴展 Istio 代理提供的功能。

執行順序(作為 Envoy 過濾器鏈的一部分)由階段和優先順序設定決定,允許在使用者提供的 WasmPlugins 和 Istio 內部過濾器之間設定複雜的互動。

範例

部署到入口閘道的 AuthN 過濾器,實作 OpenID 流程並使用 JWT 填入 Authorization 標頭,以供 Istio 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

這與上一個範例相同,但使用 VmConfig 設定 VM 中的環境變數。

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"

還有一個更複雜的範例,它部署了三個 WasmPlugin,並使用 phasepriority 對它們進行排序。 (假設性的) 設定是,openid-connect 過濾器執行 OpenID Connect 流程以驗證使用者身份,將簽署的 JWT 寫入請求的 Authorization 標頭中,而 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 代理提供的功能。

欄位類型描述必填
selectorWorkloadSelector

用於選擇應套用此外掛程式設定的特定 Pod/VM 集合的條件。如果省略,此設定將套用於相同命名空間中的所有工作負載實例。如果 WasmPlugin 存在於組態根命名空間中,它將套用於任何命名空間中所有適用的工作負載。

對於給定的原則,最多只能設定 selectortargetRefs 中的一個。

targetRefsPolicyTargetReference[]

選填。targetRefs 指定應套用原則的資源清單。指定的目標資源將決定原則套用至哪些工作負載。

目前,支援以下資源附件類型

  • 在相同命名空間中具有 group: gateway.networking.k8s.iokind: Gateway
  • 在相同命名空間中具有 group: ""group: "core"kind: Service。此類型僅適用於航點 (waypoints)。

如果未設定,則原則會按照選擇器定義的方式套用。最多只能設定選擇器和 targetRefs 中的一個。

注意:如果您在多修訂環境中使用 targetRefs 欄位,且 Istio 版本早於 1.22,強烈建議您透過 istio.io/rev 標籤將原則固定至執行 1.22+ 的修訂版本。這是為了防止連接到較舊控制平面的代理程式(不了解 targetRefs 欄位)在升級過程中將原則錯誤地解讀為命名空間範圍的原則。

注意:航點代理程式需要使用此欄位來套用原則;selector 原則將被忽略。

urlstring

Wasm 模組或 OCI 容器的 URL。如果沒有出現協定 (scheme),則預設為 oci://,參照 OCI 映像。其他有效的協定是 file://,用於參照代理程式容器內本機存在的 .wasm 模組檔案,以及 http[s]://,用於遠端託管的 .wasm 模組檔案。

sha256string

將用於驗證 Wasm 模組或 OCI 容器的 SHA256 校驗和。如果 url 欄位已參照 SHA256(使用 @sha256: 表示法),則它必須與此欄位的值相符。如果 OCI 映像是以標籤參照,並且已設定此欄位,則在提取後,將針對此欄位的內容驗證其校驗和。

imagePullPolicyPullPolicy

在透過 OCI 映像或 http/https 提取 Wasm 模組時要套用的提取行為。僅當參照沒有任何摘要 (digest) 的 Wasm 模組時才相關,包括 OCI 映像 URL 中的摘要或 vm_config 中的 sha256 欄位。預設值為 IfNotPresent,除非在 url 中參照 OCI 映像且使用 latest 標籤,在這種情況下,預設值為 Always,以反映 Kubernetes 的行為。

imagePullSecretstring

用於 OCI 映像提取的憑證。與 WasmPlugin 位於同一命名空間的 Kubernetes Secret 名稱,其中包含 Docker 提取 Secret,該 Secret 用於在提取映像時對登錄檔進行驗證。

pluginConfig結構

將傳遞給外掛程式的組態。

pluginNamestring

要在 Envoy 設定中使用的外掛程式名稱(以前稱為 rootID)。某些 .wasm 模組可能需要此值來選擇要執行的 Wasm 外掛程式。

phasePluginPhase

決定此 WasmPlugin 要注入到過濾器鏈中的位置。

priorityInt32Value

決定在相同 phaseWasmPlugin 的順序。當多個 WasmPlugin 以相同的 phase 套用於相同的工作負載時,它們將依優先順序以遞減順序套用。如果未設定 priority,或存在兩個具有相同值的 WasmPlugin,則順序將根據 WasmPlugin 的名稱和命名空間確定性地得出。預設值為 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。對於閘道,該欄位應為 CLIENTCLIENT_AND_SERVER。如果未指定,則預設值為 CLIENT_AND_SERVER

portsPortSelector[]

用於根據目的地埠選取流量的條件。更具體地說,對於輸出流量,目的地埠將是目標服務的埠。另一方面,對於輸入流量,目的地埠是同一 Pod 中伺服器程序綁定的埠。

如果符合給定的 ports 中的一個,則此條件評估為 true。如果未指定,則此條件針對任何埠評估為 true。

PluginType

PluginType 指示要使用的 Wasm 擴充類型。有兩種擴充類型:HTTPNETWORK

HTTP 擴充在第 7 層運作(例如,作為 Envoy 中的 HTTP 過濾器)。詳細的 HTTP 介面可在此處找到

NETWORK 擴充在第 4 層運作(例如,作為 Envoy 中的網路過濾器)。詳細的 NETWORK 介面可在此處找到

NETWORK 擴充也可以套用於 HTTP 流量。

名稱描述
UNSPECIFIED_PLUGIN_TYPE

預設為 HTTP。

HTTP

使用 HTTP Wasm 擴充。

NETWORK

使用網路 Wasm 擴充。

PluginPhase

外掛程式將注入的過濾器鏈中的階段。

名稱描述
UNSPECIFIED_PHASE

控制平面決定插入外掛程式的位置。這通常會在過濾器鏈的末端,緊接在 Router 之前。如果外掛程式與其他外掛程式無關,則不要指定 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()。不建議將此標誌用於驗證或授權外掛程式。

此資訊是否有用?
您是否有任何改進建議?

感謝您的回饋!