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,並使用 phase
和 priority
對它們進行排序。 (假設性的) 設定是,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 代理提供的功能。
VmConfig
Wasm VM 的組態。更多詳細資訊可在此處找到:這裡。
EnvVar
WasmPlugin.TrafficSelector
TrafficSelector 提供了一種機制,用於選取要啟用此 Wasm 外掛程式的特定流量。當 TrafficSelector 中的所有子條件都滿足時,將選取流量。
PluginType
PluginType 指示要使用的 Wasm 擴充類型。有兩種擴充類型:HTTP
和 NETWORK
。
HTTP
擴充在第 7 層運作(例如,作為 Envoy 中的 HTTP 過濾器)。詳細的 HTTP 介面可在此處找到
NETWORK
擴充在第 4 層運作(例如,作為 Envoy 中的網路過濾器)。詳細的 NETWORK
介面可在此處找到
NETWORK
擴充也可以套用於 HTTP 流量。
名稱 | 描述 |
---|---|
UNSPECIFIED_PLUGIN_TYPE | 預設為 HTTP。 |
HTTP | 使用 HTTP Wasm 擴充。 |
NETWORK | 使用網路 Wasm 擴充。 |
PluginPhase
外掛程式將注入的過濾器鏈中的階段。
名稱 | 描述 |
---|---|
UNSPECIFIED_PHASE | 控制平面決定插入外掛程式的位置。這通常會在過濾器鏈的末端,緊接在 Router 之前。如果外掛程式與其他外掛程式無關,則不要指定 |
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()。不建議將此標誌用於驗證或授權外掛程式。 |