WebAssembly 模組的提取策略
WasmPlugin API 提供了一種將 Wasm 模組分發到代理的方法。由於每個代理都會從遠端登錄檔或 HTTP 伺服器提取 Wasm 模組,因此了解 Istio 如何選擇提取模組在可用性和效能方面都很重要。
映像檔提取策略和例外情況
類似於 Kubernetes 的 ImagePullPolicy
,WasmPlugin 也具有 IfNotPresent
和 Always
的概念,這分別表示「使用快取的模組」和「始終提取模組,無論快取為何」。
使用者使用 ImagePullPolicy
欄位明確配置 Wasm 模組擷取的行為。但是,在以下情況下,Istio 可以覆寫使用者提供的行為
- 如果使用者在 WasmPlugin 中設定
sha256
,無論ImagePullPolicy
為何,都會使用IfNotPresent
策略。 - 如果
url
欄位指向 OCI 映像檔,且具有摘要後綴 (例如,gcr.io/foo/bar@sha256:0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef
),則會使用IfNotPresent
策略。
當資源未指定 ImagePullPolicy
時,Istio 預設會使用 IfNotPresent
行為。但是,如果提供的 url
欄位指定一個標籤值為 latest
的 OCI 映像檔,Istio 將使用 Always
行為。
快取模組的生命週期
每個代理 (無論是 sidecar 代理還是閘道) 都會快取 Wasm 模組。因此,快取的 Wasm 模組的生命週期受限於相應 Pod 的生命週期。此外,還有一個到期機制,用於盡量減少代理記憶體的佔用:如果快取的 Wasm 模組在一段時間內未使用,則會清除該模組。
此到期時間可以透過 pilot-proxy 的環境變數 WASM_MODULE_EXPIRY
和 WASM_PURGE_INTERVAL
進行配置,它們分別表示到期時間長度和檢查到期時間的間隔。
“Always” 的含義
在 Kubernetes 中,ImagePullPolicy: Always
表示每次建立 Pod 時,都會直接從其來源提取映像檔。每次啟動新的 Pod 時,Kubernetes 都會重新提取映像檔。
對於 WasmPlugin
,ImagePullPolicy: Always
表示 Istio 每次建立或變更對應的 WasmPlugin
Kubernetes 資源時,都會直接從其來源提取映像檔。請注意,不僅 spec
中的變更,metadata
中的變更也會在使用 Always
策略時觸發 Wasm 模組的提取。這可能意味著在 Pod 的生命週期內,甚至在單個代理的生命週期內,映像檔可能會從來源提取多次。