|
| 1 | +//// |
| 2 | +This module included in the following assemblies: |
| 3 | +*service_mesh_/v2x/ossm-extensions.adoc |
| 4 | +//// |
| 5 | +:_content-type: REFERENCE |
| 6 | +[id="ossm-wasm-ref-wasmplugin_{context}"] |
| 7 | += WasmPlugin API reference |
| 8 | +
|
| 9 | +The WasmPlugins API provides a mechanism to extend the functionality provided by the Istio proxy through WebAssembly filters. |
| 10 | +
|
| 11 | +You can deploy multiple WasmPlugins. The `phase` and `priority` settings determine the order of execution (as part of Envoy's filter chain), allowing the configuration of complex interactions between user-supplied WasmPlugins and Istio’s internal filters. |
| 12 | +
|
| 13 | +In the following example, an authentication filter implements an OpenID flow and populates the Authorization header with a JSON Web Token (JWT). Istio authentication consumes this token and deployes it to the ingress gateway. The WasmPlugin file lives in the proxy sidecar filesystem. Note the field `url`. |
| 14 | +
|
| 15 | +[source,yaml] |
| 16 | +---- |
| 17 | +apiVersion: extensions.istio.io/v1alpha1 |
| 18 | +kind: WasmPlugin |
| 19 | +metadata: |
| 20 | + name: openid-connect |
| 21 | + namespace: istio-ingress |
| 22 | +spec: |
| 23 | + selector: |
| 24 | + matchLabels: |
| 25 | + istio: ingressgateway |
| 26 | + url: file:///opt/filters/openid.wasm |
| 27 | + sha256: 1ef0c9a92b0420cf25f7fe5d481b231464bc88f486ca3b9c83ed5cc21d2f6210 |
| 28 | + phase: AUTHN |
| 29 | + pluginConfig: |
| 30 | + openid_server: authn |
| 31 | + openid_realm: ingress |
| 32 | +---- |
| 33 | +
|
| 34 | +Below is the same example, but this time an Open Container Initiative (OCI) image is used instead of a file in the filesystem. Note the fields `url`, `imagePullPolicy`, and `imagePullSecret`. |
| 35 | +
|
| 36 | +[source,yaml] |
| 37 | +---- |
| 38 | +apiVersion: extensions.istio.io/v1alpha1 |
| 39 | +kind: WasmPlugin |
| 40 | +metadata: |
| 41 | + name: openid-connect |
| 42 | + namespace: istio-system |
| 43 | +spec: |
| 44 | + selector: |
| 45 | + matchLabels: |
| 46 | + istio: ingressgateway |
| 47 | + url: oci://private-registry:5000/openid-connect/openid:latest |
| 48 | + imagePullPolicy: IfNotPresent |
| 49 | + imagePullSecret: private-registry-pull-secret |
| 50 | + phase: AUTHN |
| 51 | + pluginConfig: |
| 52 | + openid_server: authn |
| 53 | + openid_realm: ingress |
| 54 | +---- |
| 55 | +
|
| 56 | +.WasmPlugin Field Reference |
| 57 | +[options="header"] |
| 58 | +[cols="a, a, a, a"] |
| 59 | +|=== |
| 60 | +| Field | Type | Description | Required |
| 61 | +
|
| 62 | +|spec.selector |
| 63 | +|WorkloadSelector |
| 64 | +|Criteria used to select the specific set of pods/VMs on which this plug-in configuration should be applied. If omitted, this configuration will be applied to all workload instances in the same namespace. If the `WasmPlugin` field is present in the config root namespace, it will be applied to all applicable workloads in any namespace. |
| 65 | +|No |
| 66 | +
|
| 67 | +|spec.url |
| 68 | +|string |
| 69 | +|URL of a Wasm module or OCI container. If no scheme is present, defaults to `oci://`, referencing an OCI image. Other valid schemes are `file://` for referencing .wasm module files present locally within the proxy container, and `http[s]://` for .wasm module files hosted remotely. |
| 70 | +|No |
| 71 | +
|
| 72 | +|spec.sha256 |
| 73 | +|string |
| 74 | +|SHA256 checksum that will be used to verify the Wasm module or OCI container. If the `url` field already references a SHA256 (using the `@sha256:` notation), it must match the value of this field. If an OCI image is referenced by tag and this field is set, its checksum will be verified against the contents of this field after pulling. |
| 75 | +|No |
| 76 | +
|
| 77 | +|spec.imagePullPolicy |
| 78 | +|PullPolicy |
| 79 | +|The pull behavior to be applied when fetching an OCI image. Only relevant when images are referenced by tag instead of SHA. Defaults to the value `IfNotPresent`, except when an OCI image is referenced in the `url` field and the `latest` tag is used, in which case the value `Always` is the default, mirroring K8s behavior. Setting is ignored if the `url` field is referencing a Wasm module directly using `file://` or `http[s]://`. |
| 80 | +|No |
| 81 | +
|
| 82 | +|spec.imagePullSecret |
| 83 | +|string |
| 84 | +|Credentials to use for OCI image pulling. The name of a secret in the same namespace as the `WasmPlugin` object that contains a pull secret for authenticating against the registry when pulling the image. |
| 85 | +|No |
| 86 | +
|
| 87 | +|spec.phase |
| 88 | +|PluginPhase |
| 89 | +|Determines where in the filter chain this `WasmPlugin` object is injected. |
| 90 | +|No |
| 91 | +
|
| 92 | +|spec.priority |
| 93 | +|`int64` |
| 94 | +|Determines the ordering of `WasmPlugins` objects that have the same `phase` value. When multiple `WasmPlugins` objects are applied to the same workload in the same phase, they will be applied by priority and in descending order. If the `priority` field is not set, or two `WasmPlugins` objects with the same value, the ordering will be determined from the name and namespace of the `WasmPlugins` objects. Defaults to the value `0`. |
| 95 | +|No |
| 96 | +
|
| 97 | +|spec.pluginName |
| 98 | +|string |
| 99 | +|The plug-in name used in the Envoy configuration. Some Wasm modules might require this value to select the Wasm plug-in to execute. |
| 100 | +|No |
| 101 | +
|
| 102 | +|spec.pluginConfig |
| 103 | +|Struct |
| 104 | +|The configuration that will be passed on to the plug-in. |
| 105 | +|No |
| 106 | +
|
| 107 | +|spec.pluginConfig.verificationKey |
| 108 | +|string |
| 109 | +|The public key used to verify signatures of signed OCI images or Wasm modules. Must be supplied in PEM format. |
| 110 | +|No |
| 111 | +|=== |
| 112 | +
|
| 113 | +The `WorkloadSelector` object specifies the criteria used to determine if a filter can be applied to a proxy. The matching criteria includes the metadata associated with a proxy, workload instance information such as labels attached to the pod/VM, or any other information that the proxy provides to Istio during the initial handshake. If multiple conditions are specified, all conditions need to match in order for the workload instance to be selected. Currently, only label based selection mechanism is supported. |
| 114 | +
|
| 115 | +.WorkloadSelector |
| 116 | +[options="header"] |
| 117 | +[cols="a, a, a, a"] |
| 118 | +|=== |
| 119 | +| Field | Type | Description | Required |
| 120 | +|matchLabels |
| 121 | +|map<string, string> |
| 122 | +|One or more labels that indicate a specific set of pods/VMs on which a policy should be applied. The scope of label search is restricted to the configuration namespace in which the resource is present. |
| 123 | +|Yes |
| 124 | +|=== |
| 125 | +
|
| 126 | +The `PullPolicy` object specifies the pull behavior to be applied when fetching an OCI image. |
| 127 | +
|
| 128 | +.PullPolicy |
| 129 | +[options="header"] |
| 130 | +[cols="a, a"] |
| 131 | +|=== |
| 132 | +| Value | Description |
| 133 | +|<empty> |
| 134 | +|Defaults to the value `IfNotPresent`, except for OCI images with tag latest, for which the default will be the value `Always`. |
| 135 | +
|
| 136 | +|IfNotPresent |
| 137 | +|If an existing version of the image has been pulled before, that will be used. If no version of the image is present locally, we will pull the latest version. |
| 138 | +
|
| 139 | +|Always |
| 140 | +|We will always pull the latest version of an image when applying this plugin. |
| 141 | +|=== |
| 142 | +
|
| 143 | +`Struct` represents a structured data value, consisting of fields which map to dynamically typed values. In some languages, Struct might be supported by a native representation. For example, in scripting languages like JavaScript a struct is represented as an object. |
| 144 | +
|
| 145 | +.Struct |
| 146 | +[options="header"] |
| 147 | +[cols="a, a, a"] |
| 148 | +|=== |
| 149 | +| Field | Type | Description |
| 150 | +|fields |
| 151 | +|map<string, Value> |
| 152 | +|Map of dynamically typed values. |
| 153 | +|=== |
| 154 | +
|
| 155 | +`PluginPhase` specifies the phase in the filter chain where the plugin will be injected. |
| 156 | +
|
| 157 | +.PluginPhase |
| 158 | +[options="header"] |
| 159 | +[cols="a, a"] |
| 160 | +|=== |
| 161 | +| Field | Description |
| 162 | +|<empty> |
| 163 | +|Control plane decides where to insert the plugin. This will generally be at the end of the filter chain, right before the Router. Do not specify PluginPhase if the plugin is independent of others. |
| 164 | +
|
| 165 | +|AUTHN |
| 166 | +|Insert plugin before Istio authentication filters. |
| 167 | +
|
| 168 | +|AUTHZ |
| 169 | +|Insert plugin before Istio authorization filters and after Istio authentication filters. |
| 170 | +
|
| 171 | +|STATS |
| 172 | +|Insert plugin before Istio stats filters and after Istio authorization filters. |
| 173 | +|=== |
0 commit comments