5.6. Définition des versions de service cluster (CSV)


La version de service de cluster (CSV), définie par un objet ClusterServiceVersion, est un manifeste YAML créé à partir des métadonnées de l’opérateur qui aide le gestionnaire de cycle de vie de l’opérateur (OLM) à exécuter l’opérateur dans un cluster. Ce sont les métadonnées qui accompagnent une image de conteneur d’opérateur, utilisée pour peupler les interfaces utilisateur avec des informations telles que son logo, sa description et sa version. C’est aussi une source d’informations techniques qui est nécessaire pour exécuter l’opérateur, comme les règles RBAC qu’il exige et de quelles ressources personnalisées (CR) il gère ou dépend.

Le SDK de l’opérateur comprend le générateur CSV pour générer un CSV pour le projet opérateur actuel, personnalisé à l’aide des informations contenues dans les manifestes YAML et les fichiers source de l’opérateur.

Important

La version prise en charge par Red Hat de l’outil Operator SDK CLI, y compris les outils d’échafaudage et de test connexes pour les projets Opérateur, est dépréciée et devrait être supprimée dans une future version de Red Hat OpenShift Service sur AWS. Le Red Hat fournira des corrections de bogues et une prise en charge de cette fonctionnalité pendant le cycle de vie de la version actuelle, mais cette fonctionnalité ne recevra plus d’améliorations et sera supprimée du futur service Red Hat OpenShift sur les versions AWS.

La version prise en charge par Red Hat du SDK de l’opérateur n’est pas recommandée pour la création de nouveaux projets d’opérateur. Les auteurs d’opérateurs avec des projets d’opérateur existants peuvent utiliser la version de l’outil Operator SDK CLI publié avec Red Hat OpenShift Service sur AWS 4 pour maintenir leurs projets et créer des versions d’opérateur ciblant de nouvelles versions de Red Hat OpenShift Service sur AWS.

Les images de base suivantes pour les projets d’opérateur ne sont pas dépréciées. Les fonctionnalités d’exécution et les API de configuration de ces images de base sont toujours prises en charge pour les corrections de bogues et pour l’adressage des CVE.

  • L’image de base pour les projets d’opérateurs basés sur Ansible
  • L’image de base pour les projets d’opérateur basé sur Helm

Afin d’obtenir de l’information sur la version non prise en charge et gérée par la communauté du SDK de l’opérateur, voir Operator SDK (Operator Framework).

La commande génératrice de CSV supprime la responsabilité des auteurs de l’opérateur ayant des connaissances approfondies en OLM afin que leur opérateur interagisse avec OLM ou publie des métadonnées dans le Registre de catalogue. De plus, étant donné que la spécification CSV changera probablement avec le temps à mesure que de nouvelles fonctionnalités Kubernetes et OLM seront mises en œuvre, le SDK de l’opérateur est équipé pour étendre facilement son système de mise à jour afin de gérer de nouvelles fonctionnalités CSV à l’avenir.

5.6.1. Comment fonctionne la génération de CSV

Les manifestes de paquets d’opérateurs, qui incluent des versions de service cluster (CSV), décrivent comment afficher, créer et gérer une application avec Operator Lifecycle Manager (OLM). Le générateur CSV dans le SDK de l’opérateur, appelé par la sous-commande de groupement génératrice, est la première étape vers la publication de votre opérateur dans un catalogue et le déployer avec OLM. La sous-commande nécessite certains manifestes d’entrée pour construire un manifeste CSV; toutes les entrées sont lues lorsque la commande est invoquée, avec une base CSV, pour générer ou régénérer idempotentement un CSV.

En règle générale, la sous-commande des manifestes de kustomize génératrice serait exécutée en premier pour générer les bases Kustomize d’entrée qui sont consommées par la sous-commande de paquets génératrices. Cependant, le SDK de l’opérateur fournit la commande make bundle, qui automatise plusieurs tâches, y compris l’exécution des sous-commandes suivantes dans l’ordre:

  1. générer des manifestes de kustomize
  2. générer des paquets
  3. la validation du paquet

5.6.1.1. Fichiers et ressources générés

La commande make bundle crée les fichiers et répertoires suivants dans votre projet Opérateur:

  • Le bundle manifeste un répertoire nommé bundle/manifests qui contient un objet ClusterServiceVersion (CSV)
  • Annuaire de métadonnées groupé nommé bundle/metadata
  • L’ensemble des définitions de ressources personnalisées (CRD) dans un répertoire config/crd
  • Dockerfile bundle.Dockerfile

Les ressources suivantes sont généralement incluses dans un CSV:

Le rôle
Définit les autorisations de l’opérateur dans un espace de noms.
ClusterRole
Définit les autorisations de l’opérateur à l’échelle du cluster.
Déploiement
Définit comment un Operand d’un opérateur est exécuté en pods.
CustomResourceDefinition (CRD)
Définit des ressources personnalisées que votre opérateur réconcilie.
Exemples de ressources personnalisées
Exemples de ressources adhérant à la spécification d’un CRD particulier.

5.6.1.2. Gestion des versions

L’indicateur --version pour la sous-commande de paquet génératrice fournit une version sémantique pour votre paquet lors de la création d’un pour la première fois et lors de la mise à niveau d’une version existante.

En définissant la variable VERSION dans votre Makefile, l’indicateur --version est automatiquement invoqué à l’aide de cette valeur lorsque la sous-commande de paquet généré est exécutée par la commande make bundle. La version CSV est la même que la version de l’opérateur, et un nouveau CSV est généré lors de la mise à niveau des versions de l’opérateur.

5.6.2. Champs CSV définis manuellement

De nombreux champs CSV ne peuvent pas être peuplés à l’aide de manifestes génériques générés qui ne sont pas spécifiques à l’opérateur SDK. Ces champs sont principalement des métadonnées écrites par l’homme sur l’opérateur et diverses définitions de ressources personnalisées (CRD).

Les auteurs de l’opérateur doivent modifier directement leur fichier YAML version de service de cluster (CSV) en ajoutant des données personnalisées aux champs requis suivants. Le SDK d’opérateur donne un avertissement lors de la génération de CSV lorsqu’un manque de données dans l’un des champs requis est détecté.

Les tableaux suivants détaillent les champs CSV définis manuellement et qui sont facultatifs.

Expand
Tableau 5.7. Champs CSV obligatoires
Le champDescription

les métadonnées.name

C’est un nom unique pour ce CSV. La version de l’opérateur doit être incluse dans le nom pour assurer l’unicité, par exemple app-operator.v0.1.1.

les métadonnées.capabilitys

Le niveau de capacité selon le modèle de maturité de l’opérateur. Les options incluent l’installation de base, les mises à niveau sans soudure, le cycle de vie complet, les informations approfondies et le pilote automatique.

caractéristiques Spéc.displayName

Le nom public permettant d’identifier l’opérateur.

description Spéc.description

Brève description de la fonctionnalité de l’opérateur.

caractéristiques de Sp.keywords

Les mots clés décrivant l’opérateur.

caractéristiques Sp.maintainers

Entités humaines ou organisationnelles qui maintiennent l’opérateur, avec un nom et un courriel.

fournisseur de Spécification

Le fournisseur de l’opérateur (généralement une organisation), avec un nom.

caractéristiques Sp.labels

Paires clés-valeur à utiliser par les internes de l’opérateur.

caractéristiques de Sp.version

La version sémantique de l’opérateur, par exemple 0.1.1.

définition des ressources de Spéc.custom

Les CRD que l’Opérateur utilise. Ce champ est rempli automatiquement par le SDK de l’opérateur si des fichiers YAML CRD sont présents dans le déploiement/. Cependant, plusieurs champs qui ne figurent pas dans la spécification du manifeste CRD nécessitent l’entrée de l’utilisateur:

  • description: description de la CRD.
  • les ressources: toutes les ressources Kubernetes mises à profit par le CRD, par exemple Pod et StatefulSet objets.
  • description des spécifications: Conseils d’interface utilisateur pour les entrées et les sorties de l’opérateur.
Expand
Tableau 5.8. Champs CSV optionnels
Le champDescription

caractéristiques Sp.replaces

Le nom du CSV étant remplacé par ce CSV.

liens Spéc.links

Les URL (par exemple, sites Web et documentation) relatives à l’opérateur ou à l’application gérée, chacune avec un nom et une url.

caractéristiques Spéc.selector

Les sélecteurs par lesquels l’opérateur peut associer des ressources dans un cluster.

le Spéc.icon

Icône encodée base64 unique à l’opérateur, définie dans un champ de données base64 avec un type média.

caractéristiques Sp.maturity

Le niveau de maturité que le logiciel a atteint à cette version. Les options comprennent la planification, pré-alpha, alpha, bêta, stable, mature, inactive et dépréciée.

De plus amples détails sur les données que chaque champ ci-dessus devrait contenir sont trouvés dans la spécification CSV.

Note

À l’heure actuelle, plusieurs champs YAML nécessitant une intervention de l’utilisateur peuvent potentiellement être analysés à partir du code opérateur.

5.6.3. Annotations de métadonnées de l’opérateur

Les développeurs d’opérateurs peuvent définir certaines annotations dans les métadonnées d’une version de service de cluster (CSV) pour activer des fonctionnalités ou mettre en évidence des fonctionnalités dans les interfaces utilisateur (UI), telles que OperatorHub ou Red Hat Ecosystem Catalog. Les annotations de métadonnées de l’opérateur sont définies manuellement en définissant le champ métadonnées.annotations dans le fichier CSV YAML.

5.6.3.1. L’infrastructure comporte des annotations

Les annotations dans le groupe features.operators.openshift.io détaillent les fonctionnalités d’infrastructure qu’un opérateur peut prendre en charge, spécifiées en définissant une valeur "vraie" ou "faux". Les utilisateurs peuvent visualiser et filtrer par ces fonctionnalités lors de la découverte des opérateurs via OperatorHub dans la console Web ou dans le catalogue de l’écosystème Red Hat. Ces annotations sont prises en charge dans Red Hat OpenShift Service sur AWS 4.10 et plus tard.

Important

L’infrastructure Feature.operators.openshift.io comporte des annotations déprécater les annotations.openshift.io/infrastructures utilisées dans les versions antérieures de Red Hat OpenShift Service sur AWS. Consultez « Annotations de fonctionnalités d’infrastructure dépréciée » pour plus d’informations.

Expand
Tableau 5.9. L’infrastructure comporte des annotations
AnnotationDescriptionLes valeurs valides[1]

Features.operators.openshift.io/déconnecté

Indiquez si un opérateur prend en charge la mise en miroir dans des catalogues déconnectés, y compris toutes les dépendances, et ne nécessite pas d’accès à Internet. L’opérateur utilise le champ spec.relatedImages CSV pour se référer à toute image liée par son digeste.

"vrai" ou "faux"

caractéristiques.operators.openshift.io/fips-compliant

Indiquez si un opérateur accepte la configuration FIPS-140 de la plate-forme sous-jacente et fonctionne sur des nœuds qui sont démarrés en mode FIPS. Dans ce mode, l’opérateur et toutes les charges de travail qu’il gère (opérateurs) appellent uniquement la bibliothèque cryptographique Red Hat Enterprise Linux (RHEL) soumise pour validation FIPS-140.

"vrai" ou "faux"

caractéristiques.operators.openshift.io/proxy-aware

Indiquez si un opérateur prend en charge l’exécution d’un cluster derrière un proxy en acceptant les variables d’environnement proxy HTTP_PROXY et HTTPS_PROXY standard. Le cas échéant, l’opérateur transmet ces informations à la charge de travail qu’il gère (opérateurs).

"vrai" ou "faux"

Features.operators.openshift.io/tls-profiles

Indiquez si un opérateur met en œuvre des réglages bien connus pour modifier la suite de chiffrement TLS utilisée par l’opérateur et, le cas échéant, l’une des charges de travail qu’il gère (opérateurs).

"vrai" ou "faux"

caractéristiques.operators.openshift.io/token-auth-aws

Indiquez si un opérateur prend en charge la configuration pour l’authentification tokenized avec les API AWS via AWS Secure Token Service (STS) à l’aide de l’opérateur d’identification en nuage (CCO).

"vrai" ou "faux"

caractéristiques.operators.openshift.io/token-auth-azure

Indiquez si un opérateur prend en charge la configuration pour l’authentification tokenized avec les API Azure via Azure Managed Identity à l’aide de l’opérateur d’identification en nuage (CCO).

"vrai" ou "faux"

caractéristiques.operators.openshift.io/token-auth-gcp

Indiquez si un opérateur prend en charge la configuration pour l’authentification tokenized avec les API Google Cloud via GCP Workload Identity Foundation (WIF) à l’aide de l’opérateur d’identification en nuage (CCO).

"vrai" ou "faux"

caractéristiques.operators.openshift.io/cnf

Indiquez si un opérateur fournit un plugin Kubernetes (Native Network Function) Cloud-Native Network Function (CNF).

"vrai" ou "faux"

caractéristiques.operators.openshift.io/cni

Indiquez si un opérateur fournit un plugin Kubernetes (Container Network Interface) (CNI).

"vrai" ou "faux"

caractéristiques.operators.openshift.io/csi

Indiquez si un opérateur fournit un plugin Kubernetes (CSI) Kubernetes.

"vrai" ou "faux"

  1. Les valeurs valides sont affichées intentionnellement avec des guillemets doubles, car les annotations Kubernetes doivent être des chaînes.

Exemple CSV avec des annotations de fonctionnalités d’infrastructure

apiVersion: operators.coreos.com/v1alpha1
kind: ClusterServiceVersion
metadata:
  annotations:
    features.operators.openshift.io/disconnected: "true"
    features.operators.openshift.io/fips-compliant: "false"
    features.operators.openshift.io/proxy-aware: "false"
    features.operators.openshift.io/tls-profiles: "false"
    features.operators.openshift.io/token-auth-aws: "false"
    features.operators.openshift.io/token-auth-azure: "false"
    features.operators.openshift.io/token-auth-gcp: "false"
Copy to Clipboard Toggle word wrap

À partir de Red Hat OpenShift Service sur AWS 4.14, le groupe d’annotations operators.openshift.io/infrastructure-features est déprécié par le groupe d’annotations avec l’espace de noms features.operators.openshift.io. Bien que vous soyez encouragé à utiliser les annotations les plus récentes, les deux groupes sont actuellement acceptés lorsqu’ils sont utilisés en parallèle.

Ces annotations détaillent les caractéristiques de l’infrastructure qu’un opérateur prend en charge. Les utilisateurs peuvent visualiser et filtrer par ces fonctionnalités lors de la découverte des opérateurs via OperatorHub dans la console Web ou dans le catalogue de l’écosystème Red Hat.

Expand
Tableau 5.10. Les opérateurs désappropriés.openshift.io/infrastructure-fonctionnements annotations
Les valeurs d’annotation validesDescription

déconnecté

L’opérateur prend en charge la mise en miroir dans des catalogues déconnectés, y compris toutes les dépendances, et ne nécessite pas d’accès à Internet. Les images associées requises pour la mise en miroir sont répertoriées par l’opérateur.

CNF

L’opérateur fournit un plugin Kubernetes (CNF) dans le Cloud-Native Network Functions (CNF).

CNI

L’opérateur fournit un plugin Kubernetes de Container Network Interface (CNI).

CSI

L’opérateur fournit un plugin Kubernetes d’interface de stockage de conteneurs (CSI).

FIPS

L’opérateur accepte le mode FIPS de la plate-forme sous-jacente et fonctionne sur des nœuds qui sont démarrés en mode FIPS.

Important

Lors de l’exécution Red Hat Enterprise Linux (RHEL) ou Red Hat Enterprise Linux CoreOS (RHCOS) démarré en mode FIPS, Red Hat OpenShift Service sur les composants de base AWS utilisent les bibliothèques cryptographiques RHEL qui ont été soumises au NIST pour FIPS 140-2/140-3 Validation sur seulement les architectures x86_64, ppc64le et s390x.

logiciel proxy-aware

L’opérateur prend en charge l’exécution d’un cluster derrière un proxy. L’opérateur accepte les variables d’environnement proxy standard HTTP_PROXY et HTTPS_PROXY, que le gestionnaire de cycle de vie de l’opérateur (OLM) fournit automatiquement à l’opérateur lorsque le cluster est configuré pour utiliser un proxy. Les variables d’environnement requises sont transmises à Operands pour les charges de travail gérées.

Exemple CSV avec support déconnecté et proxy-aware

apiVersion: operators.coreos.com/v1alpha1
kind: ClusterServiceVersion
metadata:
  annotations:
    operators.openshift.io/infrastructure-features: '["disconnected", "proxy-aware"]'
Copy to Clipboard Toggle word wrap

5.6.3.3. Autres annotations facultatives

Les annotations suivantes de l’opérateur sont facultatives.

Expand
Tableau 5.11. Autres annotations facultatives
AnnotationDescription

exemples d’ALM

Fournissez des modèles de définition de ressources personnalisées (CRD) avec un ensemble minimal de configuration. Compatible UIs pré-rempli ce modèle pour les utilisateurs à personnaliser davantage.

operatorframework.io/initialisation-ressource

Indiquez une seule ressource personnalisée requise en ajoutant l’annotation de la ressource d’initialisation à la version de service cluster (CSV) pendant l’installation de l’opérateur. L’utilisateur est alors invité à créer la ressource personnalisée à l’aide d’un modèle fourni dans le CSV. Doit inclure un modèle contenant une définition complète de YAML.

operatorframework.io/suggéré-namespace

Définissez un espace de noms suggéré où l’opérateur devrait être déployé.

operatorframework.io/suggéré-namespace-template

Définissez un manifeste pour un objet Namespace avec le sélecteur de nœud par défaut pour l’espace de noms spécifié.

opérateurs.openshift.io/valid-abonnement

Le tableau de forme gratuite pour la liste des abonnements spécifiques qui sont nécessaires pour utiliser l’opérateur. À titre d’exemple, '["3Scale Commercial License", "Red Hat Managed Integration"]

Operator.operatorframework.io/objets internes

Cache les CRD dans l’interface utilisateur qui ne sont pas destinés à la manipulation des utilisateurs.

Exemple CSV avec un service OpenShift Red Hat sur l’exigence de licence AWS

apiVersion: operators.coreos.com/v1alpha1
kind: ClusterServiceVersion
metadata:
  annotations:
    operators.openshift.io/valid-subscription: '["OpenShift Container Platform"]'
Copy to Clipboard Toggle word wrap

Exemple CSV avec une exigence de licence 3scale

apiVersion: operators.coreos.com/v1alpha1
kind: ClusterServiceVersion
metadata:
  annotations:
    operators.openshift.io/valid-subscription: '["3Scale Commercial License", "Red Hat Managed Integration"]'
Copy to Clipboard Toggle word wrap

En tant qu’auteur de l’opérateur, votre opérateur doit répondre à des exigences supplémentaires pour fonctionner correctement dans un environnement restreint ou déconnecté.

Exigences de l’opérateur pour soutenir le mode déconnecté

  • Le remplacement des références d’images codées en dur par des variables d’environnement.
  • Dans la version de service cluster (CSV) de votre opérateur:

    • Énumérez toutes les images connexes, ou d’autres images de conteneurs dont votre opérateur pourrait avoir besoin pour exécuter leurs fonctions.
    • Faites référence à toutes les images spécifiées par un digest (SHA) et non par une balise.
  • Les dépendances de votre opérateur doivent également prendre en charge l’exécution en mode déconnecté.
  • L’opérateur ne doit pas avoir besoin de ressources hors groupe.

Conditions préalables

  • D’un projet d’opérateur avec un CSV. La procédure suivante utilise l’opérateur Memcached comme exemple pour les projets basés sur Go, Ansible et Helm.

Procédure

  1. Définissez une variable d’environnement pour les références d’image supplémentaires utilisées par l’opérateur dans le fichier config/manager/manager.yaml:

    Exemple 5.2. Exemple de fichier config/manager/manager.yaml

    ...
    spec:
      ...
        spec:
          ...
          containers:
          - command:
            - /manager
            ...
            env:
            - name: <related_image_environment_variable> 
    1
    
              value: "<related_image_reference_with_tag>" 
    2
    Copy to Clipboard Toggle word wrap
    1
    Définissez la variable d’environnement, telle que RELATED_IMAGE_MEMCACHED.
    2
    Définissez la référence et la balise d’image associées, telles que docker.io/memcached:1.4.36-alpine.
  2. Le remplacement des références d’image codées en dur par des variables d’environnement dans le fichier pertinent pour votre type de projet Opérateur:

    • Dans le cas des projets Go-based Operator, ajoutez la variable d’environnement au fichier Controllers/memcached_controller.go comme indiqué dans l’exemple suivant:

      Exemple 5.3. Exemple de contrôleurs/memcached_controller.go fichier

        // deploymentForMemcached returns a memcached Deployment object
      
      ...
      
      	Spec: corev1.PodSpec{
              	Containers: []corev1.Container{{
      -			Image:   "memcached:1.4.36-alpine", 
      1
      
      +			Image:   os.Getenv("<related_image_environment_variable>"), 
      2
      
      			Name:    "memcached",
      			Command: []string{"memcached", "-m=64", "-o", "modern", "-v"},
      			Ports: []corev1.ContainerPort{{
      
      ...
      Copy to Clipboard Toggle word wrap
      1
      Effacer la référence et le tag de l’image.
      2
      La fonction os.Getenv appelle &lt;related_image_environnement_variable&gt;.
      Note

      La fonction os.Getenv renvoie une chaîne vide si une variable n’est pas définie. Définissez le &lt;related_image_environnement_variable&gt; avant de modifier le fichier.

    • Dans le cas des projets d’opérateur basé sur Ansible, ajoutez la variable d’environnement au fichier role/memcached/tasks/main.yml comme indiqué dans l’exemple suivant:

      Exemple 5.4. Exemple de fichier role/memcached/tasks/main.yml

      spec:
        containers:
        - name: memcached
          command:
          - memcached
          - -m=64
          - -o
          - modern
          - -v
      -   image: "docker.io/memcached:1.4.36-alpine" 
      1
      
      +   image: "{{ lookup('env', '<related_image_environment_variable>') }}" 
      2
      
          ports:
            - containerPort: 11211
      
      ...
      Copy to Clipboard Toggle word wrap
      1
      Effacer la référence et le tag de l’image.
      2
      La fonction de recherche permet d’appeler &lt;related_image_environnement_variable&gt;.
    • Dans le cas des projets d’opérateur basé sur Helm, ajoutez le champ OverrideValues au fichier watch.yaml comme indiqué dans l’exemple suivant:

      Exemple 5.5. Exemple watch.yaml fichier

      ...
      - group: demo.example.com
        version: v1alpha1
        kind: Memcached
        chart: helm-charts/memcached
        overrideValues: 
      1
      
          relatedImage: ${<related_image_environment_variable>} 
      2
      Copy to Clipboard Toggle word wrap
      1
      Ajoutez le champ OverrideValues.
      2
      Définissez le champ OverrideValues à l’aide du &lt;related_image_environnement_variable&gt;, tel que RELATED_IMAGE_MEMCACHED.
      1. Ajoutez la valeur du champ OverrideValues au fichier helm-charts/memchached/values.yaml comme indiqué dans l’exemple suivant:

        Exemple de fichier helm-charts/memchached/values.yaml

        ...
        relatedImage: ""
        Copy to Clipboard Toggle word wrap

      2. Éditez le modèle de graphique dans le fichier helm-charts/memcached/templates/deployment.yaml comme indiqué dans l’exemple suivant:

        Exemple 5.6. Exemple de fichier helm-charts/memcached/templates/deployment.yaml

        containers:
          - name: {{ .Chart.Name }}
            securityContext:
              - toYaml {{ .Values.securityContext | nindent 12 }}
            image: "{{ .Values.image.pullPolicy }}
            env: 
        1
        
              - name: related_image 
        2
        
                value: "{{ .Values.relatedImage }}" 
        3
        Copy to Clipboard Toggle word wrap
        1
        Ajoutez le champ env.
        2
        Indiquez la variable d’environnement.
        3
        Définissez la valeur de la variable d’environnement.
  3. Ajoutez la définition de variable BUNDLE_GEN_FLAGS à votre Makefile avec les modifications suivantes:

    Exemple de Makefile

       BUNDLE_GEN_FLAGS ?= -q --overwrite --version $(VERSION) $(BUNDLE_METADATA_OPTS)
    
       # USE_IMAGE_DIGESTS defines if images are resolved via tags or digests
       # You can enable this value if you would like to use SHA Based Digests
       # To enable set flag to true
       USE_IMAGE_DIGESTS ?= false
       ifeq ($(USE_IMAGE_DIGESTS), true)
             BUNDLE_GEN_FLAGS += --use-image-digests
       endif
    
    ...
    
    -  $(KUSTOMIZE) build config/manifests | operator-sdk generate bundle -q --overwrite --version $(VERSION) $(BUNDLE_METADATA_OPTS) 
    1
    
    +  $(KUSTOMIZE) build config/manifests | operator-sdk generate bundle $(BUNDLE_GEN_FLAGS) 
    2
    
    
    ...
    Copy to Clipboard Toggle word wrap

    1
    Effacer cette ligne dans le Makefile.
    2
    C) Remplacer la ligne ci-dessus par cette ligne.
  4. Afin de mettre à jour votre image de l’opérateur pour utiliser un digest (SHA) et non une balise, exécutez la commande make bundle et définissez USE_IMAGE_DIGESTS sur true:

    $ make bundle USE_IMAGE_DIGESTS=true
    Copy to Clipboard Toggle word wrap
  5. Ajouter l’annotation déconnectée, qui indique que l’opérateur fonctionne dans un environnement déconnecté:

    metadata:
      annotations:
        operators.openshift.io/infrastructure-features: '["disconnected"]'
    Copy to Clipboard Toggle word wrap

    Les opérateurs peuvent être filtrés dans OperatorHub par cette fonctionnalité d’infrastructure.

Le gestionnaire de cycle de vie de l’opérateur (OLM) suppose que tous les opérateurs s’exécutent sur des hôtes Linux. Cependant, en tant qu’auteur de l’opérateur, vous pouvez spécifier si votre opérateur prend en charge la gestion des charges de travail sur d’autres architectures, si les nœuds de travail sont disponibles dans le service Red Hat OpenShift sur le cluster AWS.

Dans le cas où votre opérateur prend en charge des variantes autres que AMD64 et Linux, vous pouvez ajouter des étiquettes à la version de service de cluster (CSV) qui fournit à l’opérateur la liste des variantes prises en charge. Les étiquettes indiquant les architectures et les systèmes d’exploitation pris en charge sont définies par ce qui suit:

labels:
    operatorframework.io/arch.<arch>: supported 
1

    operatorframework.io/os.<os>: supported 
2
Copy to Clipboard Toggle word wrap
1
Définissez &lt;arch&gt; sur une chaîne prise en charge.
2
Définissez &lt;os&gt; sur une chaîne prise en charge.
Note

Il n’y a que les étiquettes sur la tête du canal par défaut pour filtrer les manifestes de paquets par étiquette. Cela signifie, par exemple, qu’il est possible de fournir une architecture supplémentaire à un opérateur dans le canal non par défaut, mais que cette architecture n’est pas disponible pour le filtrage dans l’API PackageManifest.

Dans le cas où un CSV n’inclut pas d’étiquette os, il est traité comme s’il avait l’étiquette de support Linux suivante par défaut:

labels:
    operatorframework.io/os.linux: supported
Copy to Clipboard Toggle word wrap

Lorsqu’un CSV n’inclut pas d’étiquette d’arche, il est traité comme s’il avait l’étiquette de support AMD64 suivante par défaut:

labels:
    operatorframework.io/arch.amd64: supported
Copy to Clipboard Toggle word wrap

Lorsqu’un opérateur prend en charge plusieurs architectures de nœuds ou systèmes d’exploitation, vous pouvez également ajouter plusieurs étiquettes.

Conditions préalables

  • D’un projet d’opérateur avec un CSV.
  • Afin de prendre en charge la liste de plusieurs architectures et systèmes d’exploitation, l’image de votre opérateur référencée dans le CSV doit être une image de liste manifeste.
  • Afin que l’opérateur fonctionne correctement dans un réseau restreint, ou déconnecté, l’image référencée doit également être spécifiée à l’aide d’un digeste (SHA) et non par une balise.

Procédure

  • Ajoutez une étiquette dans les métadonnées.labels de votre CSV pour chaque architecture et système d’exploitation pris en charge par votre opérateur:

    labels:
      operatorframework.io/arch.s390x: supported
      operatorframework.io/os.zos: supported
      operatorframework.io/os.linux: supported 
    1
    
      operatorframework.io/arch.amd64: supported 
    2
    Copy to Clipboard Toggle word wrap
    1 2
    Après avoir ajouté une nouvelle architecture ou un nouveau système d’exploitation, vous devez maintenant inclure explicitement les variantes os.linux et arch.amd64 par défaut.

Les chaînes suivantes sont prises en charge dans Operator Lifecycle Manager (OLM) sur Red Hat OpenShift Service sur AWS lors de l’étiquetage ou du filtrage des opérateurs qui prennent en charge plusieurs architectures et systèmes d’exploitation:

Expand
Tableau 5.12. Architectures prises en charge sur Red Hat OpenShift Service sur AWS
ArchitectureChaîne de caractères

AMD64

amd64

ARM64

bras64

IBM Power®

à propos de ppc64le

IBM Z®

à propos de S390x

Expand
Tableau 5.13. Les systèmes d’exploitation pris en charge sur Red Hat OpenShift Service sur AWS
Le système d’exploitationChaîne de caractères

Linux

Linux

à propos de Z/OS

à propos de ZOS

Note

Différentes versions de Red Hat OpenShift Service sur AWS et d’autres distributions basées sur Kubernetes peuvent prendre en charge un ensemble différent d’architectures et de systèmes d’exploitation.

5.6.6. Définition d’un espace de noms suggéré

Certains opérateurs doivent être déployés dans un espace de noms spécifique, ou avec des ressources accessoires dans des espaces de noms spécifiques, pour fonctionner correctement. En cas de résolution d’un abonnement, Operator Lifecycle Manager (OLM) par défaut des ressources d’un opérateur par défaut sur l’espace de noms de son abonnement.

En tant qu’auteur de l’opérateur, vous pouvez plutôt exprimer un espace de noms cible souhaité dans le cadre de votre version de service de cluster (CSV) afin de maintenir le contrôle sur les espaces de noms finaux des ressources installées pour leurs opérateurs. Lors de l’ajout de l’opérateur à un cluster en utilisant OperatorHub, cela permet à la console Web de remplir automatiquement l’espace de noms suggéré pour l’installateur pendant le processus d’installation.

Procédure

  • Dans votre CSV, définissez l’annotation operatorframework.io/suggéré-namespace à votre espace de noms suggéré:

    metadata:
      annotations:
        operatorframework.io/suggested-namespace: <namespace> 
    1
    Copy to Clipboard Toggle word wrap
    1
    Définissez votre espace de noms suggéré.

Certains opérateurs s’attendent à fonctionner uniquement sur les nœuds de plan de contrôle, ce qui peut être fait en définissant un nodeSelector dans la spécification Pod par l’opérateur lui-même.

Afin d’éviter d’être dupliqués et potentiellement contradictoires, vous pouvez définir un sélecteur de nœuds par défaut sur l’espace de noms où l’opérateur s’exécute. Le sélecteur de nœud par défaut aura préséance sur le cluster par défaut, de sorte que le cluster par défaut ne sera pas appliqué aux pods dans l’espace de noms des opérateurs.

Lors de l’ajout de l’opérateur à un cluster en utilisant OperatorHub, la console Web peuple automatiquement l’espace de noms suggéré pour l’installateur pendant le processus d’installation. L’espace de noms suggéré est créé à l’aide du manifeste de l’espace de noms dans YAML qui est inclus dans la version de service cluster (CSV).

Procédure

  • Dans votre CSV, définissez l’opérateurframework.io/suggéré-namespace-template avec un manifeste pour un objet Namespace. L’échantillon suivant est un manifeste pour un exemple Namespace avec le sélecteur de nœud par défaut de namespace spécifié:

    metadata:
      annotations:
        operatorframework.io/suggested-namespace-template: 
    1
    
          {
            "apiVersion": "v1",
            "kind": "Namespace",
            "metadata": {
              "name": "vertical-pod-autoscaler-suggested-template",
              "annotations": {
                "openshift.io/node-selector": ""
              }
            }
          }
    Copy to Clipboard Toggle word wrap
    1
    Définissez votre espace de noms suggéré.
    Note

    Lorsque les annotations suggérées-namespace et suggéré-namespace-template sont présentes dans le CSV, le modèle suggéré-namespace-template devrait primer.

5.6.8. Conditions d’activation de l’opérateur

Le gestionnaire de cycle de vie de l’opérateur (OLM) fournit aux opérateurs un canal pour communiquer des états complexes qui influencent le comportement OLM tout en gérant l’opérateur. Par défaut, OLM crée une définition de ressource personnalisée OperatorCondition (CRD) lorsqu’elle installe un opérateur. En fonction des conditions définies dans la ressource personnalisée OperatorCondition (CR), le comportement de OLM change en conséquence.

Afin de prendre en charge les conditions de l’opérateur, un opérateur doit être en mesure de lire la version CR de l’opérateur créé par OLM et d’avoir la capacité d’accomplir les tâches suivantes:

  • Ayez la condition spécifique.
  • Définissez l’état d’une condition spécifique.

Cela peut être accompli en utilisant la bibliothèque opérateur-lib. L’auteur d’un opérateur peut fournir un client d’exécution du contrôleur dans son opérateur pour que la bibliothèque puisse accéder à la version CR de l’opérateur appartenant à l’opérateur dans le cluster.

La bibliothèque fournit une interface Conditions génériques, qui dispose des méthodes suivantes pour obtenir et définir un type de condition dans la version CR de l’opérateur:

J’obtiens
Afin d’obtenir la condition spécifique, la bibliothèque utilise la fonction client.Get de contrôleur-runtime, qui nécessite une ObjectKey des types de type.NamespacedName présent dans conditionAccessor.
Ensemble
Afin de mettre à jour l’état de la condition spécifique, la bibliothèque utilise la fonction client.Update à partir du contrôleur-runtime. L’erreur se produit si la conditionType n’est pas présente dans le CRD.

L’opérateur est autorisé à modifier uniquement la sous-ressource d’état du CR. Les opérateurs peuvent soit supprimer ou mettre à jour le tableau status.conditions pour inclure la condition. Afin de plus amples détails sur le format et la description des champs présents dans les conditions, voir l’Amont Condition GoDocs.

Note

L’opérateur SDK 1.38.0 prend en charge la v0.11.0 de l’opérateur.

Conditions préalables

  • Le projet d’opérateur généré à l’aide du SDK de l’opérateur.

Procédure

Activer les conditions de l’opérateur dans votre projet Opérateur:

  1. Dans le fichier go.mod de votre projet Opérateur, ajoutez l’opérateur-cadre/opérateur-lib comme bibliothèque requise:

    module github.com/example-inc/memcached-operator
    
    go 1.19
    
    require (
      k8s.io/apimachinery v0.26.0
      k8s.io/client-go v0.26.0
      sigs.k8s.io/controller-runtime v0.14.1
      operator-framework/operator-lib v0.11.0
    )
    Copy to Clipboard Toggle word wrap
  2. Écrivez votre propre constructeur dans votre logique d’opérateur qui se traduira par les résultats suivants:

    • Accepte un client d’exécution de contrôleur.
    • Accepte un type de condition.
    • Il retourne une interface Condition pour mettre à jour ou ajouter des conditions.

    Comme OLM prend actuellement en charge la condition Upgradeable, vous pouvez créer une interface qui dispose de méthodes pour accéder à la condition Upgradeable. À titre d’exemple:

    import (
      ...
      apiv1 "github.com/operator-framework/api/pkg/operators/v1"
    )
    
    func NewUpgradeable(cl client.Client) (Condition, error) {
      return NewCondition(cl, "apiv1.OperatorUpgradeable")
    }
    
    cond, err := NewUpgradeable(cl);
    Copy to Clipboard Toggle word wrap

    Dans cet exemple, le constructeur NewUpgradeable est en outre utilisé pour créer un cond variable de type Condition. La variable cond aurait à son tour des méthodes Get and Set, qui peuvent être utilisées pour gérer la condition OLM Upgradeable.

5.6.9. Définir des webhooks

Les webhooks permettent aux auteurs de l’opérateur d’intercepter, de modifier et d’accepter ou de rejeter des ressources avant qu’elles ne soient enregistrées dans le magasin d’objets et traitées par le contrôleur de l’opérateur. Le gestionnaire de cycle de vie de l’opérateur (OLM) peut gérer le cycle de vie de ces webhooks lorsqu’ils sont expédiés aux côtés de votre opérateur.

La ressource de la version de service de cluster (CSV) d’un opérateur peut inclure une section Webhookdefinitions pour définir les types suivants de webhooks:

  • Admission webhooks (validation et mutation)
  • Conversion webhooks

Procédure

  • Ajoutez une section Webhookdefinitions à la section Spécifications du CSV de votre opérateur et incluez toutes les définitions de webhook à l’aide d’un type de ValidatingAdmissionWebhook, MutatingAdmissionWebhook ou ConversionWebhook. L’exemple suivant contient les trois types de webhooks:

    CSV contenant des webhooks

      apiVersion: operators.coreos.com/v1alpha1
      kind: ClusterServiceVersion
      metadata:
        name: webhook-operator.v0.0.1
      spec:
        customresourcedefinitions:
          owned:
          - kind: WebhookTest
            name: webhooktests.webhook.operators.coreos.io 
    1
    
            version: v1
        install:
          spec:
            deployments:
            - name: webhook-operator-webhook
              ...
              ...
              ...
          strategy: deployment
        installModes:
        - supported: false
          type: OwnNamespace
        - supported: false
          type: SingleNamespace
        - supported: false
          type: MultiNamespace
        - supported: true
          type: AllNamespaces
        webhookdefinitions:
        - type: ValidatingAdmissionWebhook 
    2
    
          admissionReviewVersions:
          - v1beta1
          - v1
          containerPort: 443
          targetPort: 4343
          deploymentName: webhook-operator-webhook
          failurePolicy: Fail
          generateName: vwebhooktest.kb.io
          rules:
          - apiGroups:
            - webhook.operators.coreos.io
            apiVersions:
            - v1
            operations:
            - CREATE
            - UPDATE
            resources:
            - webhooktests
          sideEffects: None
          webhookPath: /validate-webhook-operators-coreos-io-v1-webhooktest
        - type: MutatingAdmissionWebhook 
    3
    
          admissionReviewVersions:
          - v1beta1
          - v1
          containerPort: 443
          targetPort: 4343
          deploymentName: webhook-operator-webhook
          failurePolicy: Fail
          generateName: mwebhooktest.kb.io
          rules:
          - apiGroups:
            - webhook.operators.coreos.io
            apiVersions:
            - v1
            operations:
            - CREATE
            - UPDATE
            resources:
            - webhooktests
          sideEffects: None
          webhookPath: /mutate-webhook-operators-coreos-io-v1-webhooktest
        - type: ConversionWebhook 
    4
    
          admissionReviewVersions:
          - v1beta1
          - v1
          containerPort: 443
          targetPort: 4343
          deploymentName: webhook-operator-webhook
          generateName: cwebhooktest.kb.io
          sideEffects: None
          webhookPath: /convert
          conversionCRDs:
          - webhooktests.webhook.operators.coreos.io 
    5
    
    ...
    Copy to Clipboard Toggle word wrap

    1
    Les CRD ciblés par le webhook de conversion doivent exister ici.
    2
    C’est un webhook d’admission valide.
    3
    C’est un webhook d’admission mutant.
    4
    C’est un webhook de conversion.
    5
    La propriété spec.PreserveUnknownFields de chaque CRD doit être définie à faux ou nul.

5.6.9.1. Considérations Webhook pour OLM

Lorsque vous déployez un opérateur avec des webhooks à l’aide du gestionnaire de cycle de vie de l’opérateur (OLM), vous devez définir ce qui suit:

  • Le champ type doit être défini sur ValidatingAdmissionWebhook, MutatingAdmissionWebhook ou ConversionWebhook, ou le CSV sera placé dans une phase défaillante.
  • Le CSV doit contenir un déploiement dont le nom est équivalent à la valeur fournie dans le champ deploymentName de la définition webhook.

Lorsque le webhook est créé, OLM s’assure que le webhook agit uniquement sur les espaces de noms correspondant au groupe d’opérateur dans lequel l’opérateur est déployé.

Contraintes de l’autorité de certification

L’OLM est configurée pour fournir à chaque déploiement une seule autorité de certificat (CA). La logique qui génère et monte l’AC dans le déploiement a été utilisée à l’origine par la logique du cycle de vie de l’API. En conséquence:

  • Le fichier de certificat TLS est monté au déploiement sur /apiserver.local.config/certificates/apiserver.crt.
  • Le fichier clé TLS est monté au déploiement sur /apiserver.local.config/certificates/apiserver.key.
Les règles d’admission sur le webhook

Afin d’empêcher un opérateur de configurer le cluster dans un état non récupérable, OLM place le CSV dans la phase défaillante si les règles définies dans un webhook d’admission interceptent l’une des requêtes suivantes:

  • Demandes qui ciblent tous les groupes
  • Demande qui cible le groupe operators.coreos.com
  • Demandes qui ciblent les ressources ValidatingWebhookConfigurations ou MutatingWebhookConfigurations
Contraintes de conversion webhook

L’OMM place le CSV dans la phase défaillante si une définition de webhook de conversion n’adhère pas aux contraintes suivantes:

  • Les CSV dotés d’un webhook de conversion ne peuvent prendre en charge que le mode d’installation d’AllNamespaces.
  • Le CRD ciblé par le webhook de conversion doit avoir son champ spec.preserveUnknownFields mis à faux ou nul.
  • Le webhook de conversion défini dans le CSV doit cibler un CRD détenu.
  • Il ne peut y avoir qu’un seul webhook de conversion sur l’ensemble du cluster pour un CRD donné.

Il existe deux types de définitions de ressources personnalisées (CRD) que votre opérateur peut utiliser : celles qui lui appartiennent et celles dont elle dépend, qui sont nécessaires.

5.6.10.1. Les CRD possédés

Les définitions de ressources personnalisées (CRD) détenues par votre opérateur sont la partie la plus importante de votre CSV. Cela établit le lien entre votre opérateur et les règles RBAC requises, la gestion des dépendances et d’autres concepts de Kubernetes.

Il est courant pour votre opérateur d’utiliser plusieurs CRD pour relier des concepts, tels que la configuration de base de données de haut niveau dans un objet et une représentation des ensembles de répliques dans un autre. Chacun doit être indiqué dans le fichier CSV.

Expand
Tableau 5.14. Champs CRD possédés
Le champDescriptionRequis/facultatif

Le nom

Le nom complet de votre CRD.

A) requis

La version

La version de cette API objet.

A) requis

Je suis gentille.

Le nom lisible par la machine de votre CRD.

A) requis

DisplayName

Il s’agit d’une version lisible humaine de votre nom CRD, par exemple MongoDB Standalone.

A) requis

Description

Brève description de la façon dont ce CRD est utilisé par l’Opérateur ou une description de la fonctionnalité fournie par le CRD.

A) requis

Groupe de travail

Le groupe API auquel appartient ce CRD, par exemple Database.example.com.

Facultatif

Ressources

Les CRD possèdent un ou plusieurs types d’objets Kubernetes. Ceux-ci sont listés dans la section ressources pour informer vos utilisateurs des objets dont ils pourraient avoir besoin pour résoudre les problèmes ou comment se connecter à l’application, comme la règle du service ou de l’entrée qui expose une base de données.

Il est recommandé de ne énumérer que les objets qui sont importants pour un humain, pas une liste exhaustive de tout ce que vous orchestrez. À titre d’exemple, ne répertoriez pas les cartes de configuration qui stockent l’état interne qui ne sont pas destinés à être modifiés par un utilisateur.

Facultatif

Description des SpecDescripteurs, StatutDescripteurs et ActionDescripteurs

Ces descripteurs sont un moyen d’indiquer les UI avec certaines entrées ou sorties de votre opérateur qui sont les plus importantes pour un utilisateur final. Lorsque votre CRD contient le nom d’une carte secrète ou de configuration que l’utilisateur doit fournir, vous pouvez le spécifier ici. Ces éléments sont liés et mis en évidence dans les UI compatibles.

Il existe trois types de descripteurs:

  • Description des Spec: Une référence aux champs dans le bloc spec d’un objet.
  • Description du statut: Une référence aux champs dans le bloc d’état d’un objet.
  • ActionDescriptors: Une référence aux actions qui peuvent être effectuées sur un objet.

Les descripteurs acceptent les champs suivants:

  • DisplayName: Un nom lisible par l’homme pour le Spec, Status ou Action.
  • Description : Une courte description de la Spécification, de l’état ou de l’action et de la façon dont il est utilisé par l’opérateur.
  • Chemin : Un chemin délimité par point du champ sur l’objet décrit par ce descripteur.
  • Description des x : Utilisé pour déterminer les « capacités » de ce descripteur et quel composant d’interface utilisateur utiliser. Consultez le projet openshift/console pour une liste canonique de React UI X-Descriptors for Red Hat OpenShift Service sur AWS.

Consultez également le projet openshift/console pour plus d’informations sur Descripteurs en général.

Facultatif

L’exemple suivant représente un CRD autonome MongoDB qui nécessite une entrée de l’utilisateur sous la forme d’une carte secrète et de configuration, et orchestrate les services, les ensembles d’état, les pods et les cartes de configuration:

Exemple appartenant à CRD

      - displayName: MongoDB Standalone
        group: mongodb.com
        kind: MongoDbStandalone
        name: mongodbstandalones.mongodb.com
        resources:
          - kind: Service
            name: ''
            version: v1
          - kind: StatefulSet
            name: ''
            version: v1beta2
          - kind: Pod
            name: ''
            version: v1
          - kind: ConfigMap
            name: ''
            version: v1
        specDescriptors:
          - description: Credentials for Ops Manager or Cloud Manager.
            displayName: Credentials
            path: credentials
            x-descriptors:
              - 'urn:alm:descriptor:com.tectonic.ui:selector:core:v1:Secret'
          - description: Project this deployment belongs to.
            displayName: Project
            path: project
            x-descriptors:
              - 'urn:alm:descriptor:com.tectonic.ui:selector:core:v1:ConfigMap'
          - description: MongoDB version to be installed.
            displayName: Version
            path: version
            x-descriptors:
              - 'urn:alm:descriptor:com.tectonic.ui:label'
        statusDescriptors:
          - description: The status of each of the pods for the MongoDB cluster.
            displayName: Pod Status
            path: pods
            x-descriptors:
              - 'urn:alm:descriptor:com.tectonic.ui:podStatuses'
        version: v1
        description: >-
          MongoDB Deployment consisting of only one host. No replication of
          data.
Copy to Clipboard Toggle word wrap

5.6.10.2. CRD requis

Compter sur d’autres CRD requis est complètement facultatif et n’existe que pour réduire la portée des opérateurs individuels et fournir un moyen de composer plusieurs opérateurs ensemble pour résoudre un cas d’utilisation de bout en bout.

C’est un exemple d’opérateur qui pourrait configurer une application et installer un cluster etcd (à partir d’un opérateur etcd) à utiliser pour le verrouillage distribué et une base de données Postgres (à partir d’un opérateur Postgres) pour le stockage des données.

Le gestionnaire de cycle de vie de l’opérateur (OLM) vérifie les CRD et les opérateurs disponibles dans le cluster pour répondre à ces exigences. Lorsque des versions appropriées sont trouvées, les opérateurs sont lancés dans l’espace de noms souhaité et un compte de service créé pour chaque opérateur pour créer, surveiller et modifier les ressources Kubernetes requises.

Expand
Tableau 5.15. Champs CRD requis
Le champDescriptionRequis/facultatif

Le nom

Le nom complet du CRD dont vous avez besoin.

A) requis

La version

La version de cette API objet.

A) requis

Je suis gentille.

Le genre d’objets Kubernetes.

A) requis

DisplayName

C’est une version lisible par l’homme de la CRD.

A) requis

Description

Le résumé de la façon dont le composant s’intègre dans votre architecture plus grande.

A) requis

Exemple requis CRD

    required:
    - name: etcdclusters.etcd.database.coreos.com
      version: v1beta2
      kind: EtcdCluster
      displayName: etcd Cluster
      description: Represents a cluster of etcd nodes.
Copy to Clipboard Toggle word wrap

5.6.10.3. Les mises à niveau de CRD

L’ODM met immédiatement à niveau une définition de ressource personnalisée (CRD) s’il appartient à une version de service de cluster singulier (CSV). Lorsqu’un CRD est détenu par plusieurs CSV, le CRD est mis à niveau lorsqu’il a satisfait à toutes les conditions suivantes:

  • Dans le nouveau CRD, toutes les versions de service existantes sont présentes dans le nouveau CRD.
  • Les instances existantes, ou ressources personnalisées, associées aux versions de service du CRD sont valides lorsqu’elles sont validées par rapport au schéma de validation du nouveau CRD.
5.6.10.3.1. Ajout d’une nouvelle version CRD

Procédure

Ajouter une nouvelle version d’un CRD à votre opérateur:

  1. Ajoutez une nouvelle entrée dans la ressource CRD dans la section versions de votre CSV.

    Ainsi, si le CRD actuel possède une version v1alpha1 et que vous souhaitez ajouter une nouvelle version v1beta1 et la marquer comme nouvelle version de stockage, ajoutez une nouvelle entrée pour v1beta1:

    versions:
      - name: v1alpha1
        served: true
        storage: false
      - name: v1beta1 
    1
    
        served: true
        storage: true
    Copy to Clipboard Toggle word wrap
    1
    C’est une nouvelle entrée.
  2. Assurez-vous que la version de référence de la CRD dans la section propre de votre CSV est mise à jour si le CSV a l’intention d’utiliser la nouvelle version:

    customresourcedefinitions:
      owned:
      - name: cluster.example.com
        version: v1beta1 
    1
    
        kind: cluster
        displayName: Cluster
    Copy to Clipboard Toggle word wrap
    1
    Actualisez la version.
  3. Appuyez sur le CRD et le CSV mis à jour sur votre paquet.
5.6.10.3.2. Dépréciation ou suppression d’une version CRD

Le gestionnaire de cycle de vie de l’opérateur (OLM) ne permet pas de supprimer immédiatement une version de service d’une définition de ressource personnalisée (CRD). Au lieu de cela, une version obsolète du CRD doit d’abord être désactivée en définissant le champ servi dans le CRD à faux. Ensuite, la version non-servante peut être supprimée sur la mise à niveau CRD ultérieure.

Procédure

Déprécier et supprimer une version spécifique d’un CRD:

  1. Marquer la version obsolète comme non-servant pour indiquer que cette version n’est plus utilisée et peut être supprimée dans une mise à jour ultérieure. À titre d’exemple:

    versions:
      - name: v1alpha1
        served: false 
    1
    
        storage: true
    Copy to Clipboard Toggle word wrap
    1
    J’ai mis sur false.
  2. Basculez la version de stockage en version de service si la version à déprécier est actuellement la version de stockage. À titre d’exemple:

    versions:
      - name: v1alpha1
        served: false
        storage: false 
    1
    
      - name: v1beta1
        served: true
        storage: true 
    2
    Copy to Clipboard Toggle word wrap
    1 2
    Actualisez les champs de stockage en conséquence.
    Note

    Afin de supprimer une version spécifique qui est ou était la version de stockage d’un CRD, cette version doit être supprimée de la version stockée dans l’état du CRD. Les OLM tenteront de le faire pour vous s’il détecte qu’une version stockée n’existe plus dans le nouveau CRD.

  3. Améliorez le CRD avec les modifications ci-dessus.
  4. Dans les cycles de mise à niveau ultérieurs, la version non-servante peut être complètement supprimée du CRD. À titre d’exemple:

    versions:
      - name: v1beta1
        served: true
        storage: true
    Copy to Clipboard Toggle word wrap
  5. Assurez-vous que la version CRD de référence dans la section détenue de votre CSV est mise à jour en conséquence si cette version est supprimée du CRD.

5.6.10.4. Les modèles CRD

Les utilisateurs de votre opérateur doivent être informés des options requises par rapport aux options facultatives. Il est possible de fournir des modèles pour chacune de vos définitions de ressources personnalisées (CRD) avec un ensemble minimal de configuration sous forme d’annotation nommée alm-exemples. Compatible UIs pré-remplira ce modèle pour les utilisateurs à personnaliser davantage.

L’annotation se compose d’une liste du type, par exemple, le nom CRD et les métadonnées et spécifications correspondantes de l’objet Kubernetes.

L’exemple complet suivant fournit des modèles pour EtcdCluster, EtcdBackup et EtcdRestore:

metadata:
  annotations:
    alm-examples: >-
      [{"apiVersion":"etcd.database.coreos.com/v1beta2","kind":"EtcdCluster","metadata":{"name":"example","namespace":"<operator_namespace>"},"spec":{"size":3,"version":"3.2.13"}},{"apiVersion":"etcd.database.coreos.com/v1beta2","kind":"EtcdRestore","metadata":{"name":"example-etcd-cluster"},"spec":{"etcdCluster":{"name":"example-etcd-cluster"},"backupStorageType":"S3","s3":{"path":"<full-s3-path>","awsSecret":"<aws-secret>"}}},{"apiVersion":"etcd.database.coreos.com/v1beta2","kind":"EtcdBackup","metadata":{"name":"example-etcd-cluster-backup"},"spec":{"etcdEndpoints":["<etcd-cluster-endpoints>"],"storageType":"S3","s3":{"path":"<full-s3-path>","awsSecret":"<aws-secret>"}}}]
Copy to Clipboard Toggle word wrap

5.6.10.5. Cacher des objets internes

Il est courant pour les opérateurs d’utiliser des définitions de ressources personnalisées (CRD) en interne pour accomplir une tâche. Ces objets ne sont pas destinés aux utilisateurs à manipuler et peuvent être source de confusion pour les utilisateurs de l’opérateur. À titre d’exemple, un opérateur de base de données peut avoir un CRD de réplication qui est créé chaque fois qu’un utilisateur crée un objet de base de données avec réplication: true.

En tant qu’auteur de l’opérateur, vous pouvez cacher tous les CRD dans l’interface utilisateur qui ne sont pas destinés à la manipulation de l’utilisateur en ajoutant l’annotation d’objets internes à la version de service cluster (CSV) de votre opérateur.

Procédure

  1. Avant de marquer l’un de vos CRD en interne, assurez-vous que toute information de débogage ou configuration qui pourrait être nécessaire pour gérer l’application est reflétée sur le statut ou le bloc de spécifications de votre CR, le cas échéant à votre opérateur.
  2. Ajoutez l’annotation d’un objet interne au CSV de votre opérateur pour spécifier les objets internes à cacher dans l’interface utilisateur:

    Annotation interne d’objet

    apiVersion: operators.coreos.com/v1alpha1
    kind: ClusterServiceVersion
    metadata:
      name: my-operator-v1.2.3
      annotations:
        operators.operatorframework.io/internal-objects: '["my.internal.crd1.io","my.internal.crd2.io"]' 
    1
    
    ...
    Copy to Clipboard Toggle word wrap

    1
    Définissez n’importe quel CRD interne comme un tableau de chaînes.

L’opérateur peut demander à l’utilisateur d’instancier une ressource personnalisée avant que l’opérateur puisse être pleinement fonctionnel. Cependant, il peut être difficile pour un utilisateur de déterminer ce qui est nécessaire ou comment définir la ressource.

En tant que développeur d’opérateur, vous pouvez spécifier une ressource personnalisée unique requise en ajoutant operatorframework.io/initialisation-ressource à la version de service cluster (CSV) pendant l’installation de l’opérateur. Il vous est alors demandé de créer la ressource personnalisée à l’aide d’un modèle fourni dans le CSV. L’annotation doit inclure un modèle qui contient une définition YAML complète qui est nécessaire pour initialiser la ressource pendant l’installation.

Lorsque cette annotation est définie, après avoir installé l’opérateur à partir du service Red Hat OpenShift sur la console web AWS, l’utilisateur est invité à créer la ressource à l’aide du modèle fourni dans le CSV.

Procédure

  • Ajoutez l’annotation operatorframework.io/initialisation-ressource au CSV de votre opérateur pour spécifier une ressource personnalisée requise. À titre d’exemple, l’annotation suivante nécessite la création d’une ressource StorageCluster et fournit une définition YAML complète:

    Annotation des ressources d’initialisation

    apiVersion: operators.coreos.com/v1alpha1
    kind: ClusterServiceVersion
    metadata:
      name: my-operator-v1.2.3
      annotations:
        operatorframework.io/initialization-resource: |-
            {
                "apiVersion": "ocs.openshift.io/v1",
                "kind": "StorageCluster",
                "metadata": {
                    "name": "example-storagecluster"
                },
                "spec": {
                    "manageNodes": false,
                    "monPVCTemplate": {
                        "spec": {
                            "accessModes": [
                                "ReadWriteOnce"
                            ],
                            "resources": {
                                "requests": {
                                    "storage": "10Gi"
                                }
                            },
                            "storageClassName": "gp2"
                        }
                    },
                    "storageDeviceSets": [
                        {
                            "count": 3,
                            "dataPVCTemplate": {
                                "spec": {
                                    "accessModes": [
                                        "ReadWriteOnce"
                                    ],
                                    "resources": {
                                        "requests": {
                                            "storage": "1Ti"
                                        }
                                    },
                                    "storageClassName": "gp2",
                                    "volumeMode": "Block"
                                }
                            },
                            "name": "example-deviceset",
                            "placement": {},
                            "portable": true,
                            "resources": {}
                        }
                    ]
                }
            }
    ...
    Copy to Clipboard Toggle word wrap

5.6.11. Comprendre vos services API

Comme pour les CRD, il existe deux types de services d’API que votre opérateur peut utiliser: possédés et requis.

5.6.11.1. Les services API possédés

Lorsqu’un CSV possède un service API, il est responsable de décrire le déploiement de l’extension api-server qui le soutient et du groupe/version/type (GVK) qu’il fournit.

Le service API est identifié de manière unique par le groupe/version qu’il fournit et peut être répertorié plusieurs fois pour désigner les différents types qu’il est censé fournir.

Expand
Tableau 5.16. Champs de service API possédés
Le champDescriptionRequis/facultatif

Groupe de travail

Groupe que le service API fournit, par exemple Database.example.com.

A) requis

La version

La version du service API, par exemple v1alpha1.

A) requis

Je suis gentille.

C’est une sorte que le service API devrait fournir.

A) requis

Le nom

Le nom pluriel du service API fourni.

A) requis

DéploiementName

Le nom du déploiement défini par votre CSV qui correspond à votre service API (requis pour les services API possédés). Au cours de la phase d’attente CSV, l’opérateur OLM effectue une recherche dans la stratégie d’installation de votre CSV pour trouver une spécification de déploiement avec un nom correspondant, et si elle n’est pas trouvée, ne transitionne pas le CSV vers la phase "Installer Prêt".

A) requis

DisplayName

Il s’agit d’une version lisible humaine du nom de votre service API, par exemple MongoDB Standalone.

A) requis

Description

Brève description de la façon dont ce service API est utilisé par l’opérateur ou une description des fonctionnalités fournies par le service API.

A) requis

Ressources

Les services API possèdent un ou plusieurs types d’objets Kubernetes. Ceux-ci sont listés dans la section ressources pour informer vos utilisateurs des objets dont ils pourraient avoir besoin pour résoudre les problèmes ou comment se connecter à l’application, comme la règle du service ou de l’entrée qui expose une base de données.

Il est recommandé de ne énumérer que les objets qui sont importants pour un humain, pas une liste exhaustive de tout ce que vous orchestrez. À titre d’exemple, ne répertoriez pas les cartes de configuration qui stockent l’état interne qui ne sont pas destinés à être modifiés par un utilisateur.

Facultatif

Description des SpecDescripteurs, StatutDescripteurs et ActionDescripteurs

Essentiellement les mêmes que pour les CRD possédés.

Facultatif

5.6.11.1.1. Création de ressources de service API

Le gestionnaire de cycle de vie de l’opérateur (OLM) est responsable de la création ou du remplacement des ressources de service et d’API pour chaque service d’API propriétaire unique:

  • Les sélecteurs de pod de service sont copiés à partir du déploiement CSV correspondant au champ DeploymentName de la description du service API.
  • La nouvelle paire clé/certificat CA est générée pour chaque installation et le paquet CA codé de base64 est intégré dans la ressource de service API respective.
5.6.11.1.2. Certificats de service API

Chaque fois qu’un service d’API est installé, OLM gère la génération d’une paire de clés/certificats de service. Le certificat de service a un nom commun (CN) contenant le nom d’hôte de la ressource Service généré et est signé par la clé privée du paquet CA intégré dans la ressource de service API correspondante.

Le certificat est stocké sous forme de secret de type kubernetes.io/tls dans l’espace de noms de déploiement, et un volume nommé apiservice-cert est automatiquement annexé à la section volumes du déploiement dans le CSV correspondant au champ DeploymentName de la description du service API.

Dans le cas contraire, une monture de volume avec un nom correspondant est également jointe à tous les conteneurs de ce déploiement. Cela permet aux utilisateurs de définir une monture de volume avec le nom attendu pour répondre à toutes les exigences de chemin personnalisé. Le chemin du montage de volume généré par défaut vers /apiserver.local.config/certificates et tous les montages de volume existants avec le même chemin sont remplacés.

5.6.11.2. Les services d’API requis

L’OLM s’assure que tous les CSV requis disposent d’un service API disponible et que tous les GVK attendus sont détectables avant de tenter l’installation. Cela permet à un CSV de s’appuyer sur des types spécifiques fournis par les services API qu’il ne possède pas.

Expand
Tableau 5.17. Champs de service API requis
Le champDescriptionRequis/facultatif

Groupe de travail

Groupe que le service API fournit, par exemple Database.example.com.

A) requis

La version

La version du service API, par exemple v1alpha1.

A) requis

Je suis gentille.

C’est une sorte que le service API devrait fournir.

A) requis

DisplayName

Il s’agit d’une version lisible humaine du nom de votre service API, par exemple MongoDB Standalone.

A) requis

Description

Brève description de la façon dont ce service API est utilisé par l’opérateur ou une description des fonctionnalités fournies par le service API.

A) requis

Retour au début
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. Découvrez nos récentes mises à jour.

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 le Blog 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.

Theme

© 2025 Red Hat