1.19. Extensions


Vous pouvez utiliser des extensions WebAssembly pour ajouter de nouvelles fonctionnalités directement dans les proxies Red Hat OpenShift Service Mesh. Cela vous permet de déplacer encore plus de fonctionnalités courantes hors de vos applications, et de les mettre en œuvre dans un langage unique qui se compile en bytecode WebAssembly.

Note

Les extensions WebAssembly ne sont pas prises en charge sur les systèmes IBM zSystems et IBM Power.

1.19.1. Vue d'ensemble des modules WebAssembly

Les modules WebAssembly peuvent être exécutés sur de nombreuses plates-formes, y compris les proxies, et disposent d'un large support linguistique, d'une exécution rapide et d'un modèle de sécurité "sandboxé" par défaut.

Les extensions Red Hat OpenShift Service Mesh sont des filtres HTTP Envoy, ce qui leur confère un large éventail de capacités :

  • Manipulation du corps et des en-têtes des demandes et des réponses.
  • Demandes HTTP hors bande adressées à des services qui ne se trouvent pas sur le chemin de la demande, tels que l'authentification ou la vérification de la politique.
  • Stockage de données sur le canal latéral et files d'attente pour que les filtres communiquent entre eux.
Note

Lors de la création de nouvelles extensions WebAssembly, utilisez l'API WasmPlugin. L'API ServiceMeshExtension était obsolète dans Red Hat OpenShift Service Mesh version 2.2 et a été supprimée dans Red Hat OpenShift Service Mesh version 2.3.

L'écriture d'une extension Red Hat OpenShift Service Mesh comporte deux parties :

  1. Vous devez écrire votre extension à l'aide d'un SDK qui expose l'API proxy-wasm et la compiler en un module WebAssembly.
  2. Vous devez ensuite placer le module dans un conteneur.

Langues prises en charge

Vous pouvez utiliser n'importe quel langage qui compile le bytecode WebAssembly pour écrire une extension Red Hat OpenShift Service Mesh, mais les langages suivants ont des SDK existants qui exposent l'API proxy-wasm afin qu'elle puisse être consommée directement.

Tableau 1.13. Langues prises en charge
LangueResponsable de la maintenanceRéférentiel

AssemblyScript

solo.io

solo-io/proxy-runtime

C

équipe proxy-wasm (Communauté Istio)

proxy-wasm/proxy-wasm-cpp-sdk

Aller

tetrate.io

tetratelabs/proxy-wasm-go-sdk

Rouille

équipe proxy-wasm (Communauté Istio)

proxy-wasm/proxy-wasm-rust-sdk

1.19.2. WasmPlugin format du conteneur

Istio prend en charge les images de l'Open Container Initiative (OCI) dans son mécanisme Wasm Plugin. Vous pouvez distribuer vos plugins Wasm en tant qu'image de conteneur et vous pouvez utiliser le champ spec.url pour faire référence à l'emplacement d'un registre de conteneurs. Par exemple, quay.io/my-username/my-plugin:latest.

Étant donné que chaque environnement d'exécution (runtime) d'un module WASM peut avoir des paramètres de configuration spécifiques au runtime, une image WASM peut être composée de deux couches :

  • plugin.wasm (Obligatoire) - Couche de contenu. Cette couche consiste en un binaire .wasm contenant le bytecode de votre module WebAssembly, qui sera chargé par le runtime. Vous devez nommer ce fichier plugin.wasm.
  • runtime-config.json (Facultatif) - Couche de configuration. Cette couche se compose d'une chaîne au format JSON qui décrit les métadonnées du module pour le système d'exécution cible. La couche de configuration peut également contenir des données supplémentaires, en fonction de l'environnement d'exécution cible. Par exemple, la configuration d'un filtre WASM Envoy contient les root_ids disponibles sur le filtre.

1.19.3. Référence API WasmPlugin

L'API WasmPlugins fournit un mécanisme pour étendre la fonctionnalité fournie par le proxy Istio à travers des filtres WebAssembly.

Vous pouvez déployer plusieurs WasmPlugins. Les paramètres phase et priority déterminent l'ordre d'exécution (dans le cadre de la chaîne de filtrage d'Envoy), ce qui permet de configurer des interactions complexes entre les WasmPlugins fournis par l'utilisateur et les filtres internes d'Istio.

Dans l'exemple suivant, un filtre d'authentification met en œuvre un flux OpenID et remplit l'en-tête Authorization avec un jeton Web JSON (JWT). L'authentification Istio consomme ce jeton et le déploie sur la passerelle d'entrée. Le fichier WasmPlugin se trouve dans le système de fichiers sidecar du proxy. Notez le champ 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

Voici le même exemple, mais cette fois-ci, une image OCI (Open Container Initiative) est utilisée à la place d'un fichier dans le système de fichiers. Notez les champs url, imagePullPolicy, et 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
Tableau 1.14. Référence du champ WasmPlugin
FieldTypeDescriptionExigée

spec.selector

Sélecteur de charge de travail

Critères utilisés pour sélectionner l'ensemble spécifique de pods/VMs sur lesquels cette configuration de plugin doit être appliquée. Si elle est omise, cette configuration sera appliquée à toutes les instances de charge de travail dans le même espace de noms. Si le champ WasmPlugin est présent dans l'espace de noms racine de la configuration, celle-ci sera appliquée à toutes les charges de travail applicables dans n'importe quel espace de noms.

Non

spec.url

chaîne de caractères

URL d'un module Wasm ou d'un conteneur OCI. Si aucun schéma n'est présent, la valeur par défaut est oci://, qui fait référence à une image OCI. Les autres schémas valables sont file:// pour les fichiers de modules .wasm présents localement dans le conteneur proxy, et http[s]:// pour les fichiers de modules .wasm hébergés à distance.

Non

spec.sha256

chaîne de caractères

Somme de contrôle SHA256 qui sera utilisée pour vérifier le module Wasm ou le conteneur OCI. Si le champ url fait déjà référence à un SHA256 (en utilisant la notation @sha256: ), il doit correspondre à la valeur de ce champ. Si une image OCI est référencée par une balise et que ce champ est défini, sa somme de contrôle sera vérifiée par rapport au contenu de ce champ après l'extraction.

Non

spec.imagePullPolicy

Politique d'attraction

Le comportement d'extraction à appliquer lors de la récupération d'une image OCI. Ne s'applique que lorsque les images sont référencées par un tag au lieu d'un SHA. La valeur par défaut est IfNotPresent, sauf si une image OCI est référencée dans le champ url et que la balise latest est utilisée, auquel cas la valeur Always est la valeur par défaut, reflétant le comportement de K8. Le paramètre est ignoré si le champ url fait référence à un module Wasm directement en utilisant file:// ou http[s]://.

Non

spec.imagePullSecret

chaîne de caractères

Informations d'identification à utiliser pour l'extraction d'images OCI. Le nom d'un secret dans le même espace de noms que l'objet WasmPlugin qui contient un secret d'extraction pour l'authentification contre le registre lors de l'extraction de l'image.

Non

spec.phase

PluginPhase

Détermine l'endroit de la chaîne de filtrage où cet objet WasmPlugin est injecté.

Non

spec.priority

int64

Détermine l'ordre des objets WasmPlugins qui ont la même valeur phase. Lorsque plusieurs objets WasmPlugins sont appliqués à la même charge de travail au cours de la même phase, ils sont appliqués par priorité et par ordre décroissant. Si le champ priority n'est pas défini ou si deux objets WasmPlugins ont la même valeur, l'ordre sera déterminé à partir du nom et de l'espace de noms des objets WasmPlugins. La valeur par défaut est 0.

Non

spec.pluginName

chaîne de caractères

Le nom du plugin utilisé dans la configuration d'Envoy. Certains modules Wasm peuvent avoir besoin de cette valeur pour sélectionner le plugin Wasm à exécuter.

Non

spec.pluginConfig

Structure

La configuration qui sera transmise au plugin.

Non

spec.pluginConfig.verificationKey

chaîne de caractères

Clé publique utilisée pour vérifier les signatures des images OCI ou des modules Wasm signés. Elle doit être fournie au format PEM.

Non

L'objet WorkloadSelector spécifie les critères utilisés pour déterminer si un filtre peut être appliqué à un proxy. Les critères de correspondance comprennent les métadonnées associées à un proxy, les informations sur l'instance de charge de travail telles que les étiquettes attachées au pod/VM, ou toute autre information que le proxy fournit à Istio au cours de l'échange initial. Si plusieurs conditions sont spécifiées, toutes les conditions doivent correspondre pour que l'instance de charge de travail soit sélectionnée. Actuellement, seul le mécanisme de sélection basé sur les étiquettes est pris en charge.

Tableau 1.15. Sélecteur de charge de travail
FieldTypeDescriptionExigée

matchLabels

map<chaîne, string>

Une ou plusieurs étiquettes qui indiquent un ensemble spécifique de pods/VMs sur lesquels une politique doit être appliquée. La portée de la recherche d'étiquettes est limitée à l'espace de noms de configuration dans lequel la ressource est présente.

Oui

L'objet PullPolicy spécifie le comportement de traction à appliquer lors de la récupération d'une image OCI.

Tableau 1.16. Politique d'attraction
ValeurDescription

<empty>

La valeur par défaut est IfNotPresent, sauf pour les images OCI avec l'étiquette latest, pour lesquelles la valeur par défaut est Always.

S'il n'est pas présent

Si une version existante de l'image a déjà été extraite, elle sera utilisée. Si aucune version de l'image n'est présente localement, nous utiliserons la version la plus récente.

Always

Utilisez toujours la dernière version d'une image lorsque vous utilisez ce plugin.

Struct représente une valeur de données structurée, composée de champs qui correspondent à des valeurs typées dynamiquement. Dans certains langages, les structures peuvent être représentées de manière native. Par exemple, dans les langages de script comme JavaScript, une structure est représentée comme un objet.

Tableau 1.17. Structure
FieldTypeDescription

champs

map<string, Value>

Carte de valeurs typées dynamiquement.

PluginPhase spécifie la phase de la chaîne de filtrage dans laquelle le plugin sera injecté.

Tableau 1.18. PluginPhase
FieldDescription

<empty>

Le plan de contrôle décide de l'endroit où insérer le plugin. Il se trouve généralement à la fin de la chaîne de filtrage, juste avant le routeur. Ne pas spécifier PluginPhase si le plugin est indépendant des autres.

AUTHN

Insérer le plugin avant les filtres d'authentification Istio.

AUTHZ

Insérer le plugin avant les filtres d'autorisation Istio et après les filtres d'authentification Istio.

STATS

Insérer le plugin avant les filtres de statistiques Istio et après les filtres d'autorisation Istio.

1.19.3.1. Déploiement des ressources WasmPlugin

Vous pouvez activer les extensions Red Hat OpenShift Service Mesh en utilisant la ressource WasmPlugin. Dans cet exemple, istio-system est le nom du projet de plan de contrôle Service Mesh. L'exemple suivant crée un filtre openid-connect qui exécute un flux OpenID Connect pour authentifier l'utilisateur.

Procédure

  1. Créez l'exemple de ressource suivant :

    Exemple 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

  2. Appliquez votre fichier plugin.yaml avec la commande suivante :

    $ oc apply -f plugin.yaml

1.19.4. ServiceMeshExtension format du conteneur

Vous devez avoir un fichier .wasm contenant le bytecode de votre module WebAssembly et un fichier manifest.yaml à la racine du système de fichiers du conteneur pour que votre image de conteneur soit une image d'extension valide.

Note

Lors de la création de nouvelles extensions WebAssembly, utilisez l'API WasmPlugin. L'API ServiceMeshExtension était obsolète dans Red Hat OpenShift Service Mesh version 2.2 et a été supprimée dans Red Hat OpenShift Service Mesh version 2.3.

manifest.yaml

schemaVersion: 1

name: <your-extension>
description: <description>
version: 1.0.0
phase: PreAuthZ
priority: 100
module: extension.wasm

Tableau 1.19. Référence de champ pour manifest.yml
FieldDescriptionExigée

schemaVersion

Utilisé pour la version du schéma du manifeste. Actuellement, la seule valeur possible est 1.

Ce champ est obligatoire.

nom

Le nom de votre extension.

Ce champ n'est qu'une métadonnée et est actuellement inutilisé.

description

La description de votre extension.

Ce champ n'est qu'une métadonnée et est actuellement inutilisé.

version

La version de votre extension.

Ce champ n'est qu'une métadonnée et est actuellement inutilisé.

phase

La phase d'exécution par défaut de votre extension.

Ce champ est obligatoire.

priorité

La priorité par défaut de votre extension.

Ce champ est obligatoire.

module

Le chemin relatif de la racine du système de fichiers du conteneur vers votre module WebAssembly.

Ce champ est obligatoire.

1.19.5. Référence de ServiceMeshExtension

L'API ServiceMeshExtension fournit un mécanisme permettant d'étendre les fonctionnalités fournies par le proxy Istio au moyen de filtres WebAssembly. L'écriture d'une extension WebAssembly comporte deux parties :

  1. Écrivez votre extension à l'aide d'un SDK qui expose l'API proxy-wasm et compilez-la dans un module WebAssembly.
  2. L'emballer dans un récipient.
Note

Lors de la création de nouvelles extensions WebAssembly, utilisez l'API WasmPlugin. L'API ServiceMeshExtension, qui était obsolète dans Red Hat OpenShift Service Mesh version 2.2, a été supprimée dans Red Hat OpenShift Service Mesh version 2.3.

Tableau 1.20. Référence de champ ServiceMeshExtension
FieldDescription

metadata.namespace

Le champ metadata.namespace d'une source ServiceMeshExtension a une sémantique particulière : s'il est égal à l'espace de nommage du plan de contrôle, l'extension sera appliquée à toutes les charges de travail du Service Mesh qui correspondent à sa valeur workloadSelector. Lorsqu'elle est déployée dans un autre espace de nommage du maillage, elle ne sera appliquée qu'aux charges de travail de ce même espace de nommage.

spec.workloadSelector

Le champ spec.workloadSelector a la même sémantique que le champ spec.selector de la ressource Istio Gateway. Il correspondra à une charge de travail en fonction de ses étiquettes Pod. Si aucune valeur workloadSelector n'est spécifiée, l'extension sera appliquée à toutes les charges de travail de l'espace de noms.

spec.config

Il s'agit d'un champ structuré qui sera transmis à l'extension, la sémantique dépendant de l'extension que vous déployez.

spec.image

Un URI d'image conteneur pointant vers l'image qui contient l'extension.

spec.phase

La phase détermine à quel endroit de la chaîne de filtrage l'extension est injectée, par rapport aux fonctionnalités existantes d'Istio telles que l'authentification, l'autorisation et la génération de métriques. Les valeurs valides sont : PreAuthN, PostAuthN, PreAuthZ, PostAuthZ, PreStats, PostStats. Ce champ prend par défaut la valeur définie dans le fichier manifest.yaml de l'extension, mais peut être remplacé par l'utilisateur.

spec.priority

Si plusieurs extensions ayant la même valeur spec.phase sont appliquées à la même instance de charge de travail, la valeur spec.priority détermine l'ordre d'exécution. Les extensions ayant une priorité plus élevée seront exécutées en premier. Cela permet de prendre en compte les extensions interdépendantes. Ce champ prend par défaut la valeur définie dans le fichier manifest.yaml de l'extension, mais peut être remplacé par l'utilisateur.

1.19.5.1. Déploiement des ressources ServiceMeshExtension

Vous pouvez activer les extensions Red Hat OpenShift Service Mesh en utilisant la ressource ServiceMeshExtension. Dans cet exemple, istio-system est le nom du projet de plan de contrôle Service Mesh.

Note

Lors de la création de nouvelles extensions WebAssembly, utilisez l'API WasmPlugin. L'API ServiceMeshExtension a été obsolète dans Red Hat OpenShift Service Mesh version 2.2 et supprimée dans Red Hat OpenShift Service Mesh version 2.3.

Pour un exemple complet qui a été construit en utilisant le SDK Rust, jetez un coup d'œil au header-append-filter. Il s'agit d'un simple filtre qui ajoute un ou plusieurs en-têtes aux réponses HTTP, avec leurs noms et valeurs extraits du champ config de l'extension. Vous trouverez un exemple de configuration dans l'extrait ci-dessous.

Procédure

  1. Créez l'exemple de ressource suivant :

    Exemple de ressource ServiceMeshExtension extension.yaml

    apiVersion: maistra.io/v1
    kind: ServiceMeshExtension
    metadata:
      name: header-append
      namespace: istio-system
    spec:
      workloadSelector:
        labels:
          app: httpbin
      config:
        first-header: some-value
        another-header: another-value
      image: quay.io/maistra-dev/header-append-filter:2.1
      phase: PostAuthZ
      priority: 100

  2. Appliquez votre fichier extension.yaml avec la commande suivante :

    $ oc apply -f <extension>.yaml

1.19.6. Migration des ressources ServiceMeshExtension vers WasmPlugin

L'API ServiceMeshExtension, qui était obsolète dans Red Hat OpenShift Service Mesh version 2.2, a été supprimée dans Red Hat OpenShift Service Mesh version 2.3. Si vous utilisez l'API ServiceMeshExtension, vous devez migrer vers l'API WasmPlugin pour continuer à utiliser vos extensions WebAssembly.

Les API sont très similaires. La migration se fait en deux étapes :

  1. Renommer votre fichier de plugin et mettre à jour l'emballage du module.
  2. Création d'une ressource WasmPlugin qui fait référence à l'image de conteneur mise à jour.

1.19.6.1. Modifications de l'API

La nouvelle API WasmPlugin est similaire à l'API ServiceMeshExtension, mais avec quelques différences, notamment en ce qui concerne les noms des champs :

Tableau 1.21. Changements de champ entre ServiceMeshExtensions et WasmPlugin
ServiceMeshExtensionWasmPlugin

spec.config

spec.pluginConfig

spec.workloadSelector

spec.selector

spec.image

spec.url

spec.phase valeurs valides : PreAuthN, PostAuthN, PreAuthZ, PostAuthZ, PreStats, PostStats

spec.phase valeurs valides : <empty>, AUTHN, AUTHZ, STATS

Voici un exemple de conversion d'une ressource ServiceMeshExtension en ressource WasmPlugin.

Ressource ServiceMeshExtension

apiVersion: maistra.io/v1
kind: ServiceMeshExtension
metadata:
  name: header-append
  namespace: istio-system
spec:
  workloadSelector:
    labels:
      app: httpbin
  config:
    first-header: some-value
    another-header: another-value
  image: quay.io/maistra-dev/header-append-filter:2.2
  phase: PostAuthZ
  priority: 100

Nouvelle ressource WasmPlugin équivalente au ServiceMeshExtension ci-dessus

apiVersion: extensions.istio.io/v1alpha1
kind: WasmPlugin
metadata:
  name: header-append
  namespace: istio-system
spec:
  selector:
    matchLabels:
      app: httpbin
  url: oci://quay.io/maistra-dev/header-append-filter:2.2
  phase: STATS
  pluginConfig:
    first-header: some-value
    another-header: another-value

1.19.6.2. Modifications du format de l'image du conteneur

Le nouveau format d'image du conteneur WasmPlugin est similaire à celui de ServiceMeshExtensions, avec les différences suivantes :

  • Le format de conteneur ServiceMeshExtension nécessite un fichier de métadonnées nommé manifest.yaml dans le répertoire racine du système de fichiers du conteneur. Le format de conteneur WasmPlugin ne nécessite pas de fichier manifest.yaml.
  • Le fichier .wasm (le plugin proprement dit), qui pouvait auparavant avoir n'importe quel nom de fichier, doit désormais être nommé plugin.wasm et se trouver dans le répertoire racine du système de fichiers du conteneur.

1.19.6.3. Migration vers les ressources WasmPlugin

Pour mettre à jour vos extensions WebAssembly de l'API ServiceMeshExtension à l'API WasmPlugin, vous devez renommer votre fichier de plugin.

Conditions préalables

  • ServiceMeshControlPlane est mis à niveau vers la version 2.2 ou une version ultérieure.

Procédure

  1. Mettez à jour l'image de votre conteneur. Si le plugin est déjà dans /plugin.wasm à l'intérieur du conteneur, passez à l'étape suivante. Si ce n'est pas le cas :

    1. Veillez à ce que le fichier du plugin soit nommé plugin.wasm. Vous devez nommer le fichier d'extension plugin.wasm.
    2. Assurez-vous que le fichier d'extension se trouve dans le répertoire racine (/). Vous devez stocker les fichiers d'extension à la racine du système de fichiers du conteneur...
    3. Reconstruisez votre image de conteneur et envoyez-la dans un registre de conteneurs.
  2. Supprimez la ressource ServiceMeshExtension et créez une ressource WasmPlugin qui fait référence à la nouvelle image de conteneur que vous avez créée.
Red Hat logoGithubRedditYoutubeTwitter

Apprendre

Essayez, achetez et vendez

Communautés

À propos de la documentation Red Hat

Nous aidons les utilisateurs de Red Hat à innover et à atteindre leurs objectifs grâce à nos produits et services avec un contenu auquel ils peuvent faire confiance.

Rendre l’open source plus inclusif

Red Hat s'engage à remplacer le langage problématique dans notre code, notre documentation et nos propriétés Web. Pour plus de détails, consultez leBlog Red Hat.

À propos de Red Hat

Nous proposons des solutions renforcées qui facilitent le travail des entreprises sur plusieurs plates-formes et environnements, du centre de données central à la périphérie du réseau.

© 2024 Red Hat, Inc.