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


Un cluster service version (CSV), défini par un objet ClusterServiceVersion, est un manifeste YAML créé à partir des métadonnées de l'opérateur qui aide Operator Lifecycle Manager (OLM) à exécuter l'opérateur dans un cluster. Il s'agit des métadonnées qui accompagnent l'image d'un conteneur Operator, utilisées pour remplir les interfaces utilisateur avec des informations telles que le logo, la description et la version. Il s'agit également d'une source d'informations techniques nécessaires au fonctionnement de l'opérateur, comme les règles RBAC dont il a besoin et les ressources personnalisées (CR) qu'il gère ou dont il dépend.

L'Operator SDK comprend le générateur CSV qui permet de générer un CSV pour le projet Operator en cours, personnalisé à l'aide des informations contenues dans les manifestes YAML et les fichiers source de l'Operator.

Une commande générant des CSV supprime la responsabilité des auteurs d'opérateurs ayant une connaissance approfondie d'OLM pour que leur opérateur interagisse avec OLM ou publie des métadonnées dans le registre du catalogue. En outre, comme la spécification CSV est susceptible d'évoluer au fil du temps avec la mise en œuvre de nouvelles fonctionnalités Kubernetes et OLM, le SDK de l'opérateur est équipé pour étendre facilement son système de mise à jour afin de gérer les nouvelles fonctionnalités CSV à l'avenir.

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

Les manifestes de l'offre groupée Operator, qui comprennent des versions de service de cluster (CSV), décrivent comment afficher, créer et gérer une application avec Operator Lifecycle Manager (OLM). Le générateur CSV du SDK Operator, appelé par la sous-commande generate bundle, est la première étape vers la publication de votre Operator dans un catalogue et son déploiement 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, ainsi qu'une base CSV, pour générer ou régénérer un CSV de manière autonome.

En règle générale, la sous-commande generate kustomize manifests est exécutée en premier pour générer les bases Kustomize en entrée qui sont consommées par la sous-commande generate bundle. Cependant, l'Operator SDK fournit la commande make bundle, qui automatise plusieurs tâches, y compris l'exécution des sous-commandes suivantes dans l'ordre :

  1. generate kustomize manifests
  2. generate bundle
  3. bundle validate

Ressources supplémentaires

  • Voir la section Regroupement d'un opérateur pour une procédure complète comprenant la génération d'un regroupement et d'un fichier CSV.

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

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

  • Un répertoire bundle manifests nommé bundle/manifests qui contient un objet ClusterServiceVersion (CSV)
  • Un répertoire de métadonnées de la liasse nommé bundle/metadata
  • Toutes les définitions de ressources personnalisées (CRD) dans un répertoire config/crd
  • Un fichier Docker bundle.Dockerfile

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

Rôle
Définit les autorisations de l'opérateur au sein d'un espace de noms.
ClusterRole
Définit les autorisations de l'opérateur à l'échelle du cluster.
Déploiement
Définit la manière dont l'opérande d'un opérateur est exécuté dans les modules.
CustomResourceDefinition (CRD)
Définit les ressources personnalisées que votre opérateur réconcilie.
Exemples de ressources personnalisées
Exemples de ressources respectant les spécifications d'un CRD particulier.

5.7.1.2. Gestion des versions

L'option --version de la sous-commande generate bundle fournit une version sémantique de votre bundle lors de sa création et de la mise à jour d'un bundle existant.

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

5.7.2. Champs CSV définis manuellement

De nombreux champs CSV ne peuvent pas être remplis à l'aide de manifestes génériques générés qui ne sont pas spécifiques à Operator 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 d'opérateurs doivent modifier directement leur fichier YAML de version de service de cluster (CSV), en ajoutant des données personnalisées aux champs obligatoires suivants. Le SDK de l'opérateur émet un avertissement lors de la génération du fichier CSV lorsqu'il détecte un manque de données dans l'un des champs obligatoires.

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

Tableau 5.7. Exigée
FieldDescription

metadata.name

Un nom unique pour ce CSV. La version de l'opérateur doit être incluse dans le nom pour garantir l'unicité, par exemple app-operator.v0.1.1.

metadata.capabilities

Le niveau de capacité selon le modèle de maturité de l'opérateur. Les options comprennent Basic Install, Seamless Upgrades, Full Lifecycle, Deep Insights, et Auto Pilot.

spec.displayName

Un nom public pour identifier l'opérateur.

spec.description

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

spec.keywords

Mots clés décrivant l'opérateur.

spec.maintainers

Entités humaines ou organisationnelles assurant la maintenance de l'opérateur, avec un name et un email.

spec.provider

Le fournisseur de l'opérateur (généralement une organisation), avec une adresse name.

spec.labels

Paires clé-valeur à utiliser par les éléments internes de l'opérateur.

spec.version

Version sémantique de l'opérateur, par exemple 0.1.1.

spec.customresourcedefinitions

Tous les CRD que l'opérateur utilise. Ce champ est rempli automatiquement par le SDK de l'opérateur si des fichiers YAML de CRD sont présents sur deploy/. Toutefois, plusieurs champs ne figurant pas dans la spécification du manifeste de CRD doivent être renseignés par l'utilisateur :

  • description: description du CRD.
  • resourcesles ressources Kubernetes exploitées par le CRD, par exemple les objets Pod et StatefulSet.
  • specDescriptors: Indications de l'interface utilisateur pour les entrées et les sorties de l'opérateur.
Tableau 5.8. En option
FieldDescription

spec.replaces

Le nom du CSV remplacé par ce CSV.

spec.links

URL (par exemple, sites web et documentation) relatifs à l'opérateur ou à l'application gérée, chacun avec name et url.

spec.selector

Sélecteurs permettant à l'opérateur d'associer des ressources dans un cluster.

spec.icon

Une icône codée en base64 unique à l'opérateur, placée dans un champ base64data avec un mediatype.

spec.maturity

Le niveau de maturité atteint par le logiciel dans cette version. Les options comprennent planning, pre-alpha, alpha, beta, stable, mature, inactive et deprecated.

Pour plus de détails sur les données que chaque champ ci-dessus doit contenir, voir la spécification CSV.

Note

Plusieurs champs YAML nécessitant actuellement une intervention de l'utilisateur peuvent potentiellement être analysés à partir du code de l'opérateur.

Ressources supplémentaires

5.7.2.1. Annotations des métadonnées de l'opérateur

Les développeurs d'opérateurs peuvent définir manuellement 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 capacités dans les interfaces utilisateur (UI), telles que OperatorHub.

Le tableau suivant énumère les annotations de métadonnées de l'opérateur qui peuvent être définies manuellement à l'aide des champs metadata.annotations.

Tableau 5.9. Annotations
FieldDescription

alm-examples

Fournir des modèles de définition de ressources personnalisées (CRD) avec un ensemble minimal de configurations. Les interfaces utilisateur compatibles pré-remplissent ce modèle pour que les utilisateurs puissent le personnaliser davantage.

operatorframework.io/initialization-resource

Spécifiez une seule ressource personnalisée requise en ajoutant l'annotation operatorframework.io/initialization-resource à la version du service de 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 qui contient une définition YAML complète.

operatorframework.io/suggested-namespace

Définir un espace de noms suggéré où l'opérateur doit être déployé.

operators.openshift.io/infrastructure-features

Caractéristiques de l'infrastructure prises en charge par l'opérateur. Les utilisateurs peuvent visualiser et filtrer ces caractéristiques lorsqu'ils découvrent des opérateurs via OperatorHub dans la console web. Valeurs valides, sensibles à la casse :

  • disconnected: 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 à l'internet. Toutes les images connexes nécessaires à la création d'un miroir sont répertoriées par l'opérateur.
  • cnf: Operator fournit un plugin Kubernetes Cloud-native Network Functions (CNF).
  • cni: Operator fournit un plugin Kubernetes Container Network Interface (CNI).
  • csi: Operator fournit un plugin Kubernetes Container Storage Interface (CSI).
  • fips: L'opérateur accepte le mode FIPS de la plateforme sous-jacente et travaille sur des nœuds qui sont démarrés en mode FIPS.
Important

The use of FIPS Validated / Modules in Process cryptographic libraries is only supported on OpenShift Container Platform deployments on the x86_64 architecture.

  • proxy-aware: L'opérateur prend en charge l'exécution sur un cluster derrière un proxy. L'opérateur accepte les variables d'environnement de proxy standard HTTP_PROXY et HTTPS_PROXY, que Operator Lifecycle Manager (OLM) fournit automatiquement à l'opérateur lorsque le cluster est configuré pour utiliser un proxy. Les variables d'environnement requises sont transmises aux opérateurs pour les charges de travail gérées.

operators.openshift.io/valid-subscription

Tableau libre permettant d'énumérer les abonnements spécifiques nécessaires à l'utilisation de l'opérateur. Par exemple, '["3Scale Commercial License", "Red Hat Managed Integration"]'.

operators.operatorframework.io/internal-objects

Masque les CRD dans l'interface utilisateur qui ne sont pas destinés à être manipulés par l'utilisateur.

Exemples de cas d'utilisation

L'opérateur prend en charge les services déconnectés et les services proxy

operators.openshift.io/infrastructure-features: '["disconnected", "proxy-aware"]'

L'opérateur a besoin d'une licence OpenShift Container Platform

operators.openshift.io/valid-subscription: '["OpenShift Container Platform"]'

L'opérateur a besoin d'une licence 3scale

operators.openshift.io/valid-subscription: '["3Scale Commercial License", "Red Hat Managed Integration"]'

L'opérateur prend en charge le mode déconnecté et le mode proxy, et nécessite une licence OpenShift Container Platform

operators.openshift.io/infrastructure-features: '["disconnected", "proxy-aware"]'
operators.openshift.io/valid-subscription: '["OpenShift Container Platform"]'

5.7.3. Permettre à votre opérateur de s'adapter à des environnements réseau restreints

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

Exigences de l'opérateur pour la prise en charge du mode déconnecté

  • Remplacer les références d'images codées en dur par des variables d'environnement.
  • Dans la version du service de cluster (CSV) de votre Opérateur :

    • Dressez la liste des related images ou des autres images de conteneurs dont votre opérateur pourrait avoir besoin pour remplir ses fonctions.
    • Référencer toutes les images spécifiées par un condensé (SHA) et non par un tag.
  • Toutes les dépendances de votre opérateur doivent également pouvoir fonctionner en mode déconnecté.
  • Votre opérateur ne doit pas nécessiter de ressources hors cluster.

Conditions préalables

  • Un projet d'opérateur avec un fichier 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éfinir une variable d'environnement pour les références d'images supplémentaires utilisées par l'opérateur dans le fichier config/manager/manager.yaml:

    Exemple 5.10. 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
    1
    Définir la variable d'environnement, par exemple RELATED_IMAGE_MEMCACHED.
    2
    Définir la référence et la balise de l'image associée, par exemple docker.io/memcached:1.4.36-alpine.
  2. Remplacez les références d'images codées en dur par des variables d'environnement dans le fichier correspondant au type de projet de l'opérateur :

    • Pour les projets Operator basés sur Go, ajoutez la variable d'environnement au fichier controllers/memcached_controller.go comme indiqué dans l'exemple suivant :

      Exemple 5.11. Exemple de fichier controllers/memcached_controller.go

        // 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{{
      
      ...
      1
      Supprimer la référence et la balise de l'image.
      2
      Utilisez la fonction os.Getenv pour appeler la fonction <related_image_environment_variable>.
      Note

      La fonction os.Getenv renvoie une chaîne vide si une variable n'est pas définie. Définissez la variable <related_image_environment_variable> avant de modifier le fichier.

    • Pour les projets Operator basés sur Ansible, ajoutez la variable d'environnement au fichier roles/memcached/tasks/main.yml comme indiqué dans l'exemple suivant :

      Exemple 5.12. Exemple de fichier roles/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
      
      ...
      1
      Supprimer la référence et la balise de l'image.
      2
      Utilisez la fonction lookup pour appeler la fonction <related_image_environment_variable>.
    • Pour les projets d'opérateurs basés sur Helm, ajoutez le champ overrideValues au fichier watches.yaml comme indiqué dans l'exemple suivant :

      Exemple 5.13. Exemple de fichier watches.yaml

      ...
      - group: demo.example.com
        version: v1alpha1
        kind: Memcached
        chart: helm-charts/memcached
        overrideValues: 1
          relatedImage: ${<related_image_environment_variable>} 2
      1
      Ajouter le champ overrideValues.
      2
      Définissez le champ overrideValues en utilisant le champ <related_image_environment_variable>, 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: ""

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

        Exemple 5.14. 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
        1
        Ajouter le champ env.
        2
        Nommez la variable d'environnement.
        3
        Définir la valeur de la variable d'environnement.
  3. Ajoutez la définition de la variable BUNDLE_GEN_FLAGS à votre Makefile en y apportant les modifications suivantes :

    Exemple 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
    
    ...

    1
    Supprimer cette ligne dans le site Makefile.
    2
    Remplacer la ligne ci-dessus par cette ligne.
  4. Pour mettre à jour l'image de votre opérateur en utilisant un condensé (SHA) et non une balise, exécutez la commande make bundle et remplacez USE_IMAGE_DIGESTS par true:

    $ make bundle USE_IMAGE_DIGESTS=true
  5. Ajouter l'annotation disconnected, qui indique que l'opérateur travaille dans un environnement déconnecté :

    metadata:
      annotations:
        operators.openshift.io/infrastructure-features: '["disconnected"]'

    Les opérateurs peuvent être filtrés dans OperatorHub grâce à cette fonctionnalité de l'infrastructure.

5.7.4. Permettre à votre opérateur de s'adapter à de multiples architectures et systèmes d'exploitation

Operator Lifecycle Manager (OLM) suppose que tous les opérateurs s'exécutent sur des hôtes Linux. Cependant, en tant qu'auteur d'un opérateur, vous pouvez spécifier si votre opérateur prend en charge la gestion des charges de travail sur d'autres architectures, si des nœuds de travail sont disponibles dans le cluster OpenShift Container Platform.

Si votre opérateur prend en charge des variantes autres que AMD64 et Linux, vous pouvez ajouter des étiquettes à la version du 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 comme suit :

labels:
    operatorframework.io/arch.<arch>: supported 1
    operatorframework.io/os.<os>: supported 2
1
Définir <arch> comme une chaîne prise en charge.
2
Définir <os> comme une chaîne prise en charge.
Note

Seules les étiquettes de la tête de canal du canal par défaut sont prises en compte pour le filtrage des manifestes de paquetage par étiquette. Cela signifie, par exemple, qu'il est possible de fournir une architecture supplémentaire à un opérateur dans le canal autre que celui par défaut, mais que cette architecture n'est pas disponible pour le filtrage dans l'API PackageManifest.

Si un CSV ne comporte pas d'étiquette os, il est traité par défaut comme s'il comportait l'étiquette de support Linux suivante :

labels:
    operatorframework.io/os.linux: supported

Si un CSV ne comporte pas d'étiquette arch, il est traité par défaut comme s'il comportait l'étiquette de prise en charge AMD64 suivante :

labels:
    operatorframework.io/arch.amd64: supported

Si 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

  • Un projet d'opérateur avec un CSV.
  • Pour pouvoir répertorier plusieurs architectures et systèmes d'exploitation, l'image de l'opérateur référencée dans le CSV doit être une image de la liste des manifestes.
  • Pour que l'opérateur fonctionne correctement dans des environnements de réseaux restreints ou déconnectés, l'image référencée doit également être spécifiée à l'aide d'un condensé (SHA) et non d'une balise.

Procédure

  • Ajoutez une étiquette à l'adresse metadata.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
    1 2
    Après avoir ajouté une nouvelle architecture ou un nouveau système d'exploitation, vous devez désormais inclure explicitement les variantes par défaut os.linux et arch.amd64.

Ressources supplémentaires

5.7.4.1. Architecture et système d'exploitation pour les opérateurs

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

Tableau 5.10. Architectures prises en charge par OpenShift Container Platform
ArchitectureString

AMD64

amd64

IBM Power

ppc64le

IBM zSystems

s390x

Tableau 5.11. Systèmes d'exploitation pris en charge par OpenShift Container Platform
Système d'exploitationString

Linux

linux

z/OS

zos

Note

Différentes versions d'OpenShift Container Platform 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.7.5. 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 auxiliaires dans des espaces de noms spécifiques, pour fonctionner correctement. S'il est résolu à partir d'un abonnement, Operator Lifecycle Manager (OLM) définit par défaut les ressources de l'espace de noms d'un opérateur dans l'espace de noms de son abonnement.

En tant qu'auteur d'un Opérateur, vous pouvez exprimer un espace de noms cible souhaité dans le cadre de votre version de service de cluster (CSV) afin de garder le contrôle sur les espaces de noms finaux des ressources installées pour leurs Opérateurs. Lorsque vous ajoutez l'opérateur à un cluster en utilisant OperatorHub, cela permet à la console web de remplir automatiquement l'espace de noms suggéré pour l'administrateur du cluster pendant le processus d'installation.

Procédure

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

    metadata:
      annotations:
        operatorframework.io/suggested-namespace: <namespace> 1
    1
    Définissez l'espace de noms suggéré.

5.7.6. Activation des conditions de l'opérateur

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

Pour prendre en charge les conditions de l'opérateur, celui-ci doit pouvoir lire le CR OperatorCondition créé par OLM et être en mesure d'effectuer les tâches suivantes :

  • Obtenir la condition spécifique.
  • Définir l'état d'une condition spécifique.

Pour ce faire, il suffit d'utiliser la bibliothèque operator-lib library. L'auteur d'un opérateur peut fournir un clientcontroller-runtime dans son opérateur pour que la bibliothèque puisse accéder au CR OperatorCondition appartenant à l'opérateur dans le cluster.

La bibliothèque fournit une interface générique Conditions, qui possède les méthodes suivantes pour Get et Set une conditionType dans la CR OperatorCondition:

Get
Pour obtenir la condition spécifique, la bibliothèque utilise la fonction client.Get de controller-runtime, qui nécessite un ObjectKey de type types.NamespacedName présent dans conditionAccessor.
Set
Pour mettre à jour le statut de la condition spécifique, la bibliothèque utilise la fonction client.Update de controller-runtime. Une erreur se produit si le site conditionType n'est pas présent dans le CRD.

L'opérateur n'est autorisé à modifier que la sous-ressource status du CR. Les opérateurs peuvent soit supprimer, soit mettre à jour le tableau status.conditions pour y inclure la condition. Pour plus de détails sur le format et la description des champs présents dans les conditions, voir les GoDocs des conditions en amont.

Note

Operator SDK v1.10.1 supporte operator-lib v0.3.0.

Conditions préalables

  • Un projet Operator généré à l'aide du SDK Operator.

Procédure

Pour activer les conditions de l'opérateur dans votre projet d'opérateur :

  1. Dans le fichier go.mod de votre projet Operator, ajoutez operator-framework/operator-lib comme bibliothèque requise :

    module github.com/example-inc/memcached-operator
    
    go 1.15
    
    require (
      k8s.io/apimachinery v0.19.2
      k8s.io/client-go v0.19.2
      sigs.k8s.io/controller-runtime v0.7.0
      operator-framework/operator-lib v0.3.0
    )
  2. Écrivez votre propre constructeur dans votre logique d'opérateur qui aboutira aux résultats suivants :

    • Accepte un client controller-runtime.
    • Accepte un conditionType.
    • Renvoie 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 comportant des méthodes permettant d'accéder à la condition Upgradeable. Par exemple, vous pouvez créer une interface avec des méthodes permettant d'accéder à la condition :

    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);

    Dans cet exemple, le constructeur NewUpgradeable est utilisé pour créer une variable cond de type Condition. La variable cond possède à son tour les méthodes Get et Set, qui peuvent être utilisées pour traiter la condition OLM Upgradeable.

Ressources supplémentaires

5.7.7. Définition 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. Operator Lifecycle Manager (OLM) peut gérer le cycle de vie de ces webhooks lorsqu'ils sont livrés avec votre opérateur.

La ressource CSV (Cluster Service Version) d'un opérateur peut inclure une section webhookdefinitions pour définir les types de webhooks suivants :

  • Admission des webhooks (validation et mutation)
  • Crochets web de conversion

Procédure

  • Ajoutez une section webhookdefinitions à la section spec du CSV de votre opérateur et incluez toutes les définitions de webhooks utilisant 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
    ...

    1
    Les CRD ciblés par le webhook de conversion doivent exister ici.
    2
    Un webhook d'admission en cours de validation.
    3
    Un webhook d'admission en mutation.
    4
    Un webhook de conversion.
    5
    La propriété spec.PreserveUnknownFields de chaque CRD doit être réglée sur false ou nil.

5.7.7.1. Considérations sur les webhooks pour OLM

Lorsque vous déployez un opérateur avec des webhooks à l'aide d'Operator Lifecycle Manager (OLM), vous devez définir les éléments suivants :

  • Le champ type doit être défini sur ValidatingAdmissionWebhook, MutatingAdmissionWebhook, ou ConversionWebhook, sinon le CSV sera placé dans une phase d'échec.
  • Le fichier CSV doit contenir un déploiement dont le nom est équivalent à la valeur fournie dans le champ deploymentName du fichier webhookdefinition.

Lorsque le webhook est créé, OLM veille à ce qu'il n'agisse que sur les espaces de noms qui correspondent au groupe d'opérateurs dans lequel l'opérateur est déployé.

Contraintes de l'autorité de certification

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

  • Le fichier du certificat TLS est monté sur le déploiement à l'adresse /apiserver.local.config/certificates/apiserver.crt.
  • Le fichier de clés TLS est monté sur le déploiement à l'adresse /apiserver.local.config/certificates/apiserver.key.
Contraintes liées aux règles d'admission des webhooks

Pour éviter qu'un opérateur ne configure le cluster dans un état irrécupérable, OLM place le CSV dans la phase d'échec si les règles définies dans un webhook d'admission interceptent l'une des demandes suivantes :

  • Des demandes qui ciblent tous les groupes
  • Demandes ciblant le groupe operators.coreos.com
  • Demandes ciblant les ressources ValidatingWebhookConfigurations ou MutatingWebhookConfigurations
Contraintes de conversion des webhooks

OLM place le CSV dans la phase d'échec si la définition d'un webhook de conversion ne respecte pas les contraintes suivantes :

  • Les CSV comportant un webhook de conversion ne peuvent prendre en charge que le mode d'installation AllNamespaces.
  • Le champ spec.preserveUnknownFields du CRD ciblé par le webhook de conversion doit avoir la valeur false ou nil.
  • Le webhook de conversion défini dans le CSV doit cibler un CRD appartenant à l'entreprise.
  • Il ne peut y avoir qu'un seul webhook de conversion sur l'ensemble du cluster pour un CRD donné.

5.7.8. Comprendre les définitions de ressources personnalisées (CRD)

Il existe deux types de définitions de ressources personnalisées (CRD) que votre opérateur peut utiliser : celles qu'il utilise à l'adresse owned et celles dont il dépend à l'adresse required.

5.7.8.1. CRD détenus

Les définitions de ressources personnalisées (CRD) appartenant à votre opérateur constituent la partie la plus importante de votre CSV. Elles établissent le lien entre votre opérateur et les règles RBAC requises, la gestion des dépendances et d'autres concepts Kubernetes.

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

Tableau 5.12. Champs de CRD possédés
FieldDescriptionObligatoire/facultatif

Name

Le nom complet de votre CRD.

Exigée

Version

La version de cet objet API.

Exigée

Kind

Le nom lisible par machine de votre CRD.

Exigée

DisplayName

Une version lisible de votre nom de CRD, par exemple MongoDB Standalone.

Exigée

Description

Une brève description de l'utilisation de ce CRD par l'opérateur ou une description de la fonctionnalité fournie par le CRD.

Exigée

Group

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

En option

Resources

Vos CRD possèdent un ou plusieurs types d'objets Kubernetes. Ceux-ci sont répertoriés dans la section resources pour informer vos utilisateurs des objets dont ils pourraient avoir besoin pour dépanner ou pour se connecter à l'application, comme le service ou la règle d'entrée qui expose une base de données.

Il est recommandé de ne répertorier que les objets qui sont importants pour un être humain, et non pas une liste exhaustive de tout ce que vous orchestrez. Par exemple, ne listez pas les cartes de configuration qui stockent un état interne qui n'est pas censé être modifié par un utilisateur.

En option

SpecDescriptors, StatusDescriptors, et ActionDescriptors

Ces descripteurs sont un moyen d'indiquer aux interfaces utilisateur certaines entrées ou sorties de votre opérateur qui sont les plus importantes pour l'utilisateur final. Si votre CRD contient le nom d'un secret ou d'une carte 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 interfaces utilisateur compatibles.

Il existe trois types de descripteurs :

  • SpecDescriptors: Une référence aux champs du bloc spec d'un objet.
  • StatusDescriptors: Une référence aux champs du bloc status d'un objet.
  • ActionDescriptors: Une référence aux actions qui peuvent être effectuées sur un objet.

Tous les descripteurs acceptent les champs suivants :

  • DisplayName: Un nom lisible par l'homme pour le site Spec, Status ou Action.
  • Description: Brève description de Spec, Status ou Action et de son utilisation par l'opérateur.
  • Path: Chemin d'accès au champ de l'objet décrit par ce descripteur, délimité par des points.
  • X-Descriptors: Utilisé pour déterminer les capacités de ce descripteur et le composant d'interface utilisateur à utiliser. Voir le projet openshift/console pour une liste canonique de descripteurs React UI X-Descriptors pour OpenShift Container Platform.

Voir également le projet openshift/console pour plus d'informations sur les descripteurs en général.

En option

L'exemple suivant décrit un CRD MongoDB Standalone qui nécessite une entrée utilisateur sous la forme d'un secret et d'une carte de configuration, et qui orchestre des services, des ensembles avec état, des pods et des cartes de configuration :

Exemple de CRD détenu

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

5.7.8.2. CRDs requis

Le recours à d'autres CRD obligatoires est totalement 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.

Par exemple, un opérateur peut configurer une application et installer un cluster etcd (provenant d'un opérateur etcd) pour le verrouillage distribué et une base de données Postgres (provenant d'un opérateur Postgres) pour le stockage des données.

Operator Lifecycle Manager (OLM) vérifie que les CRD et les opérateurs disponibles dans le cluster répondent à ces exigences. Si des versions appropriées sont trouvées, les opérateurs sont démarrés dans l'espace de noms souhaité et un compte de service est créé pour chaque opérateur afin de créer, surveiller et modifier les ressources Kubernetes requises.

Tableau 5.13. Champs obligatoires du CRD
FieldDescriptionObligatoire/facultatif

Name

Le nom complet du CRD dont vous avez besoin.

Exigée

Version

La version de cet objet API.

Exigée

Kind

Le type d'objet Kubernetes.

Exigée

DisplayName

Une version du CRD lisible par l'homme.

Exigée

Description

Un résumé de la manière dont le composant s'intègre dans votre architecture globale.

Exigée

Exemple de CRD requis

    required:
    - name: etcdclusters.etcd.database.coreos.com
      version: v1beta2
      kind: EtcdCluster
      displayName: etcd Cluster
      description: Represents a cluster of etcd nodes.

5.7.8.3. Améliorations du CRD

OLM met à niveau une définition de ressource personnalisée (CRD) immédiatement si elle appartient à une seule version de service de cluster (CSV). Si une CRD appartient à plusieurs CSV, elle est mise à niveau lorsqu'elle remplit toutes les conditions de compatibilité ascendante suivantes :

  • Toutes les versions de service existantes dans le CRD actuel sont présentes dans le nouveau CRD.
  • Toutes les instances existantes, ou les ressources personnalisées, qui sont associées aux versions de service du document de référence sont valides lorsqu'elles sont validées par rapport au schéma de validation du nouveau document de référence.
5.7.8.3.1. Ajouter une nouvelle version du CRD

Procédure

Pour ajouter une nouvelle version d'un CRD à votre opérateur :

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

    Par exemple, si le CRD actuel a une version v1alpha1 et que vous souhaitez ajouter une nouvelle version v1beta1 et la marquer comme la 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
    1
    Nouvelle entrée.
  2. Veillez à ce que la version de référence du CRD dans la section owned de votre CSV soit 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
    1
    Mettre à jour le site version.
  3. Transférez le CRD et le CSV mis à jour vers votre bundle.
5.7.8.3.2. Déclassement ou suppression d'une version du CRD

Operator Lifecycle Manager (OLM) ne permet pas de supprimer immédiatement une version en 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 served du CRD sur false. Ensuite, la version non servante peut être supprimée lors de la mise à niveau ultérieure du CRD.

Procédure

Déclasser et supprimer une version spécifique d'un CRD :

  1. Marquez la version obsolète comme n'étant pas utile pour indiquer que cette version n'est plus utilisée et qu'elle peut être supprimée lors d'une mise à jour ultérieure. Par exemple :

    versions:
      - name: v1alpha1
        served: false 1
        storage: true
    1
    Régler sur false.
  2. Passer de la version storage à une version de service si la version à supprimer est actuellement la version storage. Par exemple :

    versions:
      - name: v1alpha1
        served: false
        storage: false 1
      - name: v1beta1
        served: true
        storage: true 2
    1 2
    Mettez à jour les champs storage en conséquence.
    Note

    Pour supprimer d'un CRD une version spécifique qui est ou était la version storage, cette version doit être supprimée de storedVersion dans le statut du CRD. OLM tentera de le faire pour vous s'il détecte qu'une version stockée n'existe plus dans le nouveau CRD.

  3. Mettre à jour le CRD avec les modifications ci-dessus.
  4. Lors des cycles de mise à niveau ultérieurs, la version qui ne sert pas peut être complètement supprimée du document de référence. Par exemple :

    versions:
      - name: v1beta1
        served: true
        storage: true
  5. Veillez à ce que la version du CRD de référence dans la section owned de votre CSV soit mise à jour en conséquence si cette version est retirée du CRD.

5.7.8.4. Modèles de CRD

Les utilisateurs de votre opérateur doivent savoir quelles options sont obligatoires ou facultatives. Vous pouvez fournir des modèles pour chacune de vos définitions de ressources personnalisées (CRD) avec un ensemble minimum de configurations sous la forme d'une annotation nommée alm-examples. Les interfaces utilisateur compatibles rempliront ce modèle à l'avance pour que les utilisateurs puissent le personnaliser davantage.

L'annotation consiste en une liste du type, par exemple, le nom du CRD et les adresses metadata et spec 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":"default"},"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>"}}}]

5.7.8.5. Masquage des objets internes

Il est courant que les opérateurs utilisent des définitions de ressources personnalisées (CRD) en interne pour accomplir une tâche. Ces objets ne sont pas destinés à être manipulés par les utilisateurs et peuvent prêter à confusion pour les utilisateurs de l'opérateur. Par exemple, un opérateur de base de données peut avoir un CRD Replication qui est créé chaque fois qu'un utilisateur crée un objet Base de données avec replication: true.

En tant qu'auteur d'un opérateur, vous pouvez masquer dans l'interface utilisateur les CRD qui ne sont pas destinés à être manipulés par l'utilisateur en ajoutant l'annotation operators.operatorframework.io/internal-objects à la version du service de cluster (CSV) de votre opérateur.

Procédure

  1. Avant de marquer l'un de vos CRD comme interne, assurez-vous que les informations de débogage ou la configuration éventuellement nécessaires pour gérer l'application sont reflétées dans le statut ou le bloc spec de votre CR, si cela s'applique à votre opérateur.
  2. Ajoutez l'annotation operators.operatorframework.io/internal-objects au CSV de votre opérateur pour spécifier les objets internes à cacher dans l'interface utilisateur :

    Annotation d'un objet interne

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

    1
    Définir tout CRD interne comme un tableau de chaînes de caractères.

5.7.8.6. Initialisation des ressources personnalisées requises

Un opérateur peut exiger de l'utilisateur qu'il instancie une ressource personnalisée avant que l'opérateur ne soit 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 Operator, vous pouvez spécifier une seule ressource personnalisée requise en ajoutant operatorframework.io/initialization-resource à la version du service de cluster (CSV) lors de l'installation d'Operator. Vous êtes alors invité à créer la ressource personnalisée à l'aide d'un modèle fourni dans la CSV. L'annotation doit inclure un modèle qui contient une définition YAML complète nécessaire pour initialiser la ressource lors de l'installation.

Si cette annotation est définie, après avoir installé l'opérateur à partir de la console web d'OpenShift Container Platform, l'utilisateur est invité à créer la ressource en utilisant le modèle fourni dans le CSV.

Procédure

  • Ajoutez l'annotation operatorframework.io/initialization-resource au CSV de votre opérateur pour spécifier une ressource personnalisée requise. Par exemple, l'annotation suivante exige la création d'une ressource StorageCluster et fournit une définition YAML complète :

    Annotation de la ressource 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": {}
                        }
                    ]
                }
            }
    ...

5.7.9. Comprendre vos services API

Comme pour les CRD, il existe deux types de services API que votre opérateur peut utiliser : owned et required.

5.7.9.1. Services API propres

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

Un service API est identifié de manière unique par le groupe/la version qu'il fournit et peut être listé plusieurs fois pour indiquer les différents types de services qu'il est censé fournir.

Tableau 5.14. Champs de service API propres
FieldDescriptionObligatoire/facultatif

Group

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

Exigée

Version

Version du service API, par exemple v1alpha1.

Exigée

Kind

Type de service que le service API est censé fournir.

Exigée

Name

Le nom pluriel du service API fourni.

Exigée

DeploymentName

Nom du déploiement défini par votre CSV qui correspond à votre service API (requis pour les services API détenus). Pendant la phase d'attente du CSV, l'opérateur OLM recherche sur le site InstallStrategy de votre CSV une spécification Deployment dont le nom correspond et, si elle n'est pas trouvée, ne fait pas passer le CSV à la phase "Install Ready".

Exigée

DisplayName

Une version lisible du nom de votre service API, par exemple MongoDB Standalone.

Exigée

Description

Une brève description de la manière dont ce service API est utilisé par l'opérateur ou une description de la fonctionnalité fournie par le service API.

Exigée

Resources

Vos services API possèdent un ou plusieurs types d'objets Kubernetes. Ceux-ci sont répertoriés dans la section des ressources afin d'informer vos utilisateurs des objets dont ils pourraient avoir besoin pour dépanner ou pour se connecter à l'application, comme le service ou la règle d'entrée qui expose une base de données.

Il est recommandé de ne répertorier que les objets qui sont importants pour un être humain, et non pas une liste exhaustive de tout ce que vous orchestrez. Par exemple, ne listez pas les cartes de configuration qui stockent un état interne qui n'est pas censé être modifié par un utilisateur.

En option

SpecDescriptors, StatusDescriptors, et ActionDescriptors

Essentiellement la même chose que pour les CRD détenus.

En option

5.7.9.1.1. Création d'une ressource de service API

Le gestionnaire du cycle de vie de l'opérateur (OLM) est chargé de créer ou de remplacer le service et les ressources du service API pour chaque service API unique appartenant à l'opérateur :

  • Les sélecteurs de pods de service sont copiés à partir du déploiement CSV correspondant au champ DeploymentName de la description du service API.
  • Une nouvelle paire clé/certificat d'autorité de certification est générée pour chaque installation et le paquet d'autorités de certification codé en base64 est incorporé dans la ressource de service API correspondante.
5.7.9.1.2. Service API servant des certificats

OLM se charge de la génération d'une paire clé/certificat de service lors de l'installation d'un service API appartenant à l'utilisateur. Le certificat de service a un nom commun (CN) contenant le nom d'hôte de la ressource Service générée et est signé par la clé privée de la liasse CA intégrée dans la ressource de service API correspondante.

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

S'il n'existe pas encore, un montage de volume avec un nom correspondant est également ajouté à tous les conteneurs de ce déploiement. Cela permet aux utilisateurs de définir un montage de volume avec le nom attendu pour répondre à toute exigence de chemin d'accès personnalisé. Le chemin du montage de volume généré est par défaut /apiserver.local.config/certificates et tous les montages de volume existants ayant le même chemin sont remplacés.

5.7.9.2. Required API services

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

Tableau 5.15. Champs obligatoires du service API
FieldDescriptionObligatoire/facultatif

Group

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

Exigée

Version

Version du service API, par exemple v1alpha1.

Exigée

Kind

Type de service que le service API est censé fournir.

Exigée

DisplayName

Une version lisible du nom de votre service API, par exemple MongoDB Standalone.

Exigée

Description

Une brève description de la manière dont ce service API est utilisé par l'opérateur ou une description de la fonctionnalité fournie par le service API.

Exigé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.