1.19.3. WasmPlugin API 参考
WasmPlugins API 提供了通过 WebAssembly 过滤器扩展 Istio 代理提供的功能的机制。
您可以部署多个 WasmPlugins。phase
和 priority
设置决定了执行顺序(作为 Envoy 的过滤器链的一部分),允许对用户提供的 WasmPlugin 和 Istio 的内部过滤器配置复杂交互。
在以下示例中,身份验证过滤器实施 OpenID 流,并使用 JSON Web Token(JWT)填充 Authorization 标头。Istio 身份验证会消耗这个令牌,并将其部署到 ingress 网关。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
和 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
字段 | 类型 | 描述 | 必需 |
---|---|---|---|
spec.selector | WorkloadSelector |
用于选择应该应用此插件配置的特定 pod/VM 集合的条件。如果省略,此配置将应用于同一命名空间中的所有工作负载实例。如果 config root 命名空间中存在 | 否 |
spec.url | 字符串 |
Wasm 模块或 OCI 容器的 URL。如果没有方案,则默认为 | 否 |
spec.sha256 | 字符串 |
用于验证 Wasm 模块或 OCI 容器的 SHA256 checksum。如果 | 否 |
spec.imagePullPolicy | PullPolicy |
获取 OCI 镜像时要应用的拉取行为。只有在通过标签而不是 SHA 引用镜像时才相关。默认为 | 否 |
spec.imagePullSecret | 字符串 |
用于 OCI 镜像拉取的凭证。与 | 否 |
spec.phase | PluginPhase |
决定过滤器链中注入这个 | 否 |
spec.priority |
|
决定有同一 | 否 |
spec.pluginName | 字符串 | Envoy 配置中使用的插件名称。有些 Wasm 模块可能需要这个值来选择要执行的 Wasm 插件。 | 否 |
spec.pluginConfig | Struct | 将要传递给插件的配置。 | 否 |
spec.pluginConfig.verificationKey | 字符串 | 用于验证签名 OCI 镜像或 Wasm 模块的公钥。必须以 PEM 格式提供。 | 否 |
WorkloadSelector
对象指定用于确定过滤器是否可应用于代理的条件。匹配条件包括与代理关联的元数据、工作负载实例信息,如附加到 pod/VM 的标签,或代理在初始握手期间向 Istio 提供的任何其他信息。如果指定了多个条件,则所有条件都需要匹配才能选择工作负载实例。目前,只支持基于标签的选择机制。
字段 | 类型 | 描述 | 必需 |
---|---|---|---|
matchLabels | map<string, string> | 指定应应用策略的特定 pod/VM 集合的一个或多个标签。标签搜索范围仅限于存在资源的配置命名空间。 | 是 |
PullPolicy
对象指定要在获取 OCI 镜像时应用的 pull 行为。
值 | 描述 |
---|---|
<empty> |
默认值为 |
IfNotPresent | 如果在之前拉取了镜像的现有版本,则会使用它。如果本地没有镜像版本,我们将拉取最新版本。 |
Always | 在应用此插件时始终会拉取镜像的最新版本。 |
Struct
代表结构化数据值,由映射到动态输入的值的字段组成。在某些语言中,Struct 可能受到原生表示的支持。例如,在脚本语言中,JavaScript astruct 等脚本语言表示为对象。
字段 | 类型 | 描述 |
---|---|---|
fields | map<string, Value> | 动态输入的值的映射。 |
PluginPhase
指定将注入插件的过滤器链中的阶段。
字段 | 描述 |
---|---|
<empty> | control plane 决定插入插件的位置。这通常位于过滤器链的末尾,在路由器前面。如果插件独立于其他系统,则不要指定 PluginPhase。 |
AUTHN | 在 Istio 身份验证过滤器前插入插件。 |
AUTHZ | 在 Istio 授权过滤器和 Istio 身份验证过滤器后插入插件。 |
STATS | 在 Istio stats 过滤器和 Istio 授权过滤器后插入插件。 |
1.19.3.1. 部署 WasmPlugin
资源
您可以使用 WasmPlugin
资源启用 Red Hat OpenShift Service Mesh 扩展。在本例中,istio-system
是 Service Mesh control plane 项目的名称。以下示例创建了一个 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