WasmPlugins API 提供了一种通过 WebAssembly 过滤器扩展 Istio 代理提供的功能的机制。
您可以部署多个 WasmPlugins。phase
和priority
设置决定执行顺序(作为 Envoy 的过滤器链的一部分),允许配置用户提供的 WasmPlugins 和 Istio 的内部过滤器之间的复杂交互。
在以下示例中,身份验证过滤器实现 OpenID 流程,并使用 JSON Web 令牌 (JWT) 填充授权标头。Istio 身份验证使用此令牌并将其部署到入口网关。WasmPlugin 文件位于代理 sidecar 文件系统中。请注意url
字段。
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) 镜像,而不是文件系统中的文件。请注意url
、imagePullPolicy
和imagePullSecret
字段。
apiVersion: extensions.istio.io/v1alpha1
kind: WasmPlugin
metadata:
name: openid-connect
namespace: istio-system
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
表 2. WasmPlugin 字段参考
字段 |
类型 |
描述 |
必需 |
|
|
用于选择应应用此插件配置的特定 Pod/VM 集的条件。如果省略,则此配置将应用于同一命名空间中的所有工作负载实例。如果WasmPlugin 字段存在于配置根命名空间中,则它将应用于任何命名空间中所有适用的工作负载。
|
|
|
|
Wasm 模块或 OCI 容器的 URL。如果不存在方案,则默认为oci:// ,引用 OCI 镜像。其他有效方案是file:// (引用代理容器中本地存在的 .wasm 模块文件)和http[s]:// (引用远程托管的 .wasm 模块文件)。
|
|
|
|
将用于验证 Wasm 模块或 OCI 容器的 SHA256 校验和。如果url 字段已引用 SHA256(使用@sha256: 表示法),则它必须与该字段的值匹配。如果通过标签引用 OCI 镜像并且设置了此字段,则在拉取后会将其校验和与该字段的内容进行验证。
|
|
|
|
获取 OCI 镜像时要应用的拉取行为。仅当通过标签而不是 SHA 引用镜像时才相关。默认为IfNotPresent ,除非url 字段中引用了 OCI 镜像并且使用了latest 标签,在这种情况下,值为Always 是默认值,镜像 K8s 行为。如果url 字段直接使用file:// 或http[s]:// 引用 Wasm 模块,则忽略设置。
|
|
|
|
用于 OCI 镜像拉取的凭据。与WasmPlugin 对象位于同一命名空间中的密钥名称,其中包含用于在拉取镜像时针对注册表进行身份验证的拉取密钥。
|
|
|
|
确定在过滤器链中的哪个位置注入此WasmPlugin 对象。
|
|
|
|
确定具有相同phase 值的WasmPlugins 对象的排序。当多个WasmPlugins 对象应用于同一阶段的同一工作负载时,它们将按优先级和降序应用。如果未设置priority 字段,或两个WasmPlugins 对象具有相同的值,则排序将由WasmPlugins 对象的名称和命名空间决定。默认为0 。
|
|
|
|
Envoy 配置中使用的插件名称。某些 Wasm 模块可能需要此值来选择要执行的 Wasm 插件。
|
|
|
|
|
|
spec.pluginConfig.verificationKey
|
|
用于验证已签名的 OCI 镜像或 Wasm 模块签名的公钥。必须以 PEM 格式提供。
|
|
WorkloadSelector
对象指定用于确定是否可以将过滤器应用于代理的条件。匹配条件包括与代理关联的元数据、工作负载实例信息(例如附加到 Pod/VM 的标签)或代理在初始握手期间向 Istio 提供的任何其他信息。如果指定了多个条件,则所有条件都必须匹配才能选择工作负载实例。目前,仅支持基于标签的选择机制。
表 3. WorkloadSelector
字段 |
类型 |
描述 |
必需 |
|
|
指示应应用策略的特定 Pod/VM 集的一个或多个标签。标签搜索范围仅限于资源所在的配置命名空间。
|
|
PullPolicy
对象指定了获取 OCI 镜像时要应用的拉取行为。
表 4. PullPolicy
值 |
描述 |
|
默认为 IfNotPresent ,但对于标签为 latest 的 OCI 镜像,默认值为 Always 。
|
|
如果之前已经拉取了该镜像的现有版本,则将使用该版本。如果本地不存在该镜像的任何版本,我们将拉取最新版本。
|
|
|
Struct
代表一个结构化数据值,由映射到动态类型值的字段组成。在某些语言中,Struct
可能由原生表示支持。例如,在 JavaScript 等脚本语言中,struct
表示为对象。
PluginPhase
指定插件将在过滤器链中的哪个阶段注入。
表 6. PluginPhase
字段 |
描述 |
|
控制平面决定插件的插入位置。这通常在过滤器链的末尾,就在路由器之前。如果插件与其他插件无关,则不要指定 PluginPhase。
|
|
|
|
在 Istio 授权过滤器之前,Istio 身份验证过滤器之后插入插件。
|
|
在 Istio 统计过滤器之前,Istio 授权过滤器之后插入插件。
|
部署 WasmPlugin
资源
您可以使用 WasmPlugin
资源启用 Red Hat OpenShift Service Mesh 扩展。在此示例中,istio-system
是 Service Mesh 控制平面项目的名称。以下示例创建了一个执行 OpenID Connect 流程以对用户进行身份验证的 openid-connect
过滤器。
步骤
-
创建以下示例资源
示例 plugin.yaml
apiVersion: extensions.istio.io/v1alpha1
kind: WasmPlugin
metadata:
name: openid-connect
namespace: istio-system
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
-
使用以下命令应用您的 plugin.yaml
文件
$ oc apply -f plugin.yaml