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
字段指定了一个 OCI 镜像,并且该镜像的标签值为 latest
,则 Istio 将使用 Always
行为。
缓存模块的生命周期
每个代理(无论是 Sidecar 代理还是网关)都会缓存 Wasm 模块。因此,缓存的 Wasm 模块的生命周期受相应 Pod 的生命周期的限制。此外,还有一种到期机制可以将代理的内存占用量降到最低:如果缓存的 Wasm 模块在一段时间内未使用,则会将其清除。
此过期时间可以通过 pilot-proxy 的环境变量 WASM_MODULE_EXPIRY
和 WASM_PURGE_INTERVAL
进行配置,分别表示过期时长和检查过期时间的间隔。
“始终”的含义
在 Kubernetes 中,ImagePullPolicy: Always
表示每次创建 Pod 时都直接从源代码库拉取镜像。每次启动新的 Pod 时,Kubernetes 都会重新拉取镜像。
对于 WasmPlugin
,ImagePullPolicy: Always
表示 Istio 每次创建或更改相应的 WasmPlugin
Kubernetes 资源时,都会直接从其源代码库拉取镜像。请注意,不仅 spec
中的更改,metadata
中的更改也会在使用 Always
策略时触发 Wasm 模块的拉取。这意味着在 Pod 的整个生命周期内,以及单个代理的整个生命周期内,可能会多次从源代码库拉取镜像。