WasmPlugins API 提供了一种机制,可以通过 WebAssembly 过滤器扩展 Istio 代理提供功能。
您可以部署多个 WasmPlugin。phase
和priority
设置确定执行顺序(作为 Envoy 的过滤器链的一部分),允许配置用户提供的 WasmPlugin 和 Istio 的内部过滤器之间复杂的交互。
在下面的例子中,一个身份验证过滤器实现了一个OpenID流程,并用JSON Web Token (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等脚本语言中,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