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
以下是相同的示例,但这次使用 Open Container Initiative (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 等脚本语言中,结构体表示为对象。
PluginPhase
指定在过滤器链中注入插件的阶段。
表 6. PluginPhase
字段 |
描述 |
|
控制平面决定在哪里插入插件。这通常位于过滤器链的末尾,紧接在路由器之前。如果插件与其他插件无关,请不要指定 PluginPhase。
|
|
|
|
在 Istio 授权过滤器之前以及 Istio 身份验证过滤器之后插入插件。
|
|
在 Istio 统计过滤器之前以及 Istio 授权过滤器之后插入插件。
|
部署WasmPlugin
资源
您可以使用WasmPlugin
资源启用 Red Hat OpenShift Service Mesh 扩展。在此示例中,istio-system
是服务网格控制平面项目的名称。以下示例创建执行 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