2.4. Gestionnaire du cycle de vie des opérateurs (OLM)


2.4.1. Concepts et ressources du gestionnaire du cycle de vie de l'opérateur

Ce guide fournit une vue d'ensemble des concepts qui régissent Operator Lifecycle Manager (OLM) dans OpenShift Container Platform.

2.4.1.1. Qu'est-ce que l'Operator Lifecycle Manager ?

Operator Lifecycle Manager (OLM) aide les utilisateurs à installer, mettre à jour et gérer le cycle de vie des applications natives Kubernetes (Operators) et de leurs services associés s'exécutant sur leurs clusters OpenShift Container Platform. Il fait partie de l'Operator Framework, une boîte à outils open source conçue pour gérer les opérateurs de manière efficace, automatisée et évolutive.

Figure 2.2. Flux de travail du gestionnaire du cycle de vie de l'opérateur

olm workflow

OLM fonctionne par défaut dans OpenShift Container Platform 4.12, ce qui aide les administrateurs de clusters à installer, mettre à niveau et accorder l'accès aux opérateurs fonctionnant sur leur cluster. La console web d'OpenShift Container Platform fournit des écrans de gestion permettant aux administrateurs de cluster d'installer des opérateurs, ainsi que d'accorder à des projets spécifiques l'accès à l'utilisation du catalogue d'opérateurs disponibles sur le cluster.

Pour les développeurs, une expérience en libre-service permet de provisionner et de configurer des instances de bases de données, de surveillance et de services de big data sans avoir à être des experts en la matière, car l'opérateur dispose de ces connaissances.

2.4.1.2. Ressources OLM

Les définitions de ressources personnalisées (CRD) suivantes sont définies et gérées par Operator Lifecycle Manager (OLM) :

Tableau 2.1. CRDs gérés par OLM et les opérateurs de catalogues
RessourcesNom courtDescription

ClusterServiceVersion (CSV)

csv

Métadonnées de l'application. Par exemple : nom, version, icône, ressources nécessaires.

CatalogSource

catsrc

Un référentiel de CSV, CRD et paquets qui définissent une application.

Subscription

sub

Maintient les CSV à jour en suivant un canal dans un paquet.

InstallPlan

ip

Liste calculée des ressources à créer pour installer ou mettre à jour automatiquement un CSV.

OperatorGroup

og

Configure tous les opérateurs déployés dans le même espace de noms que l'objet OperatorGroup pour qu'ils surveillent leur ressource personnalisée (CR) dans une liste d'espaces de noms ou à l'échelle du cluster.

OperatorConditions

-

Crée un canal de communication entre OLM et un opérateur qu'il gère. Les opérateurs peuvent écrire dans le tableau Status.Conditions pour communiquer des états complexes à OLM.

2.4.1.2.1. Version du service de cluster

Un cluster service version (CSV) représente une version spécifique d'un Operator en cours d'exécution sur un cluster OpenShift Container Platform. Il s'agit d'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 le cluster.

OLM a besoin de ces métadonnées sur un opérateur pour s'assurer qu'il peut être exécuté en toute sécurité sur un cluster et pour fournir des informations sur la manière dont les mises à jour doivent être appliquées lorsque de nouvelles versions de l'opérateur sont publiées. Cela ressemble à l'empaquetage d'un logiciel pour un système d'exploitation traditionnel ; considérez l'étape d'empaquetage pour OLM comme l'étape à laquelle vous créez votre paquet rpm, deb, ou apk.

Un CSV comprend les métadonnées qui accompagnent l'image d'un conteneur d'opérateur, utilisées pour remplir les interfaces utilisateur avec des informations telles que le nom, la version, la description, les étiquettes, le lien vers le référentiel et le logo.

Un CSV est également une source d'informations techniques nécessaires à l'exécution de l'opérateur, telles que les ressources personnalisées (CR) qu'il gère ou dont il dépend, les règles RBAC, les exigences du cluster et les stratégies d'installation. Ces informations indiquent à OLM comment créer les ressources requises et configurer l'opérateur en tant que déploiement.

2.4.1.2.2. Source du catalogue

Un site catalog source représente un magasin de métadonnées, généralement en faisant référence à un site index image stocké dans un registre de conteneurs. Operator Lifecycle Manager (OLM) interroge les sources du catalogue pour découvrir et installer les opérateurs et leurs dépendances. OperatorHub dans la console web d'OpenShift Container Platform affiche également les opérateurs fournis par les sources du catalogue.

Astuce

Les administrateurs de cluster peuvent consulter la liste complète des opérateurs fournis par une source de catalogue activée sur un cluster en utilisant la page Administration Cluster Settings Configuration OperatorHub de la console web.

Le site spec d'un objet CatalogSource indique comment construire un pod ou comment communiquer avec un service qui sert l'API gRPC du registre des opérateurs.

Exemple 2.8. Exemple d'objet CatalogSource

apiVersion: operators.coreos.com/v1alpha1
kind: CatalogSource
metadata:
  generation: 1
  name: example-catalog 1
  namespace: openshift-marketplace 2
  annotations:
    olm.catalogImageTemplate: 3
      "quay.io/example-org/example-catalog:v{kube_major_version}.{kube_minor_version}.{kube_patch_version}"
spec:
  displayName: Example Catalog 4
  image: quay.io/example-org/example-catalog:v1 5
  priority: -400 6
  publisher: Example Org
  sourceType: grpc 7
  grpcPodConfig:
    securityContextConfig: <security_mode> 8
    nodeSelector: 9
      custom_label: <label>
    priorityClassName: system-cluster-critical 10
    tolerations: 11
      - key: "key1"
        operator: "Equal"
        value: "value1"
        effect: "NoSchedule"
  updateStrategy:
    registryPoll: 12
      interval: 30m0s
status:
  connectionState:
    address: example-catalog.openshift-marketplace.svc:50051
    lastConnect: 2021-08-26T18:14:31Z
    lastObservedState: READY 13
  latestImageRegistryPoll: 2021-08-26T18:46:25Z 14
  registryService: 15
    createdAt: 2021-08-26T16:16:37Z
    port: 50051
    protocol: grpc
    serviceName: example-catalog
    serviceNamespace: openshift-marketplace
1
Nom de l'objet CatalogSource. Cette valeur est également utilisée comme partie du nom du pod connexe qui est créé dans l'espace de noms demandé.
2
Espace de noms dans lequel créer le catalogue. Pour rendre le catalogue disponible à l'échelle du cluster dans tous les espaces de noms, définissez cette valeur sur openshift-marketplace. Les sources de catalogues fournies par Red Hat par défaut utilisent également l'espace de noms openshift-marketplace. Sinon, définissez la valeur sur un espace de noms spécifique pour que l'opérateur ne soit disponible que dans cet espace de noms.
3
Facultatif : Pour éviter que les mises à niveau de clusters ne laissent les installations Operator dans un état non pris en charge ou sans chemin de mise à jour continu, vous pouvez activer le changement automatique de la version de l'image d'index de votre catalogue Operator dans le cadre des mises à niveau de clusters.

Définissez l'annotation olm.catalogImageTemplate avec le nom de votre image d'index et utilisez une ou plusieurs variables de version du cluster Kubernetes comme indiqué lors de la construction du modèle pour la balise d'image. L'annotation remplace le champ spec.image au moment de l'exécution. Voir la section "Modèle d'image pour les sources de catalogue personnalisées" pour plus de détails.

4
Nom d'affichage du catalogue dans la console web et la CLI.
5
Image d'index pour le catalogue. En option, peut être omis lors de l'utilisation de l'annotation olm.catalogImageTemplate, qui définit la spécification d'extraction au moment de l'exécution.
6
Poids de la source du catalogue. OLM utilise ce poids pour établir des priorités lors de la résolution des dépendances. Un poids élevé indique que le catalogue est préféré aux catalogues de poids inférieur.
7
Les types de sources sont les suivants :
  • grpc avec une référence image: OLM extrait l'image et exécute le pod, qui est censé servir une API conforme.
  • grpc avec un champ address: OLM tente de contacter l'API gRPC à l'adresse indiquée. Ce champ ne doit pas être utilisé dans la plupart des cas.
  • configmap: OLM analyse les données de la carte de configuration et exécute un pod qui peut servir l'API gRPC.
8
Spécifiez la valeur de legacy ou restricted. Si le champ n'est pas défini, la valeur par défaut est legacy. Dans une prochaine version d'OpenShift Container Platform, il est prévu que la valeur par défaut soit restricted. Si votre catalogue ne peut pas s'exécuter avec les autorisations restricted, il est recommandé de définir manuellement ce champ sur legacy.
9
Facultatif : Pour les sources de catalogue de type grpc, remplace le sélecteur de nœud par défaut pour le pod qui sert le contenu dans spec.image, s'il est défini.
10
Facultatif : Pour les sources de catalogue de type grpc, remplace le nom de la classe de priorité par défaut pour le pod qui sert le contenu dans spec.image, s'il est défini. Kubernetes fournit les classes de priorité system-cluster-critical et system-node-critical par défaut. La définition d'un champ vide ("") attribue au pod la priorité par défaut. D'autres classes de priorité peuvent être définies manuellement.
11
Facultatif : Pour les sources de catalogue de type grpc, remplace les tolérances par défaut pour le pod servant le contenu dans spec.image, si elles sont définies.
12
Vérifier automatiquement la présence de nouvelles versions à un intervalle donné pour rester à jour.
13
Dernier état observé de la connexion au catalogue. Par exemple :
  • READY: Une connexion est établie avec succès.
  • CONNECTING: Une connexion tente de s'établir.
  • TRANSIENT_FAILURE: Un problème temporaire s'est produit lors de la tentative d'établissement d'une connexion, tel qu'un dépassement de délai. L'état repassera éventuellement à CONNECTING et la tentative recommencera.

Pour plus de détails, voir la section États de connectivité dans la documentation gRPC.

14
Dernière heure à laquelle le registre du conteneur stockant l'image du catalogue a été interrogé pour s'assurer que l'image est à jour.
15
Informations sur l'état du service de registre des opérateurs du catalogue.

La référence à name d'un objet CatalogSource dans un abonnement indique à OLM où rechercher l'opérateur demandé :

Exemple 2.9. Exemple Subscription objet référençant une source de catalogue

apiVersion: operators.coreos.com/v1alpha1
kind: Subscription
metadata:
  name: example-operator
  namespace: example-namespace
spec:
  channel: stable
  name: example-operator
  source: example-catalog
  sourceNamespace: openshift-marketplace
2.4.1.2.2.1. Modèle d'image pour les sources de catalogue personnalisées

La compatibilité de l'opérateur avec le cluster sous-jacent peut être exprimée par une source de catalogue de différentes manières. L'une d'entre elles, utilisée pour les sources de catalogue fournies par défaut par Red Hat, consiste à identifier des balises d'image pour les images d'index qui sont spécifiquement créées pour une version de plateforme particulière, par exemple OpenShift Container Platform 4.12.

Au cours d'une mise à niveau de cluster, la balise d'image d'index pour les sources de catalogue par défaut fournies par Red Hat est mise à jour automatiquement par l'opérateur de version de cluster (CVO) afin que Operator Lifecycle Manager (OLM) tire la version mise à jour du catalogue. Par exemple, lors d'une mise à niveau d'OpenShift Container Platform 4.11 à 4.12, le champ spec.image dans l'objet CatalogSource pour le catalogue redhat-operators est mis à jour de :

registry.redhat.io/redhat/redhat-operator-index:v4.11

à :

registry.redhat.io/redhat/redhat-operator-index:v4.12

Cependant, l'OVC ne met pas automatiquement à jour les balises d'image pour les catalogues personnalisés. Pour s'assurer que les utilisateurs disposent d'une installation d'Operator compatible et prise en charge après une mise à niveau du cluster, les catalogues personnalisés doivent également être mis à jour pour faire référence à une image d'index mise à jour.

À partir d'OpenShift Container Platform 4.9, les administrateurs de clusters peuvent ajouter l'annotation olm.catalogImageTemplate dans l'objet CatalogSource pour les catalogues personnalisés à une référence d'image qui inclut un modèle. Les variables de version Kubernetes suivantes sont prises en charge pour une utilisation dans le modèle :

  • kube_major_version
  • kube_minor_version
  • kube_patch_version
Note

Vous devez spécifier la version du cluster Kubernetes et non celle du cluster OpenShift Container Platform, car cette dernière n'est actuellement pas disponible pour le templating.

À condition d'avoir créé et poussé une image d'index avec une balise spécifiant la version Kubernetes mise à jour, la définition de cette annotation permet de modifier automatiquement les versions de l'image d'index dans les catalogues personnalisés après une mise à niveau du cluster. La valeur de l'annotation est utilisée pour définir ou mettre à jour la référence de l'image dans le champ spec.image de l'objet CatalogSource. Cela permet d'éviter que les mises à niveau de cluster ne laissent les installations d'opérateurs dans des états non pris en charge ou sans chemin de mise à jour continu.

Important

Vous devez vous assurer que l'image d'index avec la balise mise à jour, quel que soit le registre dans lequel elle est stockée, est accessible par le cluster au moment de la mise à niveau du cluster.

Exemple 2.10. Exemple de source de catalogue avec un modèle d'image

apiVersion: operators.coreos.com/v1alpha1
kind: CatalogSource
metadata:
  generation: 1
  name: example-catalog
  namespace: openshift-marketplace
  annotations:
    olm.catalogImageTemplate:
      "quay.io/example-org/example-catalog:v{kube_major_version}.{kube_minor_version}"
spec:
  displayName: Example Catalog
  image: quay.io/example-org/example-catalog:v1.25
  priority: -400
  publisher: Example Org
Note

Si le champ spec.image et l'annotation olm.catalogImageTemplate sont tous deux définis, le champ spec.image est remplacé par la valeur résolue de l'annotation. Si l'annotation n'aboutit pas à une spécification d'extraction utilisable, la source du catalogue revient à la valeur définie pour spec.image.

Si le champ spec.image n'est pas défini et que l'annotation ne se résout pas en une spécification d'extraction utilisable, OLM interrompt le rapprochement de la source du catalogue et la place dans une condition d'erreur lisible par l'homme.

Pour un cluster OpenShift Container Platform 4.12, qui utilise Kubernetes 1.25, l'annotation olm.catalogImageTemplate dans l'exemple précédent se résout à la référence d'image suivante :

quay.io/example-org/example-catalog:v1.25

Pour les futures versions d'OpenShift Container Platform, vous pouvez créer des images d'index mises à jour pour vos catalogues personnalisés qui ciblent la version Kubernetes ultérieure utilisée par la version ultérieure d'OpenShift Container Platform. Avec l'annotation olm.catalogImageTemplate définie avant la mise à niveau, la mise à niveau du cluster vers la version ultérieure d'OpenShift Container Platform mettrait automatiquement à jour l'image d'index du catalogue.

2.4.1.2.3. Abonnement

Un subscription, défini par un objet Subscription, représente l'intention d'installer un opérateur. C'est la ressource personnalisée qui relie un opérateur à une source de catalogue.

Les abonnements décrivent le canal d'un paquetage d'opérateur auquel il faut s'abonner et s'il faut effectuer les mises à jour automatiquement ou manuellement. S'il est défini sur automatique, l'abonnement permet à Operator Lifecycle Manager (OLM) de gérer et de mettre à jour l'opérateur afin de garantir que la dernière version est toujours en cours d'exécution dans le cluster.

Exemple d'objet Subscription

apiVersion: operators.coreos.com/v1alpha1
kind: Subscription
metadata:
  name: example-operator
  namespace: example-namespace
spec:
  channel: stable
  name: example-operator
  source: example-catalog
  sourceNamespace: openshift-marketplace

Cet objet Subscription définit le nom et l'espace de noms de l'opérateur, ainsi que le catalogue dans lequel les données de l'opérateur peuvent être trouvées. Le canal, tel que alpha, beta, ou stable, permet de déterminer quel flux d'opérateur doit être installé à partir de la source du catalogue.

Les noms des canaux dans un abonnement peuvent varier d'un opérateur à l'autre, mais le système de dénomination doit suivre une convention commune au sein d'un opérateur donné. Par exemple, les noms des canaux peuvent suivre un flux de mises à jour de versions mineures pour l'application fournie par l'opérateur (1.2, 1.3) ou une fréquence de publication (stable, fast).

En plus d'être facilement visible depuis la console web d'OpenShift Container Platform, il est possible d'identifier la disponibilité d'une version plus récente d'un Operator en inspectant l'état de l'abonnement correspondant. La valeur associée au champ currentCSV est la version la plus récente connue par OLM, et installedCSV est la version installée sur le cluster.

2.4.1.2.4. Plan d'installation

Un install plan, défini par un objet InstallPlan, décrit un ensemble de ressources que Operator Lifecycle Manager (OLM) crée pour installer ou mettre à niveau une version spécifique d'un opérateur. La version est définie par une version de service de cluster (CSV).

Pour installer un opérateur, un administrateur de cluster ou un utilisateur ayant reçu des autorisations d'installation d'opérateur doit d'abord créer un objet Subscription. Un abonnement représente l'intention de s'abonner à un flux de versions disponibles d'un opérateur à partir d'une source de catalogue. L'abonnement crée ensuite un objet InstallPlan pour faciliter l'installation des ressources de l'opérateur.

Le plan d'installation doit ensuite être approuvé selon l'une des stratégies d'approbation suivantes :

  • Si le champ spec.installPlanApproval de l'abonnement est défini sur Automatic, le plan d'installation est approuvé automatiquement.
  • Si le champ spec.installPlanApproval de l'abonnement est défini sur Manual, le plan d'installation doit être approuvé manuellement par un administrateur de cluster ou un utilisateur disposant des autorisations appropriées.

Une fois le plan d'installation approuvé, OLM crée les ressources spécifiées et installe l'opérateur dans l'espace de noms spécifié par l'abonnement.

Exemple 2.11. Exemple d'objet InstallPlan

apiVersion: operators.coreos.com/v1alpha1
kind: InstallPlan
metadata:
  name: install-abcde
  namespace: operators
spec:
  approval: Automatic
  approved: true
  clusterServiceVersionNames:
    - my-operator.v1.0.1
  generation: 1
status:
  ...
  catalogSources: []
  conditions:
    - lastTransitionTime: '2021-01-01T20:17:27Z'
      lastUpdateTime: '2021-01-01T20:17:27Z'
      status: 'True'
      type: Installed
  phase: Complete
  plan:
    - resolving: my-operator.v1.0.1
      resource:
        group: operators.coreos.com
        kind: ClusterServiceVersion
        manifest: >-
        ...
        name: my-operator.v1.0.1
        sourceName: redhat-operators
        sourceNamespace: openshift-marketplace
        version: v1alpha1
      status: Created
    - resolving: my-operator.v1.0.1
      resource:
        group: apiextensions.k8s.io
        kind: CustomResourceDefinition
        manifest: >-
        ...
        name: webservers.web.servers.org
        sourceName: redhat-operators
        sourceNamespace: openshift-marketplace
        version: v1beta1
      status: Created
    - resolving: my-operator.v1.0.1
      resource:
        group: ''
        kind: ServiceAccount
        manifest: >-
        ...
        name: my-operator
        sourceName: redhat-operators
        sourceNamespace: openshift-marketplace
        version: v1
      status: Created
    - resolving: my-operator.v1.0.1
      resource:
        group: rbac.authorization.k8s.io
        kind: Role
        manifest: >-
        ...
        name: my-operator.v1.0.1-my-operator-6d7cbc6f57
        sourceName: redhat-operators
        sourceNamespace: openshift-marketplace
        version: v1
      status: Created
    - resolving: my-operator.v1.0.1
      resource:
        group: rbac.authorization.k8s.io
        kind: RoleBinding
        manifest: >-
        ...
        name: my-operator.v1.0.1-my-operator-6d7cbc6f57
        sourceName: redhat-operators
        sourceNamespace: openshift-marketplace
        version: v1
      status: Created
      ...
2.4.1.2.5. Groupes d'opérateurs

Un site Operator group, défini par la ressource OperatorGroup, fournit une configuration multitenant aux opérateurs installés dans OLM. Un groupe d'opérateurs sélectionne des espaces de noms cibles dans lesquels générer l'accès RBAC requis pour les opérateurs qui en font partie.

L'ensemble des espaces de noms cibles est fourni par une chaîne délimitée par des virgules, stockée dans l'annotation olm.targetNamespaces d'une version de service de cluster (CSV). Cette annotation est appliquée aux instances CSV des opérateurs membres et est projetée dans leurs déploiements.

Ressources supplémentaires

2.4.1.2.6. Conditions de l'opérateur

Dans le cadre de son rôle de gestion du cycle de vie d'un opérateur, Operator Lifecycle Manager (OLM) déduit l'état d'un opérateur à partir de l'état des ressources Kubernetes qui définissent l'opérateur. Bien que cette approche fournisse un certain niveau d'assurance qu'un opérateur est dans un état donné, il y a de nombreux cas où un opérateur peut avoir besoin de communiquer des informations à OLM qui ne pourraient pas être déduites autrement. Ces informations peuvent alors être utilisées par OLM pour mieux gérer le cycle de vie de l'opérateur.

OLM fournit une définition de ressource personnalisée (CRD) appelée OperatorCondition qui permet aux opérateurs de communiquer des conditions à OLM. Il existe un ensemble de conditions prises en charge qui influencent la gestion de l'opérateur par OLM lorsqu'elles sont présentes dans le tableau Spec.Conditions d'une ressource OperatorCondition.

Note

Par défaut, le tableau Spec.Conditions n'est pas présent dans un objet OperatorCondition jusqu'à ce qu'il soit ajouté par un utilisateur ou à la suite d'une logique d'opérateur personnalisée.

Ressources supplémentaires

2.4.2. Architecture du gestionnaire du cycle de vie de l'opérateur

Ce guide présente l'architecture des composants de Operator Lifecycle Manager (OLM) dans OpenShift Container Platform.

2.4.2.1. Responsabilités des composantes

Le gestionnaire du cycle de vie des opérateurs (OLM) est composé de deux opérateurs : l'opérateur OLM et l'opérateur de catalogue.

Chacun de ces opérateurs est responsable de la gestion des définitions de ressources personnalisées (CRD) qui constituent la base du cadre OLM :

Tableau 2.2. CRDs gérés par OLM et les opérateurs de catalogues
RessourcesNom courtPropriétaireDescription

ClusterServiceVersion (CSV)

csv

OLM

Métadonnées de l'application : nom, version, icône, ressources nécessaires, installation, etc.

InstallPlan

ip

Catalogue

Liste calculée des ressources à créer pour installer ou mettre à jour automatiquement un CSV.

CatalogSource

catsrc

Catalogue

Un référentiel de CSV, CRD et paquets qui définissent une application.

Subscription

sub

Catalogue

Utilisé pour maintenir les CSV à jour en suivant un canal dans un paquet.

OperatorGroup

og

OLM

Configure tous les opérateurs déployés dans le même espace de noms que l'objet OperatorGroup pour qu'ils surveillent leur ressource personnalisée (CR) dans une liste d'espaces de noms ou à l'échelle du cluster.

Chacun de ces opérateurs est également responsable de la création des ressources suivantes :

Tableau 2.3. Ressources créées par les opérateurs OLM et Catalogue
RessourcesPropriétaire

Deployments

OLM

ServiceAccounts

(Cluster)Roles

(Cluster)RoleBindings

CustomResourceDefinitions (CRD)

Catalogue

ClusterServiceVersions

2.4.2.2. Opérateur OLM

L'opérateur OLM est chargé de déployer les applications définies par les ressources CSV une fois que les ressources requises spécifiées dans le CSV sont présentes dans le cluster.

L'opérateur OLM ne s'occupe pas de la création des ressources nécessaires ; vous pouvez choisir de créer manuellement ces ressources à l'aide du CLI ou de l'opérateur de catalogue. Cette séparation des préoccupations permet aux utilisateurs de s'approprier progressivement la partie du cadre OLM qu'ils choisissent d'exploiter pour leur application.

L'opérateur OLM utilise le flux de travail suivant :

  1. Surveillez les versions de service de cluster (CSV) dans un espace de noms et vérifiez que les exigences sont respectées.
  2. Si les conditions sont remplies, exécutez la stratégie d'installation pour le CSV.

    Note

    Un CSV doit être un membre actif d'un groupe d'opérateurs pour que la stratégie d'installation s'exécute.

2.4.2.3. Opérateur de catalogue

L'opérateur de catalogue est responsable de la résolution et de l'installation des versions de service de cluster (CSV) et des ressources requises qu'elles spécifient. Il est également chargé de surveiller les sources du catalogue pour détecter les mises à jour des paquets dans les canaux et de les mettre à niveau, automatiquement si nécessaire, vers les dernières versions disponibles.

Pour suivre un paquet dans un canal, vous pouvez créer un objet Subscription configurant le paquet souhaité, le canal et l'objet CatalogSource que vous souhaitez utiliser pour extraire les mises à jour. Lorsque des mises à jour sont trouvées, un objet InstallPlan approprié est écrit dans l'espace de noms au nom de l'utilisateur.

L'opérateur de catalogue utilise le flux de travail suivant :

  1. Connectez-vous à chaque source de catalogue dans le cluster.
  2. Rechercher les plans d'installation non résolus créés par un utilisateur et, le cas échéant, les trouver :

    1. Rechercher le fichier CSV correspondant au nom demandé et l'ajouter en tant que ressource résolue.
    2. Pour chaque CRD géré ou requis, ajouter le CRD en tant que ressource résolue.
    3. Pour chaque CRD requis, trouvez le CSV qui le gère.
  3. Surveillez les plans d'installation résolus et créez toutes les ressources découvertes, si elles ont été approuvées par un utilisateur ou automatiquement.
  4. Surveillez les sources et les abonnements du catalogue et créez des plans d'installation basés sur ces sources et abonnements.

2.4.2.4. Registre du catalogue

Le registre de catalogue stocke les CSV et les CRD pour la création dans un cluster et stocke les métadonnées sur les paquets et les canaux.

Un site package manifest est une entrée dans le registre du catalogue qui associe une identité de paquet à des ensembles de CSV. Au sein d'un paquet, les canaux pointent vers un CSV particulier. Comme les CSV font explicitement référence au CSV qu'ils remplacent, un manifeste de paquet fournit à l'opérateur de catalogue toutes les informations nécessaires pour mettre à jour un CSV vers la dernière version d'un canal, en passant par chaque version intermédiaire.

2.4.3. Flux de travail du gestionnaire du cycle de vie de l'opérateur

Ce guide décrit le flux de travail de l'Operator Lifecycle Manager (OLM) dans OpenShift Container Platform.

2.4.3.1. Processus d'installation et de mise à niveau de l'opérateur dans OLM

Dans l'écosystème du gestionnaire du cycle de vie des opérateurs (OLM), les ressources suivantes sont utilisées pour résoudre les problèmes d'installation et de mise à niveau des opérateurs :

  • ClusterServiceVersion (CSV)
  • CatalogSource
  • Subscription

Les métadonnées des opérateurs, définies dans des fichiers CSV, peuvent être stockées dans une collection appelée source de catalogue. OLM utilise les sources du catalogue, qui utilisent l'API du registre des opérateurs, pour rechercher les opérateurs disponibles ainsi que les mises à niveau des opérateurs installés.

Figure 2.3. Vue d'ensemble des sources du catalogue

olm catalogsource

Au sein d'un catalogue source, les opérateurs sont organisés en packages et en flux de mises à jour appelés channels, ce qui devrait être un modèle de mise à jour familier d'OpenShift Container Platform ou d'autres logiciels à cycle de publication continu tels que les navigateurs Web.

Figure 2.4. Paquets et chaînes dans un catalogue source

olm channels

Un utilisateur indique un paquet et un canal particuliers dans une source de catalogue particulière dans un subscription, par exemple un paquet etcd et son canal alpha. Si un abonnement est souscrit pour un paquet qui n'a pas encore été installé dans l'espace de nommage, le dernier opérateur pour ce paquet est installé.

Note

OLM évite délibérément les comparaisons de versions, de sorte que l'opérateur "latest" ou "newest" disponible sur un chemin donné catalog channel package ne doit pas nécessairement être le numéro de version le plus élevé. Il doit plutôt être considéré comme la référence head d'un canal, à l'instar d'un dépôt Git.

Chaque CSV a un paramètre replaces qui indique l'opérateur qu'il remplace. Il en résulte un graphe de CSV qui peut être interrogé par OLM et dont les mises à jour peuvent être partagées entre les canaux. Les canaux peuvent être considérés comme des points d'entrée dans le graphe des mises à jour :

Figure 2.5. Graphique OLM des mises à jour des canaux disponibles

olm replaces

Exemples de chaînes dans un paquet

packageName: example
channels:
- name: alpha
  currentCSV: example.v0.1.2
- name: beta
  currentCSV: example.v0.1.3
defaultChannel: alpha

Pour qu'OLM puisse demander avec succès des mises à jour, compte tenu d'une source de catalogue, d'un paquet, d'un canal et d'un CSV, un catalogue doit pouvoir renvoyer, sans ambiguïté et de manière déterministe, un CSV unique qui replaces le CSV d'entrée.

2.4.3.1.1. Exemple de chemin de mise à niveau

Pour un exemple de scénario de mise à niveau, considérons un opérateur installé correspondant à la version CSV 0.1.1. OLM interroge la source du catalogue et détecte une mise à niveau dans le canal souscrit avec la nouvelle version CSV 0.1.3 qui remplace une version CSV plus ancienne mais non installée 0.1.2, qui à son tour remplace la version CSV plus ancienne et installée 0.1.1.

OLM remonte de la tête de réseau aux versions précédentes via le champ replaces spécifié dans les CSV pour déterminer le chemin de mise à niveau 0.1.3 0.1.2 0.1.1; le sens de la flèche indique que la première version remplace la seconde. OLM met à niveau l'opérateur une version à la fois jusqu'à ce qu'il atteigne la tête de canal.

Pour ce scénario, OLM installe la version de l'opérateur 0.1.2 pour remplacer la version existante de l'opérateur 0.1.1. Ensuite, il installe la version de l'opérateur 0.1.3 pour remplacer la version de l'opérateur 0.1.2 précédemment installée. À ce stade, la version de l'opérateur installée 0.1.3 correspond à la tête de canal et la mise à niveau est terminée.

2.4.3.1.2. Sauter des mises à niveau

Le chemin de base pour les mises à niveau dans OLM est le suivant :

  • Une source de catalogue est mise à jour avec une ou plusieurs mises à jour d'un opérateur.
  • OLM parcourt toutes les versions de l'opérateur jusqu'à la dernière version que contient la source du catalogue.

Cependant, il arrive que cette opération ne soit pas sûre. Dans certains cas, une version publiée d'un opérateur ne doit jamais être installée sur un cluster si ce n'est pas déjà fait, par exemple parce qu'une version introduit une vulnérabilité grave.

Dans ce cas, OLM doit prendre en compte deux états de la grappe et fournir un graphique de mise à jour qui prenne en charge les deux états :

  • L'opérateur intermédiaire "bad" a été vu par le cluster et installé.
  • L'opérateur intermédiaire "bad" n'a pas encore été installé sur le cluster.

En envoyant un nouveau catalogue et en ajoutant une version skipped, OLM est assuré de toujours recevoir une mise à jour unique, quel que soit l'état du cluster et qu'il ait ou non déjà vu la mauvaise mise à jour.

Exemple de CSV avec la version sautée

apiVersion: operators.coreos.com/v1alpha1
kind: ClusterServiceVersion
metadata:
  name: etcdoperator.v0.9.2
  namespace: placeholder
  annotations:
spec:
    displayName: etcd
    description: Etcd Operator
    replaces: etcdoperator.v0.9.0
    skips:
    - etcdoperator.v0.9.1

Prenons l'exemple suivant : Old CatalogSource et New CatalogSource.

Figure 2.6. Sauter des mises à jour

olm skipping updates

Ce graphique le confirme :

  • Tout opérateur trouvé dans Old CatalogSource a un seul remplaçant dans New CatalogSource.
  • Tout opérateur trouvé dans New CatalogSource a un seul remplaçant dans New CatalogSource.
  • Si la mauvaise mise à jour n'a pas encore été installée, elle ne le sera jamais.
2.4.3.1.3. Remplacement de plusieurs opérateurs

La création de New CatalogSource comme décrit nécessite la publication de CSV qui replace un Opérateur, mais peut skip plusieurs. Ceci peut être réalisé en utilisant l'annotation skipRange:

olm.skipRange : <semver_range>

<semver_range> a le format de la gamme de versions supporté par la bibliothèque semver.

Lors de la recherche de mises à jour dans les catalogues, si l'en-tête d'un canal comporte une annotation skipRange et que l'opérateur actuellement installé possède un champ de version compris dans la plage, OLM effectue une mise à jour de la dernière entrée du canal.

L'ordre de priorité est le suivant :

  1. Tête de chaîne dans la source spécifiée par sourceName sur l'abonnement, si les autres critères de saut sont remplis.
  2. L'opérateur suivant qui remplace l'opérateur actuel, dans la source spécifiée par sourceName.
  3. Tête de chaîne dans une autre source visible pour l'abonnement, si les autres critères de saut sont remplis.
  4. L'opérateur suivant qui remplace l'opérateur actuel dans toute source visible par l'abonnement.

Exemple de CSV avec skipRange

apiVersion: operators.coreos.com/v1alpha1
kind: ClusterServiceVersion
metadata:
    name: elasticsearch-operator.v4.1.2
    namespace: <namespace>
    annotations:
        olm.skipRange: '>=4.1.0 <4.1.2'

2.4.3.1.4. Prise en charge du flux Z

Une version z-stream, ou patch, doit remplacer toutes les versions précédentes de z-stream pour la même version mineure. OLM ne tient pas compte des versions majeures, mineures ou des correctifs, il lui suffit de construire le graphique correct dans un catalogue.

En d'autres termes, OLM doit être capable de prendre un graphique comme dans Old CatalogSource et, comme précédemment, de générer un graphique comme dans New CatalogSource:

Figure 2.7. Remplacement de plusieurs opérateurs

olm z stream

Ce graphique le confirme :

  • Tout opérateur trouvé dans Old CatalogSource a un seul remplaçant dans New CatalogSource.
  • Tout opérateur trouvé dans New CatalogSource a un seul remplaçant dans New CatalogSource.
  • Toute version de z-stream dans Old CatalogSource sera mise à jour avec la dernière version de z-stream dans New CatalogSource.
  • Les rejets non disponibles peuvent être considérés comme des nœuds de graphe "virtuels" ; leur contenu n'a pas besoin d'exister, le registre doit simplement répondre comme si le graphe ressemblait à ceci.

2.4.4. Résolution des dépendances de l'Operator Lifecycle Manager

Ce guide présente les cycles de vie de la résolution des dépendances et de la mise à niveau des définitions de ressources personnalisées (CRD) avec Operator Lifecycle Manager (OLM) dans OpenShift Container Platform.

2.4.4.1. À propos de la résolution des dépendances

Le gestionnaire du cycle de vie des opérateurs (OLM) gère la résolution des dépendances et le cycle de vie des mises à jour des opérateurs en cours d'exécution. À bien des égards, les problèmes rencontrés par OLM sont similaires à ceux d'autres gestionnaires de paquets de systèmes ou de langues, tels que yum et rpm.

Cependant, il existe une contrainte que les systèmes similaires n'ont généralement pas et qu'OLM respecte : comme les opérateurs sont toujours en cours d'exécution, OLM s'efforce de garantir que vous ne vous retrouvez jamais avec un ensemble d'opérateurs qui ne fonctionnent pas les uns avec les autres.

Par conséquent, OLM ne doit jamais créer les scénarios suivants :

  • Installer un ensemble d'opérateurs nécessitant des API qui ne peuvent être fournies
  • Mettre à jour un opérateur de manière à interrompre un autre opérateur qui en dépend

Cela est possible grâce à deux types de données :

Propriétés

Métadonnées typées sur l'opérateur qui constituent son interface publique dans le résolveur de dépendances. Les exemples incluent le groupe/version/genre (GVK) des API fournies par l'opérateur et la version sémantique (semver) de l'opérateur.

Contraintes ou dépendances

Les exigences d'un opérateur qui doivent être satisfaites par d'autres opérateurs qui peuvent ou non avoir déjà été installés sur le cluster cible. Ces exigences agissent comme des requêtes ou des filtres sur tous les opérateurs disponibles et limitent la sélection lors de la résolution des dépendances et de l'installation. Il s'agit par exemple d'exiger qu'une API spécifique soit disponible sur le cluster ou d'attendre l'installation d'un opérateur particulier avec une version particulière.

OLM convertit ces propriétés et ces contraintes en un système de formules booléennes et les transmet à un solveur SAT, un programme qui établit la satisfiabilité booléenne, qui se charge de déterminer quels opérateurs doivent être installés.

2.4.4.2. Propriétés de l'opérateur

Tous les opérateurs d'un catalogue ont les propriétés suivantes :

olm.package
Inclut le nom du paquet et la version de l'opérateur
olm.gvk
Une propriété unique pour chaque API fournie à partir de la version du service de cluster (CSV)

Des propriétés supplémentaires peuvent également être déclarées directement par l'auteur d'un opérateur en incluant un fichier properties.yaml dans le répertoire metadata/ de l'ensemble Operator.

Exemple de propriété arbitraire

properties:
- type: olm.kubeversion
  value:
    version: "1.16.0"

2.4.4.2.1. Propriétés arbitraires

Les auteurs d'opérateurs peuvent déclarer des propriétés arbitraires dans un fichier properties.yaml dans le répertoire metadata/ du paquet Operator. Ces propriétés sont traduites en une structure de données cartographique qui sert d'entrée au résolveur du gestionnaire du cycle de vie de l'opérateur (OLM) au moment de l'exécution.

Ces propriétés sont opaques pour le résolveur car il ne les comprend pas, mais il peut évaluer les contraintes génériques par rapport à ces propriétés pour déterminer si les contraintes peuvent être satisfaites compte tenu de la liste des propriétés.

Exemple de propriétés arbitraires

properties:
  - property:
      type: color
      value: red
  - property:
      type: shape
      value: square
  - property:
      type: olm.gvk
      value:
        group: olm.coreos.io
        version: v1alpha1
        kind: myresource

Cette structure peut être utilisée pour construire une expression CEL (Common Expression Language) pour les contraintes génériques.

2.4.4.3. Dépendances des opérateurs

Les dépendances d'un Opérateur sont listées dans un fichier dependencies.yaml dans le dossier metadata/ d'un bundle. Ce fichier est facultatif et n'est actuellement utilisé que pour spécifier les dépendances explicites de la version de l'opérateur.

La liste des dépendances contient un champ type pour chaque élément afin de spécifier de quel type de dépendance il s'agit. Les types de dépendances de l'opérateur suivants sont pris en charge :

olm.package
Ce type indique une dépendance pour une version spécifique de l'opérateur. Les informations sur la dépendance doivent inclure le nom du paquet et la version du paquet au format semver. Par exemple, vous pouvez spécifier une version exacte telle que 0.5.2 ou une plage de versions telle que >0.5.1.
olm.gvk
Avec ce type, l'auteur peut spécifier une dépendance avec des informations sur le groupe, la version et le type (GVK), de manière similaire à l'utilisation existante des CRD et des API dans un CSV. Il s'agit d'un chemin permettant aux auteurs d'opérateurs de consolider toutes les dépendances, API ou versions explicites, au même endroit.
olm.constraint
Ce type déclare des contraintes génériques sur des propriétés arbitraires de l'opérateur.

Dans l'exemple suivant, des dépendances sont spécifiées pour un opérateur Prometheus et des CRD etcd :

Exemple de fichier dependencies.yaml

dependencies:
  - type: olm.package
    value:
      packageName: prometheus
      version: ">0.27.0"
  - type: olm.gvk
    value:
      group: etcd.database.coreos.com
      kind: EtcdCluster
      version: v1beta2

2.4.4.4. Contraintes génériques

Une propriété olm.constraint déclare une contrainte de dépendance d'un type particulier, en distinguant les propriétés sans contrainte et les propriétés avec contrainte. Son champ value est un objet contenant un champ failureMessage qui contient une représentation sous forme de chaîne de caractères du message de la contrainte. Ce message est affiché sous la forme d'un commentaire informatif à l'intention des utilisateurs si la contrainte n'est pas satisfaisable au moment de l'exécution.

Les clés suivantes indiquent les types de contraintes disponibles :

gvk
Type dont la valeur et l'interprétation sont identiques au type olm.gvk
package
Type dont la valeur et l'interprétation sont identiques au type olm.package
cel
Une expression en langage d'expression commun (CEL) évaluée au moment de l'exécution par le résolveur du gestionnaire du cycle de vie de l'opérateur (OLM) sur des propriétés arbitraires de l'ensemble et des informations sur les grappes
all, any, not
Contraintes de conjonction, de disjonction et de négation, respectivement, contenant une ou plusieurs contraintes concrètes, telles que gvk ou une contrainte composée imbriquée
2.4.4.4.1. Contraintes du langage d'expression commun (CEL)

Le type de contrainte cel prend en charge le langage d'expression commun (CEL) en tant que langage d'expression. La structure cel possède un champ rule qui contient la chaîne d'expression CEL évaluée par rapport aux propriétés de l'opérateur au moment de l'exécution afin de déterminer si l'opérateur satisfait à la contrainte.

Exemple de contrainte cel

type: olm.constraint
value:
  failureMessage: 'require to have "certified"'
  cel:
    rule: 'properties.exists(p, p.type == "certified")'

La syntaxe CEL prend en charge un large éventail d'opérateurs logiques, tels que AND et OR. Par conséquent, une expression CEL unique peut comporter plusieurs règles pour plusieurs conditions liées entre elles par ces opérateurs logiques. Ces règles sont évaluées par rapport à un ensemble de données de propriétés différentes provenant d'une liasse ou d'une source donnée, et la sortie est résolue en une liasse ou un opérateur unique qui satisfait à toutes ces règles dans le cadre d'une contrainte unique.

Exemple cel Contrainte avec plusieurs règles

type: olm.constraint
value:
  failureMessage: 'require to have "certified" and "stable" properties'
  cel:
    rule: 'properties.exists(p, p.type == "certified") && properties.exists(p, p.type == "stable")'

2.4.4.4.2. Contraintes composées (tout, n'importe quoi, pas)

Les types de contraintes composées sont évalués conformément à leurs définitions logiques.

Voici un exemple de contrainte conjonctive (all) de deux paquets et d'un GVK. C'est-à-dire qu'ils doivent tous être satisfaits par les paquets installés :

Exemple de contrainte all

schema: olm.bundle
name: red.v1.0.0
properties:
- type: olm.constraint
  value:
    failureMessage: All are required for Red because...
    all:
      constraints:
      - failureMessage: Package blue is needed for...
        package:
          name: blue
          versionRange: '>=1.0.0'
      - failureMessage: GVK Green/v1 is needed for...
        gvk:
          group: greens.example.com
          version: v1
          kind: Green

Voici un exemple de contrainte disjonctive (any) de trois versions du même GVK. C'est-à-dire qu'au moins l'une d'entre elles doit être satisfaite par les liasses installées :

Exemple de contrainte any

schema: olm.bundle
name: red.v1.0.0
properties:
- type: olm.constraint
  value:
    failureMessage: Any are required for Red because...
    any:
      constraints:
      - gvk:
          group: blues.example.com
          version: v1beta1
          kind: Blue
      - gvk:
          group: blues.example.com
          version: v1beta2
          kind: Blue
      - gvk:
          group: blues.example.com
          version: v1
          kind: Blue

Voici un exemple de contrainte de négation (not) d'une version d'un GVK. En d'autres termes, ce kit ne peut être fourni par aucune liasse de l'ensemble des résultats :

Exemple de contrainte not

schema: olm.bundle
name: red.v1.0.0
properties:
- type: olm.constraint
  value:
  all:
    constraints:
    - failureMessage: Package blue is needed for...
      package:
        name: blue
        versionRange: '>=1.0.0'
    - failureMessage: Cannot be required for Red because...
      not:
        constraints:
        - gvk:
            group: greens.example.com
            version: v1alpha1
            kind: greens

La sémantique de la négation peut sembler peu claire dans le contexte de la contrainte not. Pour clarifier, la négation demande en fait au résolveur de supprimer de l'ensemble des résultats toute solution possible qui inclut un GVK particulier, un paquetage à une version, ou qui satisfait à une contrainte composée enfant.

En corollaire, la contrainte composée not ne doit être utilisée qu'à l'intérieur des contraintes all ou any, car la négation sans sélection préalable d'un ensemble possible de dépendances n'a pas de sens.

2.4.4.4.3. Contraintes composées imbriquées

Une contrainte composée imbriquée, qui contient au moins une contrainte composée fille ainsi que zéro ou plusieurs contraintes simples, est évaluée de bas en haut en suivant les procédures applicables à chaque type de contrainte décrit précédemment.

Voici un exemple de disjonction de conjonctions, où l'une, l'autre ou les deux peuvent satisfaire à la contrainte :

Exemple de contrainte composée imbriquée

schema: olm.bundle
name: red.v1.0.0
properties:
- type: olm.constraint
  value:
    failureMessage: Required for Red because...
    any:
      constraints:
      - all:
          constraints:
          - package:
              name: blue
              versionRange: '>=1.0.0'
          - gvk:
              group: blues.example.com
              version: v1
              kind: Blue
      - all:
          constraints:
          - package:
              name: blue
              versionRange: '<1.0.0'
          - gvk:
              group: blues.example.com
              version: v1beta1
              kind: Blue

Note

La taille brute maximale d'un type olm.constraint est de 64 Ko afin de limiter les attaques par épuisement des ressources.

2.4.4.5. Préférences en matière de dépendance

Il peut y avoir plusieurs options qui répondent également à une dépendance d'un opérateur. Le résolveur de dépendances du gestionnaire du cycle de vie des opérateurs (OLM) détermine l'option qui répond le mieux aux exigences de l'opérateur demandé. En tant qu'auteur ou utilisateur d'un opérateur, il peut être important de comprendre comment ces choix sont faits afin que la résolution des dépendances soit claire.

2.4.4.5.1. Priorité au catalogue

Sur le cluster OpenShift Container Platform, OLM lit les sources du catalogue pour savoir quels opérateurs sont disponibles pour l'installation.

Exemple d'objet CatalogSource

apiVersion: "operators.coreos.com/v1alpha1"
kind: "CatalogSource"
metadata:
  name: "my-operators"
  namespace: "operators"
spec:
  sourceType: grpc
  grpcPodConfig:
    securityContextConfig: <security_mode> 1
  image: example.com/my/operator-index:v1
  displayName: "My Operators"
  priority: 100

1
Spécifiez la valeur de legacy ou restricted. Si le champ n'est pas défini, la valeur par défaut est legacy. Dans une prochaine version d'OpenShift Container Platform, il est prévu que la valeur par défaut soit restricted. Si votre catalogue ne peut pas s'exécuter avec les autorisations restricted, il est recommandé de définir manuellement ce champ sur legacy.

Un objet CatalogSource possède un champ priority, qui est utilisé par le résolveur pour savoir comment préférer les options pour une dépendance.

Deux règles régissent les préférences en matière de catalogues :

  • Les options des catalogues de priorité supérieure sont préférées aux options des catalogues de priorité inférieure.
  • Les options du même catalogue que la personne dépendante sont préférées à tout autre catalogue.
2.4.4.5.2. Commande de chaînes

Un paquet Operator dans un catalogue est une collection de canaux de mise à jour auxquels un utilisateur peut s'abonner dans un cluster OpenShift Container Platform. Les canaux peuvent être utilisés pour fournir un flux particulier de mises à jour pour une version mineure (1.2, 1.3) ou une fréquence de publication (stable, fast).

Il est probable qu'une dépendance soit satisfaite par des opérateurs dans le même paquet, mais dans des canaux différents. Par exemple, la version 1.2 d'un opérateur peut exister dans les canaux stable et fast.

Chaque paquet a un canal par défaut, qui est toujours préféré aux autres canaux. Si aucune option du canal par défaut ne peut satisfaire une dépendance, les options des canaux restants sont prises en compte dans l'ordre lexicographique du nom du canal.

2.4.4.5.3. Ordre à l'intérieur d'un canal

Il existe presque toujours plusieurs options pour satisfaire une dépendance au sein d'un même canal. Par exemple, les opérateurs d'un paquet et d'un canal fournissent le même ensemble d'API.

Lorsqu'un utilisateur crée un abonnement, il indique le canal dont il souhaite recevoir les mises à jour. Cela réduit immédiatement la recherche à ce seul canal. Mais à l'intérieur du canal, il est probable que de nombreux opérateurs répondent à une dépendance.

Au sein d'un canal, les nouveaux opérateurs situés plus haut dans le graphe de mise à jour sont privilégiés. Si la tête d'un canal satisfait une dépendance, elle sera essayée en premier.

2.4.4.5.4. Autres contraintes

En plus des contraintes fournies par les dépendances des paquets, OLM inclut des contraintes supplémentaires pour représenter l'état souhaité de l'utilisateur et appliquer les invariants de résolution.

2.4.4.5.4.1. Contrainte d'abonnement

Une contrainte d'abonnement filtre l'ensemble des opérateurs qui peuvent satisfaire un abonnement. Les abonnements sont des contraintes fournies par l'utilisateur au résolveur de dépendances. Elles déclarent l'intention d'installer un nouvel opérateur s'il n'est pas déjà présent sur le cluster, ou de maintenir à jour un opérateur existant.

2.4.4.5.4.2. Contrainte du paquet

Au sein d'un espace de noms, deux opérateurs ne peuvent pas provenir du même paquetage.

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

2.4.4.7. Meilleures pratiques en matière de dépendance

Lorsque vous spécifiez des dépendances, vous devez tenir compte de certaines bonnes pratiques.

Dépendent des API ou d'une gamme de versions spécifiques d'opérateurs
Les opérateurs peuvent ajouter ou supprimer des API à tout moment ; spécifiez toujours une dépendance olm.gvk pour toutes les API dont vos opérateurs ont besoin. L'exception à cette règle est si vous spécifiez des contraintes olm.package à la place.
Fixer une version minimale

La documentation Kubernetes sur les modifications d'API décrit les modifications autorisées pour les opérateurs de type Kubernetes. Ces conventions de versionnement permettent à un opérateur de mettre à jour une API sans modifier la version de l'API, tant que l'API est rétrocompatible.

Pour les dépendances d'opérateurs, cela signifie que la connaissance de la version de l'API d'une dépendance peut ne pas suffire à garantir que l'opérateur dépendant fonctionne comme prévu.

Par exemple :

  • TestOperator v1.0.0 fournit la version API v1alpha1 de la ressource MyObject.
  • TestOperator v1.0.1 ajoute un nouveau champ spec.newfield à MyObject, mais il s'agit toujours de la version 1alpha1.

Votre opérateur peut avoir besoin de la possibilité d'écrire spec.newfield dans la ressource MyObject. Une contrainte olm.gvk ne suffit pas à OLM pour déterminer que vous avez besoin de TestOperator v1.0.1 et non de TestOperator v1.0.0.

Dans la mesure du possible, si un opérateur spécifique qui fournit une API est connu à l'avance, spécifier une contrainte supplémentaire olm.package pour fixer un minimum.

Omettre une version maximale ou autoriser une gamme très large

Étant donné que les opérateurs fournissent des ressources à l'échelle du cluster, telles que des services API et des CRD, un opérateur qui spécifie une petite fenêtre pour une dépendance peut limiter inutilement les mises à jour pour d'autres consommateurs de cette dépendance.

Dans la mesure du possible, ne fixez pas de version maximale. Sinon, définissez une plage sémantique très large pour éviter les conflits avec d'autres opérateurs. Par exemple, >1.0.0 <2.0.0.

Contrairement aux gestionnaires de paquets classiques, les auteurs d'opérateurs indiquent explicitement que les mises à jour sont sûres grâce aux canaux d'OLM. Si une mise à jour est disponible pour un abonnement existant, on suppose que l'auteur de l'opérateur indique qu'il peut mettre à jour la version précédente. La définition d'une version maximale pour une dépendance annule le flux de mises à jour de l'auteur en le tronquant inutilement à une limite supérieure particulière.

Note

Les administrateurs de cluster ne peuvent pas remplacer les dépendances définies par l'auteur d'un opérateur.

Toutefois, des versions maximales peuvent et doivent être fixées s'il existe des incompatibilités connues qui doivent être évitées. Des versions spécifiques peuvent être omises à l'aide de la syntaxe de l'intervalle de versions, par exemple > 1.0.0 !1.2.1.

Ressources supplémentaires

2.4.4.8. Mises en garde concernant la dépendance

Lorsque vous spécifiez des dépendances, vous devez tenir compte de certaines mises en garde.

Pas de contraintes composées (AND)

Il n'existe actuellement aucune méthode pour spécifier une relation ET entre les contraintes. En d'autres termes, il n'existe aucun moyen de spécifier qu'un opérateur dépend d'un autre opérateur qui fournit une API donnée et possède la version >1.1.0.

Cela signifie que lorsqu'on spécifie une dépendance telle que :

dependencies:
- type: olm.package
  value:
    packageName: etcd
    version: ">3.1.0"
- type: olm.gvk
  value:
    group: etcd.database.coreos.com
    kind: EtcdCluster
    version: v1beta2

Il serait possible pour OLM de satisfaire cette exigence avec deux opérateurs : l'un qui fournit EtcdCluster et l'autre qui a la version >3.1.0. Le fait que cela se produise ou qu'un opérateur satisfaisant les deux contraintes soit sélectionné dépend de l'ordre dans lequel les options potentielles sont visitées. Les préférences en matière de dépendance et les options d'ordre sont bien définies et peuvent faire l'objet d'un raisonnement, mais par prudence, les opérateurs doivent s'en tenir à l'un ou l'autre mécanisme.

Compatibilité entre les espaces de noms
OLM effectue la résolution des dépendances au niveau de l'espace de noms. Il est possible de se retrouver dans une impasse de mise à jour si la mise à jour d'un opérateur dans un espace de noms pose un problème à un opérateur dans un autre espace de noms, et vice-versa.

2.4.4.9. Exemples de scénarios de résolution des dépendances

Dans les exemples suivants, provider est un opérateur qui "possède" un service de CRD ou d'API.

Exemple : Déclassement d'API dépendantes

A et B sont des API (CRD) :

  • Le fournisseur de A dépend de B.
  • Le fournisseur de B dispose d'un abonnement.
  • Le fournisseur de B se met à jour pour fournir C mais supprime B.

Il en résulte que :

  • B n'a plus de fournisseur.
  • A ne fonctionne plus.

C'est un cas qu'OLM évite grâce à sa stratégie de mise à jour.

Exemple : Blocage de la version

A et B sont des API :

  • Le fournisseur de A a besoin de B.
  • Le fournisseur de B a besoin de A.
  • Le fournisseur de A se met à jour (fournit A2, exige B2) et supprime A.
  • Le fournisseur de B met à jour (fournit B2, exige A2) et supprime B.

Si OLM tente de mettre à jour A sans mettre simultanément à jour B, ou vice-versa, il ne peut pas passer à de nouvelles versions des opérateurs, même si un nouvel ensemble compatible peut être trouvé.

Il s'agit d'un autre cas où OLM empêche la mise en œuvre de sa stratégie de mise à niveau.

2.4.4.10. Colocalisation des opérateurs dans un espace de noms

Le gestionnaire du cycle de vie des opérateurs (OLM) traite les opérateurs gérés par OLM qui sont installés dans le même espace de noms, ce qui signifie que leurs ressources Subscription sont hébergées dans le même espace de noms, comme des opérateurs liés. Même s'ils ne sont pas réellement liés, OLM prend en compte leurs états, tels que leur version et leur politique de mise à jour, lorsque l'un d'entre eux est mis à jour.

Ce comportement par défaut se manifeste de deux manières :

  • InstallPlan les ressources des mises à jour en cours comprennent les ressources ClusterServiceVersion (CSV) de tous les autres opérateurs qui se trouvent dans le même espace de noms.
  • Tous les opérateurs d'un même espace de noms partagent la même politique de mise à jour. Par exemple, si un opérateur est réglé sur des mises à jour manuelles, les politiques de mise à jour de tous les autres opérateurs sont également réglées sur le mode manuel.

Ces scénarios peuvent entraîner les problèmes suivants :

  • Il devient difficile de raisonner sur les plans d'installation pour les mises à jour d'opérateurs, parce qu'il y a beaucoup plus de ressources définies dans ces plans que le seul opérateur mis à jour.
  • Il devient impossible de faire en sorte que certains opérateurs d'un espace de noms soient mis à jour automatiquement tandis que d'autres le sont manuellement, ce que souhaitent souvent les administrateurs de clusters.

Ces problèmes apparaissent généralement parce que, lors de l'installation d'opérateurs avec la console web d'OpenShift Container Platform, le comportement par défaut installe les opérateurs qui prennent en charge le mode d'installation All namespaces dans l'espace de noms global par défaut openshift-operators.

En tant qu'administrateur de cluster, vous pouvez contourner manuellement ce comportement par défaut en utilisant le flux de travail suivant :

  1. Créer un espace de noms pour l'installation de l'opérateur.
  2. Créez un custom global Operator group, qui est un groupe d'opérateurs qui surveille tous les espaces de noms. En associant ce groupe d'opérateurs à l'espace de noms que vous venez de créer, vous faites de l'espace de noms d'installation un espace de noms global, ce qui rend les opérateurs qui y sont installés disponibles dans tous les espaces de noms.
  3. Installer l'opérateur souhaité dans l'espace de noms de l'installation.

Si l'opérateur a des dépendances, celles-ci sont automatiquement installées dans l'espace de noms pré-créé. Par conséquent, les opérateurs dépendants peuvent avoir la même politique de mise à jour et des plans d'installation partagés. Pour une procédure détaillée, voir "Installer des opérateurs globaux dans des espaces de noms personnalisés".

2.4.5. Groupes d'opérateurs

Ce guide décrit l'utilisation des groupes d'opérateurs avec Operator Lifecycle Manager (OLM) dans OpenShift Container Platform.

2.4.5.1. À propos des groupes d'opérateurs

Un site Operator group, défini par la ressource OperatorGroup, fournit une configuration multitenant aux opérateurs installés dans OLM. Un groupe d'opérateurs sélectionne des espaces de noms cibles dans lesquels générer l'accès RBAC requis pour les opérateurs qui en font partie.

L'ensemble des espaces de noms cibles est fourni par une chaîne délimitée par des virgules, stockée dans l'annotation olm.targetNamespaces d'une version de service de cluster (CSV). Cette annotation est appliquée aux instances CSV des opérateurs membres et est projetée dans leurs déploiements.

2.4.5.2. Appartenance à un groupe d'opérateurs

Un opérateur est considéré comme member d'un groupe d'opérateurs si les conditions suivantes sont remplies :

  • Le CSV de l'opérateur existe dans le même espace de noms que le groupe d'opérateurs.
  • Les modes d'installation figurant dans le CSV de l'opérateur prennent en charge l'ensemble des espaces de noms ciblés par le groupe d'opérateurs.

Un mode d'installation dans un CSV se compose d'un champ InstallModeType et d'un champ booléen Supported. La spécification d'un CSV peut contenir un ensemble de modes d'installation de quatre InstallModeTypes distincts :

Tableau 2.4. Modes d'installation et groupes d'opérateurs pris en charge
Type de mode d'installationDescription

OwnNamespace

L'opérateur peut être membre d'un groupe d'opérateurs qui sélectionne son propre espace de noms.

SingleNamespace

L'opérateur peut être membre d'un groupe d'opérateurs qui sélectionne un espace de noms.

MultiNamespace

L'opérateur peut être membre d'un groupe d'opérateurs qui sélectionne plusieurs espaces de noms.

AllNamespaces

L'opérateur peut être membre d'un groupe d'opérateurs qui sélectionne tous les espaces de noms (l'ensemble d'espaces de noms cible est la chaîne vide "").

Note

Si la spécification d'un CSV omet une entrée de InstallModeType, ce type est considéré comme non pris en charge, sauf si la prise en charge peut être déduite d'une entrée existante qui le prend implicitement en charge.

2.4.5.3. Sélection de l'espace de noms cible

Vous pouvez nommer explicitement l'espace de noms cible d'un groupe d'opérateurs à l'aide du paramètre spec.targetNamespaces:

apiVersion: operators.coreos.com/v1
kind: OperatorGroup
metadata:
  name: my-group
  namespace: my-namespace
spec:
  targetNamespaces:
  - my-namespace

Vous pouvez également spécifier un espace de noms en utilisant un sélecteur d'étiquettes avec le paramètre spec.selector:

apiVersion: operators.coreos.com/v1
kind: OperatorGroup
metadata:
  name: my-group
  namespace: my-namespace
spec:
  selector:
    cool.io/prod: "true"
Important

L'énumération de plusieurs espaces de noms via spec.targetNamespaces ou l'utilisation d'un sélecteur d'étiquettes via spec.selector n'est pas recommandée, car la prise en charge de plus d'un espace de noms cible dans un groupe d'opérateurs sera probablement supprimée dans une prochaine version.

Si spec.targetNamespaces et spec.selector sont tous deux définis, spec.selector est ignoré. Vous pouvez également omettre spec.selector et spec.targetNamespaces pour spécifier un groupe d'opérateurs global, qui sélectionne tous les espaces de noms :

apiVersion: operators.coreos.com/v1
kind: OperatorGroup
metadata:
  name: my-group
  namespace: my-namespace

L'ensemble résolu des espaces de noms sélectionnés est indiqué dans le paramètre status.namespaces d'un groupe d'opérateurs. Le paramètre status.namespace d'un groupe d'opérateurs global contient la chaîne vide (""), qui signale à un opérateur consommateur qu'il doit surveiller tous les espaces de noms.

2.4.5.4. Annotations CSV du groupe d'opérateurs

Les CSV membres d'un groupe d'opérateurs ont les annotations suivantes :

AnnotationDescription

olm.operatorGroup=<group_name>

Contient le nom du groupe d'opérateurs.

olm.operatorNamespace=<group_namespace>

Contient l'espace de noms du groupe d'opérateurs.

olm.targetNamespaces=<target_namespaces>

Contient une chaîne de caractères délimitée par des virgules qui répertorie la sélection de l'espace de noms cible du groupe d'opérateurs.

Note

Toutes les annotations, à l'exception de olm.targetNamespaces, sont incluses dans les CSV copiés. L'omission de l'annotation olm.targetNamespaces sur les CSV copiés empêche la duplication des espaces de noms cibles entre les locataires.

2.4.5.5. Annotation des API fournies

Un group/version/kind (GVK) est un identifiant unique pour une API Kubernetes. Les informations sur les GVK fournis par un groupe d'opérateurs sont indiquées dans une annotation olm.providedAPIs. La valeur de l'annotation est une chaîne composée de <kind>.<version>.<group> délimitée par des virgules. Les GVK des CRD et des services API fournis par tous les CSV membres actifs d'un groupe d'opérateurs sont inclus.

Examinez l'exemple suivant d'un objet OperatorGroup avec un seul membre actif CSV qui fournit la ressource PackageManifest:

apiVersion: operators.coreos.com/v1
kind: OperatorGroup
metadata:
  annotations:
    olm.providedAPIs: PackageManifest.v1alpha1.packages.apps.redhat.com
  name: olm-operators
  namespace: local
  ...
spec:
  selector: {}
  serviceAccount:
    metadata:
      creationTimestamp: null
  targetNamespaces:
  - local
status:
  lastUpdated: 2019-02-19T16:18:28Z
  namespaces:
  - local

2.4.5.6. Contrôle d'accès basé sur les rôles

Lorsqu'un groupe d'opérateurs est créé, trois rôles de grappe sont générés. Chacun contient une règle d'agrégation unique avec un sélecteur de rôle de cluster défini pour correspondre à une étiquette, comme illustré ci-dessous :

Rôle de la grappeÉtiquette à faire correspondre

<operatorgroup_name>-admin

olm.opgroup.permissions/aggregate-to-admin: <operatorgroup_name>

<operatorgroup_name>-edit

olm.opgroup.permissions/aggregate-to-edit: <operatorgroup_name>

<operatorgroup_name>-view

olm.opgroup.permissions/aggregate-to-view: <operatorgroup_name>

Les ressources RBAC suivantes sont générées lorsqu'un CSV devient un membre actif d'un groupe d'opérateurs, tant que le CSV surveille tous les espaces de noms avec le mode d'installation AllNamespaces et n'est pas dans un état d'échec avec la raison InterOperatorGroupOwnerConflict:

  • Rôles de cluster pour chaque ressource API d'un CRD
  • Rôles de cluster pour chaque ressource API d'un service API
  • Rôles supplémentaires et liaisons de rôles
Tableau 2.5. Rôles de cluster générés pour chaque ressource API à partir d'un CRD
Rôle de la grappeParamètres

<kind>.<group>-<version>-admin

Verbes sur <kind>:

  • *

Étiquettes d'agrégation :

  • rbac.authorization.k8s.io/aggregate-to-admin: true
  • olm.opgroup.permissions/aggregate-to-admin: <operatorgroup_name>

<kind>.<group>-<version>-edit

Verbes sur <kind>:

  • create
  • update
  • patch
  • delete

Étiquettes d'agrégation :

  • rbac.authorization.k8s.io/aggregate-to-edit: true
  • olm.opgroup.permissions/aggregate-to-edit: <operatorgroup_name>

<kind>.<group>-<version>-view

Verbes sur <kind>:

  • get
  • list
  • watch

Étiquettes d'agrégation :

  • rbac.authorization.k8s.io/aggregate-to-view: true
  • olm.opgroup.permissions/aggregate-to-view: <operatorgroup_name>

<kind>.<group>-<version>-view-crdview

Verbes sur apiextensions.k8s.io customresourcedefinitions <crd-name> :

  • get

Étiquettes d'agrégation :

  • rbac.authorization.k8s.io/aggregate-to-view: true
  • olm.opgroup.permissions/aggregate-to-view: <operatorgroup_name>
Tableau 2.6. Rôles de cluster générés pour chaque ressource API d'un service API
Rôle de la grappeParamètres

<kind>.<group>-<version>-admin

Verbes sur <kind>:

  • *

Étiquettes d'agrégation :

  • rbac.authorization.k8s.io/aggregate-to-admin: true
  • olm.opgroup.permissions/aggregate-to-admin: <operatorgroup_name>

<kind>.<group>-<version>-edit

Verbes sur <kind>:

  • create
  • update
  • patch
  • delete

Étiquettes d'agrégation :

  • rbac.authorization.k8s.io/aggregate-to-edit: true
  • olm.opgroup.permissions/aggregate-to-edit: <operatorgroup_name>

<kind>.<group>-<version>-view

Verbes sur <kind>:

  • get
  • list
  • watch

Étiquettes d'agrégation :

  • rbac.authorization.k8s.io/aggregate-to-view: true
  • olm.opgroup.permissions/aggregate-to-view: <operatorgroup_name>

Rôles supplémentaires et liaisons de rôles

  • Si le CSV définit exactement un espace de noms cible qui contient *, un rôle de cluster et une liaison de rôle de cluster correspondante sont générés pour chaque permission définie dans le champ permissions du CSV. Toutes les ressources générées reçoivent les étiquettes olm.owner: <csv_name> et olm.owner.namespace: <csv_namespace>.
  • Si le CSV not définit exactement un espace de noms cible qui contient *, tous les rôles et toutes les liaisons de rôles dans l'espace de noms Opérateur avec les étiquettes olm.owner: <csv_name> et olm.owner.namespace: <csv_namespace> sont copiés dans l'espace de noms cible.

2.4.5.7. Copie de fichiers CSV

OLM crée des copies de tous les CSV membres actifs d'un groupe d'opérateurs dans chacun des espaces de noms cibles de ce groupe d'opérateurs. L'objectif d'une copie de CSV est d'indiquer aux utilisateurs d'un espace de noms cible qu'un opérateur spécifique est configuré pour surveiller les ressources créées dans cet espace.

Les CSV copiés ont un motif de statut Copied et sont mis à jour pour correspondre au statut de leur CSV source. L'annotation olm.targetNamespaces est supprimée des CSV copiés avant qu'ils ne soient créés sur le cluster. L'omission de la sélection de l'espace de noms cible évite la duplication des espaces de noms cibles entre les locataires.

Les CSV copiés sont supprimés lorsque le CSV source n'existe plus ou que le groupe d'opérateurs auquel appartient le CSV source ne cible plus l'espace de noms du CSV copié.

Note

Par défaut, le champ disableCopiedCSVs est désactivé. Après avoir activé un champ disableCopiedCSVs, OLM supprime les CSV copiés existants sur un cluster. Lorsqu'un champ disableCopiedCSVs est désactivé, OLM ajoute à nouveau des CSV copiés.

  • Désactiver le champ disableCopiedCSVs:

    $ cat << EOF | oc apply -f -
    apiVersion: operators.coreos.com/v1
    kind: OLMConfig
    metadata:
      name: cluster
    spec:
      features:
        disableCopiedCSVs: false
    EOF
  • Activez le champ disableCopiedCSVs:

    $ cat << EOF | oc apply -f -
    apiVersion: operators.coreos.com/v1
    kind: OLMConfig
    metadata:
      name: cluster
    spec:
      features:
        disableCopiedCSVs: true
    EOF

2.4.5.8. Groupes d'opérateurs statiques

Un groupe d'opérateurs est static si son champ spec.staticProvidedAPIs est défini sur true. Par conséquent, OLM ne modifie pas l'annotation olm.providedAPIs d'un groupe d'opérateurs, ce qui signifie qu'elle peut être définie à l'avance. Cela est utile lorsqu'un utilisateur souhaite utiliser un groupe d'opérateurs pour empêcher la contention des ressources dans un ensemble d'espaces de noms, mais qu'il ne dispose pas de CSV membres actifs qui fournissent les API pour ces ressources.

Voici un exemple de groupe d'opérateurs qui protège les ressources Prometheus dans tous les espaces de noms avec l'annotation something.cool.io/cluster-monitoring: "true":

apiVersion: operators.coreos.com/v1
kind: OperatorGroup
metadata:
  name: cluster-monitoring
  namespace: cluster-monitoring
  annotations:
    olm.providedAPIs: Alertmanager.v1.monitoring.coreos.com,Prometheus.v1.monitoring.coreos.com,PrometheusRule.v1.monitoring.coreos.com,ServiceMonitor.v1.monitoring.coreos.com
spec:
  staticProvidedAPIs: true
  selector:
    matchLabels:
      something.cool.io/cluster-monitoring: "true"

2.4.5.9. Intersection des groupes d'opérateurs

Deux groupes d'opérateurs sont considérés comme ayant intersecting provided APIs si l'intersection de leurs ensembles d'espaces de noms cibles n'est pas un ensemble vide et si l'intersection de leurs ensembles d'API fournis, définis par les annotations olm.providedAPIs, n'est pas un ensemble vide.

Un problème potentiel est que les groupes d'opérateurs dont les API fournies se recoupent peuvent être en concurrence pour les mêmes ressources dans l'ensemble des espaces de noms qui se recoupent.

Note

Lors de la vérification des règles d'intersection, l'espace de noms d'un groupe d'opérateurs est toujours inclus dans les espaces de noms cibles sélectionnés.

Règles d'intersection

Chaque fois qu'un membre actif du CSV se synchronise, OLM interroge le cluster pour connaître l'ensemble des API fournies qui se croisent entre le groupe d'opérateurs du CSV et tous les autres. OLM vérifie ensuite si cet ensemble est vide :

  • Si true et les API fournies par le CSV sont un sous-ensemble de celles du groupe d'opérateurs :

    • Poursuivre la transition.
  • Si true et les API fournies par le CSV sont not un sous-ensemble de celles du groupe d'opérateurs :

    • Si le groupe d'opérateurs est statique :

      • Nettoyer les déploiements qui appartiennent au CSV.
      • Le CSV passe à l'état d'échec avec le motif d'état CannotModifyStaticOperatorGroupProvidedAPIs.
    • Si le groupe d'opérateurs est not statique :

      • Remplacer l'annotation olm.providedAPIs du groupe Operator par l'union de lui-même et des API fournies par le CSV.
  • Si false et les API fournies par le CSV sont not un sous-ensemble de celles du groupe d'opérateurs :

    • Nettoyer les déploiements qui appartiennent au CSV.
    • Le CSV passe à l'état d'échec avec le motif d'état InterOperatorGroupOwnerConflict.
  • Si false et les API fournies par le CSV sont un sous-ensemble de celles du groupe d'opérateurs :

    • Si le groupe d'opérateurs est statique :

      • Nettoyer les déploiements qui appartiennent au CSV.
      • Le CSV passe à l'état d'échec avec le motif d'état CannotModifyStaticOperatorGroupProvidedAPIs.
    • Si le groupe d'opérateurs est not statique :

      • Remplacer l'annotation olm.providedAPIs du groupe Operator par la différence entre lui-même et les API fournies par le CSV.
Note

Les états de défaillance causés par les groupes d'opérateurs sont non terminaux.

Les actions suivantes sont effectuées à chaque fois qu'un groupe d'opérateurs se synchronise :

  • L'ensemble des API fournies par les CSV des membres actifs est calculé à partir du cluster. Les CSV copiés sont ignorés.
  • L'ensemble de clusters est comparé à olm.providedAPIs, et si olm.providedAPIs contient des API supplémentaires, ces API sont supprimées.
  • Tous les CSV qui fournissent les mêmes API dans tous les espaces de noms sont remis en file d'attente. Cela permet de notifier aux CSV en conflit dans des groupes qui se croisent que leur conflit a peut-être été résolu, soit par un redimensionnement, soit par la suppression du CSV en conflit.

2.4.5.10. Limites de la gestion d'un opérateur multilocataire

OpenShift Container Platform offre un support limité pour l'installation simultanée de différentes versions d'un opérateur sur le même cluster. Operator Lifecycle Manager (OLM) installe les opérateurs plusieurs fois dans différents espaces de noms. L'une des contraintes est que les versions de l'API de l'opérateur doivent être identiques.

Les opérateurs sont des extensions du plan de contrôle en raison de leur utilisation des objets CustomResourceDefinition (CRD), qui sont des ressources globales dans Kubernetes. Les différentes versions majeures d'un opérateur ont souvent des CRD incompatibles. Cela les rend incompatibles à installer simultanément dans différents espaces de noms sur un cluster.

Tous les locataires, ou espaces de noms, partagent le même plan de contrôle d'un cluster. Par conséquent, les locataires d'un cluster multi-locataires partagent également des CRD globaux, ce qui limite les scénarios dans lesquels différentes instances du même opérateur peuvent être utilisées en parallèle sur le même cluster.

Les scénarios pris en charge sont les suivants :

  • Opérateurs de différentes versions qui expédient exactement la même définition de CRD (dans le cas de CRD versionnés, exactement le même ensemble de versions)
  • Les opérateurs de différentes versions qui n'expédient pas de CRD, mais dont le CRD est disponible dans un paquet séparé sur OperatorHub

Tous les autres scénarios ne sont pas pris en charge, car l'intégrité des données du cluster ne peut pas être garantie s'il y a plusieurs CRD concurrents ou se chevauchant, provenant de différentes versions de l'opérateur, à réconcilier sur le même cluster.

2.4.5.11. Dépannage des groupes d'opérateurs

L'adhésion
  • L'espace de noms d'un plan d'installation ne doit contenir qu'un seul groupe d'opérateurs. Lors de la génération d'une version de service de cluster (CSV) dans un espace de noms, un plan d'installation considère qu'un groupe d'opérateurs n'est pas valide dans les cas suivants :

    • Aucun groupe d'opérateurs n'existe dans l'espace de noms du plan d'installation.
    • Plusieurs groupes d'opérateurs existent dans l'espace de noms du plan d'installation.
    • Un nom de compte de service incorrect ou inexistant est spécifié dans le groupe Opérateur.

    Si un plan d'installation rencontre un groupe d'opérateurs non valide, le CSV n'est pas généré et la ressource InstallPlan continue à s'installer avec un message pertinent. Par exemple, le message suivant est fourni si plusieurs groupes d'opérateurs existent dans le même espace de noms :

    attenuated service account query failed - more than one operator group(s) are managing this namespace count=2

    count= indique le nombre de groupes d'opérateurs dans l'espace de noms.

  • Si les modes d'installation d'une CSV ne prennent pas en charge la sélection de l'espace de noms cible du groupe d'opérateurs dans son espace de noms, la CSV passe à un état d'échec avec la raison UnsupportedOperatorGroup. Les CSV en état d'échec pour cette raison passent en attente après que la sélection de l'espace de noms cible du groupe d'opérateurs passe à une configuration prise en charge ou que les modes d'installation de la CSV soient modifiés pour prendre en charge la sélection de l'espace de noms cible.

2.4.6. Conditions de l'opérateur

Ce guide explique comment Operator Lifecycle Manager (OLM) utilise les conditions de l'opérateur.

2.4.6.1. À propos des conditions de l'opérateur

Dans le cadre de son rôle de gestion du cycle de vie d'un opérateur, Operator Lifecycle Manager (OLM) déduit l'état d'un opérateur à partir de l'état des ressources Kubernetes qui définissent l'opérateur. Bien que cette approche fournisse un certain niveau d'assurance qu'un opérateur est dans un état donné, il y a de nombreux cas où un opérateur peut avoir besoin de communiquer des informations à OLM qui ne pourraient pas être déduites autrement. Ces informations peuvent alors être utilisées par OLM pour mieux gérer le cycle de vie de l'opérateur.

OLM fournit une définition de ressource personnalisée (CRD) appelée OperatorCondition qui permet aux opérateurs de communiquer des conditions à OLM. Il existe un ensemble de conditions prises en charge qui influencent la gestion de l'opérateur par OLM lorsqu'elles sont présentes dans le tableau Spec.Conditions d'une ressource OperatorCondition.

Note

Par défaut, le tableau Spec.Conditions n'est pas présent dans un objet OperatorCondition jusqu'à ce qu'il soit ajouté par un utilisateur ou à la suite d'une logique d'opérateur personnalisée.

2.4.6.2. Conditions prises en charge

Le gestionnaire du cycle de vie de l'opérateur (OLM) prend en charge les conditions suivantes de l'opérateur.

2.4.6.2.1. État évolutif

La condition Upgradeable Operator empêche le remplacement d'une version de service de cluster (CSV) existante par une version plus récente de la CSV. Cette condition est utile dans les cas suivants

  • Un opérateur est sur le point de lancer un processus critique et ne doit pas être mis à niveau tant que le processus n'est pas terminé.
  • Un opérateur effectue une migration de ressources personnalisées (CR) qui doit être achevée avant que l'opérateur ne soit prêt à être mis à niveau.

Exemple Upgradeable Condition de l'opérateur

apiVersion: operators.coreos.com/v1
kind: OperatorCondition
metadata:
  name: my-operator
  namespace: operators
spec:
  conditions:
  - type: Upgradeable 1
    status: "False" 2
    reason: "migration"
    message: "The Operator is performing a migration."
    lastTransitionTime: "2020-08-24T23:15:55Z"

1
Nom de l'affection.
2
La valeur False indique que l'opérateur n'est pas prêt à être mis à niveau. OLM empêche un CSV qui remplace le CSV existant de l'opérateur de quitter la phase Pending.

2.4.6.3. Ressources supplémentaires

2.4.7. Mesures du gestionnaire du cycle de vie de l'opérateur

2.4.7.1. Métriques exposées

Operator Lifecycle Manager (OLM) expose certaines ressources spécifiques à OLM pour une utilisation par la pile de surveillance de cluster OpenShift Container Platform basée sur Prometheus.

Tableau 2.7. Paramètres exposés par OLM
NomDescription

catalog_source_count

Nombre de sources du catalogue.

catalogsource_ready

État d'une source de catalogue. La valeur 1 indique que la source de catalogue est dans l'état READY. La valeur 0 indique que la source de catalogue n'est pas dans l'état READY.

csv_abnormal

Lors du rapprochement d'une version de service de cluster (CSV), présente chaque fois qu'une version CSV est dans un état autre que Succeeded, par exemple lorsqu'elle n'est pas installée. Inclut les étiquettes name, namespace, phase, reason, et version. Une alerte Prometheus est créée lorsque cette métrique est présente.

csv_count

Nombre de CSV enregistrés avec succès.

csv_succeeded

Lors du rapprochement d'un CSV, indique si une version du CSV est dans l'état Succeeded (valeur 1) ou non (valeur 0). Comprend les étiquettes name, namespace, et version.

csv_upgrade_count

Compte monotone des mises à jour CSV.

install_plan_count

Nombre de plans d'installation.

installplan_warnings_total

Compte monotone des avertissements générés par les ressources, telles que les ressources dépréciées, incluses dans un plan d'installation.

olm_resolution_duration_seconds

La durée d'une tentative de résolution de dépendance.

subscription_count

Nombre d'abonnements.

subscription_sync_total

Compte monotone des synchronisations d'abonnements. Inclut les étiquettes channel, installed CSV, et l'abonnement name.

2.4.8. Gestion des webhooks dans Operator Lifecycle Manager

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.

Voir Définition des versions de service de cluster (CSV) pour plus de détails sur la manière dont un développeur d'opérateur peut définir des webhooks pour son opérateur, ainsi que sur les considérations à prendre en compte lors de l'exécution sur OLM.

2.4.8.1. Ressources supplémentaires

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.