Wasm 插件

WasmPlugins 提供了一种机制,可以通过 WebAssembly 过滤器扩展 Istio 代理提供的功能。

执行顺序(作为 Envoy 过滤器链的一部分)由阶段和优先级设置决定,允许配置用户提供的 WasmPlugins 和 Istio 内部过滤器之间复杂的交互。

示例

部署到 ingress-gateway 的 AuthN 过滤器,它实现了一个 OpenID 流程,并使用 JWT 填充 Authorization 标头,供 Istio AuthN 使用。

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 镜像。

apiVersion: extensions.istio.io/v1alpha1
kind: WasmPlugin
metadata:
  name: openid-connect
  namespace: istio-ingress
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

这与上一个示例相同,但使用 VmConfig 在虚拟机中配置环境变量。

apiVersion: extensions.istio.io/v1alpha1
kind: WasmPlugin
metadata:
  name: openid-connect
  namespace: istio-ingress
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
  vmConfig:
    env:
    - name: POD_NAME
      valueFrom: HOST
    - name: TRUST_DOMAIN
      value: "cluster.local"

这也与上一个示例相同,但 Wasm 模块通过 https 拉取,并在每次更改此插件资源时更新。

apiVersion: extensions.istio.io/v1alpha1
kind: WasmPlugin
metadata:
  name: openid-connect
  namespace: istio-ingress
spec:
  selector:
    matchLabels:
      istio: ingressgateway
  url: https://private-bucket/filters/openid.wasm
  imagePullPolicy: Always
  phase: AUTHN
  pluginConfig:
    openid_server: authn
    openid_realm: ingress
  vmConfig:
    env:
    - name: POD_NAME
      valueFrom: HOST
    - name: TRUST_DOMAIN
      value: "cluster.local"

以及一个更复杂的示例,它部署了三个 WasmPlugins 并使用 phasepriority 对其排序。 (假设的)设置是 openid-connect 过滤器执行 OpenID Connect 流程来对用户进行身份验证,将签名的 JWT 写入请求的 Authorization 标头,Istio authn 插件可以验证该标头。然后,acl-check 插件启动,将 JWT 传递给策略服务器,该服务器依次响应一个签名的令牌,其中包含有关系统哪些文件和函数可用于先前经过身份验证的用户的信息。acl-check 过滤器将此令牌写入标头。最后,check-header 过滤器验证该标头中的令牌,并确保令牌的内容(允许的“函数”)与其插件配置匹配。

生成的过滤器链如下所示: -> openid-connect -> istio.authn -> acl-check -> check-header -> router

apiVersion: extensions.istio.io/v1alpha1
kind: WasmPlugin
metadata:
  name: openid-connect
  namespace: istio-ingress
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
apiVersion: extensions.istio.io/v1alpha1
kind: WasmPlugin
metadata:
  name: acl-check
  namespace: istio-ingress
spec:
  selector:
    matchLabels:
      istio: ingressgateway
  url: oci://private-registry:5000/acl-check/acl:latest
  imagePullPolicy: Always
  imagePullSecret: private-registry-pull-secret
  phase: AUTHZ
  priority: 1000
  pluginConfig:
    acl_server: some_server
    set_header: authz_complete
apiVersion: extensions.istio.io/v1alpha1
kind: WasmPlugin
metadata:
  name: check-header
  namespace: istio-ingress
spec:
  selector:
    matchLabels:
      istio: ingressgateway
  url: oci://private-registry:5000/check-header:latest
  imagePullPolicy: IfNotPresent
  imagePullSecret: private-registry-pull-secret
  phase: AUTHZ
  priority: 10
  pluginConfig:
    read_header: authz_complete
    verification_key: a89gAzxvls0JKAKIJSBnnvvvkIO
    function: read_data

WasmPlugin

WasmPlugins 提供了一种机制,可以通过 WebAssembly 过滤器扩展 Istio 代理提供的功能。

字段类型描述必填
selectorWorkloadSelector

用于选择应应用此插件配置的特定 Pod/VM 集的条件。如果省略,则此配置将应用于同一命名空间中的所有工作负载实例。如果 WasmPlugin 存在于配置根命名空间中,它将应用于任何命名空间中所有适用的工作负载。

对于给定的策略,最多只能设置 selectortargetRefs 中的一个。

targetRefsPolicyTargetReference[]

可选。targetRefs 指定策略应应用于的一系列资源列表。指定的目标资源将确定策略应用于哪些工作负载。

当前,支持以下资源附加类型

  • kind: Gateway 以及 group: gateway.networking.k8s.io 在同一命名空间中。
  • kind: Service 以及 group: ""group: "core" 在同一命名空间中。此类型仅支持路标。

如果未设置,则策略将按选择器定义应用。最多只能设置 selector 和 targetRefs 中的一个。

注意:如果您在 Istio 1.22 之前的多版本环境中使用 targetRefs 字段,强烈建议您通过 istio.io/rev 标签将策略固定到运行 1.22+ 的版本。这样做是为了防止连接到旧控制平面(不知道 targetRefs 字段)的代理在升级过程中将策略错误地解释为命名空间范围。

注意:路标代理需要使用此字段才能使策略生效;selector 策略将被忽略。

url字符串

Wasm 模块或 OCI 容器的 URL。如果不存在方案,则默认为 oci://,引用 OCI 镜像。其他有效方案是 file:// 用于引用代理容器本地存在的 .wasm 模块文件,以及 http[s]:// 用于远程托管的 .wasm 模块文件。

sha256字符串

将用于验证 Wasm 模块或 OCI 容器的 SHA256 校验和。如果 url 字段已引用 SHA256(使用 @sha256: 符号),则它必须与该字段的值匹配。如果通过标签引用 OCI 镜像并且设置了此字段,则在拉取后会根据此字段的内容验证其校验和。

imagePullPolicy拉取策略

通过 OCI 镜像或 http/https 获取 Wasm 模块时要应用的拉取行为。仅当引用未包含任何摘要的 Wasm 模块时才相关,包括 OCI 镜像 URL 中的摘要或 vm_config 中的 sha256 字段。默认为 IfNotPresent,但当 url 中引用 OCI 镜像且使用 latest 标签时除外,在这种情况下,默认为 Always,反映 Kubernetes 行为。

imagePullSecret字符串

用于 OCI 镜像拉取的凭据。与 WasmPlugin 位于同一命名空间中的 Kubernetes Secret 的名称,其中包含 Docker 拉取密钥,该密钥用于在拉取镜像时对注册表进行身份验证。

pluginConfig结构体

将传递给插件的配置。

pluginName字符串

在 Envoy 配置中使用的插件名称(以前称为 rootID)。某些 .wasm 模块可能需要此值来选择要执行的 Wasm 插件。

phase插件阶段

确定在此过滤器链的哪个位置注入此 WasmPlugin

priorityInt32Value

确定同一 phaseWasmPlugins 的排序。当多个 WasmPlugins 应用于同一工作负载的同一 phase 时,它们将按优先级(降序)应用。如果未设置 priority,或者两个 WasmPlugins 存在相同的值,则排序将从 WasmPlugins 的名称和命名空间确定性地派生。默认为 0

failStrategy失败策略

指定由于致命错误导致的插件的失败行为。

vmConfigVmConfig

Wasm VM 的配置。更多详细信息请参见 此处

matchTrafficSelector[]

指定确定哪些流量传递给 WasmPlugin 的条件。如果流量满足 TrafficSelectors 中的任何条件,则流量将通过 WasmPlugin。

typePluginType

指定要使用的 Wasm 扩展的类型。

VmConfig

Wasm VM 的配置。更多详细信息请参见 此处

字段类型描述必填
envEnvVar[]

指定要注入此 VM 的环境变量。请注意,如果密钥不存在,它将被忽略。

EnvVar

字段类型描述必填
name字符串

环境变量的名称。必须是 C_IDENTIFIER。

valueFrom环境变量源

环境变量值的来源。

value字符串

环境变量的值。仅当 valueFromHOST 时才适用。默认为“” 。

WasmPlugin.TrafficSelector

TrafficSelector 提供了一种机制来选择将为此 Wasm 插件启用的特定流量流。当 TrafficSelector 中的所有子条件都满足时,将选择流量。

字段类型描述必填
modeWorkloadMode

根据其方向选择流量的条件。请注意,CLIENTSERVER 分别类似于 OUTBOUND 和 INBOUND。对于网关,该字段应为 CLIENTCLIENT_AND_SERVER。如果未指定,则默认值为 CLIENT_AND_SERVER

portsPortSelector[]

根据其目标端口选择流量的条件。更具体地说,对于出站流量,目标端口将是目标服务的端口。另一方面,对于入站流量,目标端口是同一 Pod 中服务器进程绑定的端口。

如果给定的 ports 之一匹配,则此条件将评估为 true。如果未指定,则此条件将针对任何端口评估为 true。

PluginType

PluginType 指示要使用的 Wasm 扩展的类型。扩展有两种类型:HTTPNETWORK

HTTP 扩展在第 7 层工作(例如,作为 Envoy 中的 HTTP 过滤器)。详细的 HTTP 接口可以在这里找到

NETWORK 扩展在第 4 层工作(例如,作为 Envoy 中的网络过滤器)。详细的 NETWORK 接口可以在这里找到

NETWORK 扩展也可以应用于 HTTP 流量。

名称描述
UNSPECIFIED_PLUGIN_TYPE

默认为 HTTP。

HTTP

使用 HTTP Wasm 扩展。

NETWORK

使用网络 Wasm 扩展。

插件阶段

插件将在过滤器链中的哪个阶段注入。

名称描述
UNSPECIFIED_PHASE

控制平面决定在哪里插入插件。这通常在过滤器链的末尾,紧接在路由器之前。如果插件独立于其他插件,请不要指定 PluginPhase

AUTHN

在 Istio 身份验证过滤器之前插入插件。

AUTHZ

在 Istio 授权过滤器之前以及 Istio 身份验证过滤器之后插入插件。

STATS

在 Istio 统计信息过滤器之前以及 Istio 授权过滤器之后插入插件。

拉取策略

获取 Wam 模块时要应用的拉取行为,反映 K8s 行为。

名称描述
UNSPECIFIED_POLICY

默认为 IfNotPresent,但对于带有标签 latest 的 OCI 镜像除外,在这种情况下,默认为 Always

IfNotPresent

如果之前已拉取镜像的现有版本,则将使用该版本。如果本地不存在镜像的任何版本,我们将拉取最新版本。

Always

更改此插件时,我们将始终拉取镜像的最新版本。请注意,更改还包括 metadata 字段。

环境变量源

名称描述
INLINE

显式给出的键值对将注入此 VM

HOST

Istio-proxy 的环境变量暴露给此 VM。

失败策略

名称描述
FAIL_CLOSE

二进制文件获取过程中或插件执行期间的致命错误会导致所有后续请求都失败并返回 5xx。

FAIL_OPEN

为 Wasm 插件致命错误启用故障转移行为,以绕过插件执行。致命错误可能是无法获取远程二进制文件、异常或 VM 上的 abort()。此标志不推荐用于身份验证或授权插件。

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

感谢您的反馈!