WebAssembly 模块拉取策略

WasmPlugin API 提供了一种方法来 分发 Wasm 模块 到代理。由于每个代理都将从远程注册表或 HTTP 服务器拉取 Wasm 模块,因此了解 Istio 如何选择拉取模块对于可用性和性能都至关重要。

镜像拉取策略和例外情况

类似于 Kubernetes 的 ImagePullPolicyWasmPlugin 也具有 IfNotPresentAlways 的概念,分别表示“使用缓存的模块”和“始终拉取模块,而不管缓存如何”。

用户使用 ImagePullPolicy 字段显式配置 Wasm 模块检索的行为。但是,在以下情况下,Istio 可以覆盖用户提供的行为

  1. 如果用户在 WasmPlugin 中设置了 sha256,则无论 ImagePullPolicy 如何,都使用 IfNotPresent 策略。
  2. 如果 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_EXPIRYWASM_PURGE_INTERVAL 进行配置,分别表示过期时长和检查过期时间的间隔。

“始终”的含义

在 Kubernetes 中,ImagePullPolicy: Always 表示每次创建 Pod 时都直接从源代码库拉取镜像。每次启动新的 Pod 时,Kubernetes 都会重新拉取镜像。

对于 WasmPluginImagePullPolicy: Always 表示 Istio 每次创建或更改相应的 WasmPlugin Kubernetes 资源时,都会直接从其源代码库拉取镜像。请注意,不仅 spec 中的更改,metadata 中的更改也会在使用 Always 策略时触发 Wasm 模块的拉取。这意味着在 Pod 的整个生命周期内,以及单个代理的整个生命周期内,可能会多次从源代码库拉取镜像。

这些信息是否有用?
您是否有任何改进建议?

感谢您的反馈!