5.8. Travailler avec des images groupées
Vous pouvez utiliser l'Operator SDK pour emballer, déployer et mettre à niveau les opérateurs dans le format bundle à utiliser sur Operator Lifecycle Manager (OLM).
5.8.1. Regroupement d'un opérateur
Le format Operator bundle est la méthode d'emballage par défaut pour Operator SDK et Operator Lifecycle Manager (OLM). Vous pouvez préparer votre Operator pour une utilisation sur OLM en utilisant Operator SDK pour construire et pousser votre projet Operator en tant qu'image groupée.
Conditions préalables
- Operator SDK CLI installé sur un poste de développement
-
OpenShift CLI (
oc
) v4.12 installé - Projet d'opérateur initialisé à l'aide de l'Operator SDK
- Si votre opérateur est basé sur Go, votre projet doit être mis à jour pour utiliser les images prises en charge pour fonctionner sur OpenShift Container Platform
Procédure
Exécutez les commandes
make
suivantes dans le répertoire de votre projet Operator pour construire et pousser votre image Operator. Modifiez l'argumentIMG
dans les étapes suivantes pour référencer un référentiel auquel vous avez accès. Vous pouvez obtenir un compte pour stocker des conteneurs sur des sites de dépôt tels que Quay.io.Construire l'image :
$ make docker-build IMG=<registry>/<user>/<operator_image_name>:<tag>
NoteLe fichier Docker généré par le SDK pour l'Operator fait explicitement référence à
GOARCH=amd64
pourgo build
. Cette référence peut être modifiée enGOARCH=$TARGETARCH
pour les architectures non-AMD64. Docker définira automatiquement la variable d'environnement à la valeur spécifiée par–platform
. Avec Buildah, il faudra utiliser–build-arg
à cette fin. Pour plus d'informations, voir Architectures multiples.Transférer l'image dans un référentiel :
$ make docker-push IMG=<registry>/<user>/<operator_image_name>:<tag>
Créez votre manifeste Operator bundle en exécutant la commande
make bundle
, qui invoque plusieurs commandes, dont les sous-commandes Operator SDKgenerate bundle
etbundle validate
:$ make bundle IMG=<registry>/<user>/<operator_image_name>:<tag>
Les manifestes de l'offre groupée d'un opérateur décrivent la manière d'afficher, de créer et de gérer une application. 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 objetClusterServiceVersion
-
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
Ces fichiers sont ensuite automatiquement validés à l'aide de
operator-sdk bundle validate
afin de s'assurer que la représentation du paquet sur le disque est correcte.-
Un répertoire bundle manifests nommé
Construisez et poussez votre image de bundle en exécutant les commandes suivantes. OLM consomme les liasses d'opérateurs à l'aide d'une image d'index, qui fait référence à une ou plusieurs images de liasses.
Créez l'image de l'ensemble. Définissez
BUNDLE_IMG
avec les détails du registre, de l'espace de noms de l'utilisateur et de la balise d'image où vous avez l'intention de pousser l'image :$ make bundle-build BUNDLE_IMG=<registry>/<user>/<bundle_image_name>:<tag>
Pousser l'image de la liasse :
$ docker push <registry>/<user>/<bundle_image_name>:<tag>
5.8.2. Déploiement d'un opérateur avec Operator Lifecycle Manager
Operator Lifecycle Manager (OLM) vous aide à installer, mettre à jour et gérer le cycle de vie des opérateurs et de leurs services associés sur un cluster Kubernetes. OLM est installé par défaut sur OpenShift Container Platform et s'exécute en tant qu'extension Kubernetes afin que vous puissiez utiliser la console web et l'OpenShift CLI (oc
) pour toutes les fonctions de gestion du cycle de vie des opérateurs sans outils supplémentaires.
Le format Operator bundle est la méthode d'emballage par défaut pour Operator SDK et OLM. Vous pouvez utiliser Operator SDK pour exécuter rapidement une image de bundle sur OLM afin de vous assurer qu'elle fonctionne correctement.
Conditions préalables
- Operator SDK CLI installé sur un poste de développement
- L'image de l'ensemble de l'opérateur est construite et poussée vers un registre
-
OLM installé sur un cluster basé sur Kubernetes (v1.16.0 ou version ultérieure si vous utilisez
apiextensions.k8s.io/v1
CRD, par exemple OpenShift Container Platform 4.12) -
Connexion au cluster avec
oc
en utilisant un compte avec les permissions decluster-admin
- Si votre opérateur est basé sur Go, votre projet doit être mis à jour pour utiliser les images prises en charge pour fonctionner sur OpenShift Container Platform
Procédure
Saisissez la commande suivante pour exécuter l'opérateur sur le cluster :
$ operator-sdk run bundle \1 -n <namespace> \2 <registry>/<user>/<bundle_image_name>:<tag> 3
- 1
- La commande
run bundle
crée un catalogue de fichiers valide et installe le paquet Operator sur votre cluster à l'aide d'OLM. - 2
- Facultatif : Par défaut, la commande installe l'opérateur dans le projet actif dans votre fichier
~/.kube/config
. Vous pouvez ajouter l'option-n
pour définir un espace de noms différent pour l'installation. - 3
- Si vous ne spécifiez pas d'image, la commande utilise
quay.io/operator-framework/opm:latest
comme image d'index par défaut. Si vous spécifiez une image, la commande utilise l'image du paquet elle-même comme image d'index.
ImportantDepuis OpenShift Container Platform 4.11, la commande
run bundle
prend en charge par défaut le format de catalogue basé sur des fichiers pour les catalogues Operator. Le format de base de données SQLite déprécié pour les catalogues Operator continue d'être pris en charge ; cependant, il sera supprimé dans une prochaine version. Il est recommandé aux auteurs d'Operator de migrer leurs flux de travail vers le format de catalogue basé sur des fichiers.Cette commande permet d'effectuer les actions suivantes :
- Créez une image d'index faisant référence à votre image de liasse. L'image d'index est opaque et éphémère, mais elle reflète fidèlement la manière dont un paquet serait ajouté à un catalogue en production.
- Créez une source de catalogue qui pointe vers votre nouvelle image d'index, ce qui permet à OperatorHub de découvrir votre opérateur.
-
Déployez votre opérateur sur votre cluster en créant un site
OperatorGroup
,Subscription
,InstallPlan
, et toutes les autres ressources nécessaires, y compris RBAC.
Ressources supplémentaires
- Catalogues basés sur des fichiers dans le format d'emballage Operator Framework
- Catalogues basés sur des fichiers dans Gestion des catalogues personnalisés
- Format de l'offre groupée
5.8.3. Publication d'un catalogue contenant un opérateur groupé
Pour installer et gérer les opérateurs, Operator Lifecycle Manager (OLM) exige que les bundles d'opérateurs soient répertoriés dans une image d'index, qui est référencée par un catalogue sur le cluster. En tant qu'auteur d'un opérateur, vous pouvez utiliser le SDK de l'opérateur pour créer un index contenant le bundle de votre opérateur et toutes ses dépendances. Ceci est utile pour tester sur des clusters distants et pour publier dans les registres de conteneurs.
L'Operator SDK utilise le CLI opm
pour faciliter la création d'images d'index. Il n'est pas nécessaire d'avoir une expérience de la commande opm
. Pour les cas d'utilisation avancés, la commande opm
peut être utilisée directement au lieu de l'Operator SDK.
Conditions préalables
- Operator SDK CLI installé sur un poste de développement
- L'image de l'ensemble de l'opérateur est construite et poussée vers un registre
-
OLM installé sur un cluster basé sur Kubernetes (v1.16.0 ou version ultérieure si vous utilisez
apiextensions.k8s.io/v1
CRD, par exemple OpenShift Container Platform 4.12) -
Connexion au cluster avec
oc
en utilisant un compte avec les permissions decluster-admin
Procédure
Exécutez la commande suivante
make
dans le répertoire de votre projet Operator pour créer une image d'indexation contenant votre bundle Operator :$ make catalog-build CATALOG_IMG=<registry>/<user>/<index_image_name>:<tag>
où l'argument
CATALOG_IMG
fait référence à un dépôt auquel vous avez accès. Vous pouvez obtenir un compte pour stocker des conteneurs sur des sites de dépôt tels que Quay.io.Pousser l'image de l'index construit vers un référentiel :
$ make catalog-push CATALOG_IMG=<registry>/<user>/<index_image_name>:<tag>
AstuceVous pouvez utiliser les commandes Operator SDK
make
ensemble si vous préférez effectuer plusieurs actions en séquence à la fois. Par exemple, si vous n'avez pas encore construit d'image bundle pour votre projet Operator, vous pouvez construire et pousser à la fois une image bundle et une image index avec la syntaxe suivante :$ make bundle-build bundle-push catalog-build catalog-push \ BUNDLE_IMG=<bundle_image_pull_spec> \ CATALOG_IMG=<index_image_pull_spec>
Vous pouvez également définir le champ
IMAGE_TAG_BASE
dans votreMakefile
en fonction d'un référentiel existant :IMAGE_TAG_BASE=quay.io/example/my-operator
Vous pouvez ensuite utiliser la syntaxe suivante pour construire et pousser des images avec des noms générés automatiquement, tels que
quay.io/example/my-operator-bundle:v0.0.1
pour l'image bundle etquay.io/example/my-operator-catalog:v0.0.1
pour l'image index :$ make bundle-build bundle-push catalog-build catalog-push
Définissez un objet
CatalogSource
qui fait référence à l'image d'index que vous venez de générer, puis créez l'objet à l'aide de la commandeoc apply
ou de la console web :Exemple
CatalogSource
YAMLapiVersion: operators.coreos.com/v1alpha1 kind: CatalogSource metadata: name: cs-memcached namespace: default spec: displayName: My Test publisher: Company sourceType: grpc grpcPodConfig: securityContextConfig: <security_mode> 1 image: quay.io/example/memcached-catalog:v0.0.1 2 updateStrategy: registryPoll: interval: 10m
- 1
- Spécifiez la valeur de
legacy
ourestricted
. Si le champ n'est pas défini, la valeur par défaut estlegacy
. Dans une prochaine version d'OpenShift Container Platform, il est prévu que la valeur par défaut soitrestricted
. Si votre catalogue ne peut pas s'exécuter avec les autorisationsrestricted
, il est recommandé de définir manuellement ce champ surlegacy
. - 2
- Définissez
image
comme la spécification de tirage d'image que vous avez utilisée précédemment avec l'argumentCATALOG_IMG
.
Vérifier la source du catalogue :
$ oc get catalogsource
Exemple de sortie
NAME DISPLAY TYPE PUBLISHER AGE cs-memcached My Test grpc Company 4h31m
Vérification
Installez l'opérateur à l'aide de votre catalogue :
Définissez un objet
OperatorGroup
et créez-le à l'aide de la commandeoc apply
ou de la console web :Exemple
OperatorGroup
YAMLapiVersion: operators.coreos.com/v1 kind: OperatorGroup metadata: name: my-test namespace: default spec: targetNamespaces: - default
Définissez un objet
Subscription
et créez-le à l'aide de la commandeoc apply
ou de la console web :Exemple
Subscription
YAMLapiVersion: operators.coreos.com/v1alpha1 kind: Subscription metadata: name: catalogtest namespace: default spec: channel: "alpha" installPlanApproval: Manual name: catalog source: cs-memcached sourceNamespace: default startingCSV: memcached-operator.v0.0.1
Vérifiez que l'opérateur installé fonctionne :
Vérifier le groupe d'opérateurs :
$ oc get og
Exemple de sortie
NAME AGE my-test 4h40m
Vérifiez la version du service de cluster (CSV) :
$ oc get csv
Exemple de sortie
NAME DISPLAY VERSION REPLACES PHASE memcached-operator.v0.0.1 Test 0.0.1 Succeeded
Vérifier la présence de l'opérateur dans les nacelles :
$ oc get pods
Exemple de sortie
NAME READY STATUS RESTARTS AGE 9098d908802769fbde8bd45255e69710a9f8420a8f3d814abe88b68f8ervdj6 0/1 Completed 0 4h33m catalog-controller-manager-7fd5b7b987-69s4n 2/2 Running 0 4h32m cs-memcached-7622r 1/1 Running 0 4h33m
Ressources supplémentaires
-
Voir Gestion des catalogues personnalisés pour plus de détails sur l'utilisation directe du CLI
opm
pour des cas d'utilisation plus avancés.
5.8.4. Test d'une mise à niveau d'un opérateur sur Operator Lifecycle Manager
Vous pouvez rapidement tester la mise à niveau de votre opérateur en utilisant l'intégration d'Operator Lifecycle Manager (OLM) dans le SDK de l'opérateur, sans avoir à gérer manuellement les images d'index et les sources de catalogue.
La sous-commande run bundle-upgrade
automatise le déclenchement de la mise à niveau d'un opérateur installé vers une version ultérieure en spécifiant une image de bundle pour la version ultérieure.
Conditions préalables
-
Opérateur installé avec OLM soit par la sous-commande
run bundle
, soit par l'installation traditionnelle d'OLM - Une image de paquet qui représente une version ultérieure de l'opérateur installé
Procédure
Si votre opérateur n'a pas encore été installé avec OLM, installez la version antérieure soit en utilisant la sous-commande
run bundle
, soit en procédant à une installation traditionnelle d'OLM.NoteSi la version précédente de l'ensemble a été installée traditionnellement à l'aide d'OLM, l'ensemble plus récent vers lequel vous souhaitez effectuer la mise à niveau ne doit pas exister dans l'image d'index référencée par la source du catalogue. Sinon, l'exécution de la sous-commande
run bundle-upgrade
entraînera l'échec du pod de registre, car l'ensemble plus récent est déjà référencé par l'index qui fournit le package et la version du service de cluster (CSV).Par exemple, vous pouvez utiliser la sous-commande
run bundle
suivante pour un opérateur Memcached en spécifiant l'image du bundle précédent :$ operator-sdk run bundle <registry>/<user>/memcached-operator:v0.0.1
Exemple de sortie
INFO[0006] Creating a File-Based Catalog of the bundle "quay.io/demo/memcached-operator:v0.0.1" INFO[0008] Generated a valid File-Based Catalog INFO[0012] Created registry pod: quay-io-demo-memcached-operator-v1-0-1 INFO[0012] Created CatalogSource: memcached-operator-catalog INFO[0012] OperatorGroup "operator-sdk-og" created INFO[0012] Created Subscription: memcached-operator-v0-0-1-sub INFO[0015] Approved InstallPlan install-h9666 for the Subscription: memcached-operator-v0-0-1-sub INFO[0015] Waiting for ClusterServiceVersion "my-project/memcached-operator.v0.0.1" to reach 'Succeeded' phase INFO[0015] Waiting for ClusterServiceVersion ""my-project/memcached-operator.v0.0.1" to appear INFO[0026] Found ClusterServiceVersion "my-project/memcached-operator.v0.0.1" phase: Pending INFO[0028] Found ClusterServiceVersion "my-project/memcached-operator.v0.0.1" phase: Installing INFO[0059] Found ClusterServiceVersion "my-project/memcached-operator.v0.0.1" phase: Succeeded INFO[0059] OLM has successfully installed "memcached-operator.v0.0.1"
Mettez à niveau l'opérateur installé en spécifiant l'image du paquet pour la version la plus récente de l'opérateur :
$ operator-sdk run bundle-upgrade <registry>/<user>/memcached-operator:v0.0.2
Exemple de sortie
INFO[0002] Found existing subscription with name memcached-operator-v0-0-1-sub and namespace my-project INFO[0002] Found existing catalog source with name memcached-operator-catalog and namespace my-project INFO[0008] Generated a valid Upgraded File-Based Catalog INFO[0009] Created registry pod: quay-io-demo-memcached-operator-v0-0-2 INFO[0009] Updated catalog source memcached-operator-catalog with address and annotations INFO[0010] Deleted previous registry pod with name "quay-io-demo-memcached-operator-v0-0-1" INFO[0041] Approved InstallPlan install-gvcjh for the Subscription: memcached-operator-v0-0-1-sub INFO[0042] Waiting for ClusterServiceVersion "my-project/memcached-operator.v0.0.2" to reach 'Succeeded' phase INFO[0019] Found ClusterServiceVersion "my-project/memcached-operator.v0.0.2" phase: Pending INFO[0042] Found ClusterServiceVersion "my-project/memcached-operator.v0.0.2" phase: InstallReady INFO[0043] Found ClusterServiceVersion "my-project/memcached-operator.v0.0.2" phase: Installing INFO[0044] Found ClusterServiceVersion "my-project/memcached-operator.v0.0.2" phase: Succeeded INFO[0044] Successfully upgraded to "memcached-operator.v0.0.2"
Nettoyer les opérateurs installés :
$ operator-sdk cleanup memcached-operator
Ressources supplémentaires
5.8.5. Contrôle de la compatibilité des opérateurs avec les versions d'OpenShift Container Platform
Kubernetes déprécie périodiquement certaines API qui sont supprimées dans les versions ultérieures. Si votre opérateur utilise une API obsolète, il se peut qu'il ne fonctionne plus après la mise à niveau du cluster OpenShift Container Platform vers la version de Kubernetes dans laquelle l'API a été supprimée.
En tant qu'auteur d'un Operator, il est fortement recommandé de consulter le Deprecated API Migration Guide dans la documentation Kubernetes et de maintenir vos projets Operator à jour afin d'éviter d'utiliser des API dépréciées et supprimées. Idéalement, vous devriez mettre à jour votre Operator avant la sortie d'une future version d'OpenShift Container Platform qui rendrait l'Operator incompatible.
Lorsqu'une API est supprimée d'une version d'OpenShift Container Platform, les opérateurs fonctionnant sur cette version de cluster qui utilisent encore les API supprimées ne fonctionneront plus correctement. En tant qu'auteur d'un opérateur, vous devez planifier la mise à jour de vos projets d'opérateurs pour tenir compte de la dépréciation et de la suppression des API afin d'éviter les interruptions pour les utilisateurs de votre opérateur.
Vous pouvez consulter les alertes d'événements de vos opérateurs pour savoir s'il existe des avertissements concernant les API actuellement utilisées. Les alertes suivantes se déclenchent lorsqu'elles détectent une API en cours d'utilisation qui sera supprimée dans la prochaine version :
APIRemovedInNextReleaseInUse
- APIs qui seront supprimées dans la prochaine version d'OpenShift Container Platform.
APIRemovedInNextEUSReleaseInUse
- APIs qui seront supprimées dans la prochaine version d'OpenShift Container Platform Extended Update Support (EUS).
Si un administrateur de cluster a installé votre Operator, avant de passer à la version suivante d'OpenShift Container Platform, il doit s'assurer qu'une version de votre Operator compatible avec la version suivante du cluster est installée. Bien qu'il soit recommandé de mettre à jour vos projets Operator pour ne plus utiliser les API dépréciées ou supprimées, si vous avez toujours besoin de publier vos bundles Operator avec des API supprimées pour continuer à les utiliser sur des versions antérieures d'OpenShift Container Platform, assurez-vous que le bundle est configuré en conséquence.
La procédure suivante permet d'éviter que les administrateurs n'installent des versions de votre opérateur sur une version incompatible d'OpenShift Container Platform. Ces étapes empêchent également les administrateurs de passer à une version plus récente d'OpenShift Container Platform qui est incompatible avec la version de votre opérateur actuellement installée sur leur cluster.
Cette procédure est également utile lorsque vous savez que la version actuelle de votre Opérateur ne fonctionnera pas bien, pour une raison quelconque, sur une version spécifique d'OpenShift Container Platform. En définissant les versions de cluster où l'Opérateur doit être distribué, vous vous assurez que l'Opérateur n'apparaît pas dans un catalogue d'une version de cluster qui est en dehors de la plage autorisée.
Les opérateurs qui utilisent des API obsolètes peuvent avoir un impact négatif sur les charges de travail critiques lorsque les administrateurs de clusters passent à une version future d'OpenShift Container Platform où l'API n'est plus prise en charge. Si votre opérateur utilise des API obsolètes, vous devez configurer les paramètres suivants dans votre projet d'opérateur dès que possible.
Conditions préalables
- Un projet existant de l'opérateur
Procédure
Si vous savez qu'un bundle spécifique de votre Operator n'est pas pris en charge et ne fonctionnera pas correctement sur OpenShift Container Platform après une certaine version de cluster, configurez la version maximale d'OpenShift Container Platform avec laquelle votre Operator est compatible. Dans la version de service de cluster (CSV) de votre projet Operator, définissez l'annotation
olm.maxOpenShiftVersion
pour empêcher les administrateurs de mettre à niveau leur cluster avant de mettre à niveau l'Operator installé vers une version compatible :ImportantVous ne devez utiliser l'annotation
olm.maxOpenShiftVersion
que si la version de votre Operator bundle ne peut pas fonctionner dans les versions ultérieures. Sachez que les administrateurs de clusters ne peuvent pas mettre à niveau leurs clusters avec votre solution installée. Si vous ne fournissez pas de version ultérieure et un chemin de mise à niveau valide, les administrateurs de clusters peuvent désinstaller votre Operator et mettre à jour la version du cluster.Exemple de CSV avec
olm.maxOpenShiftVersion
annotationapiVersion: operators.coreos.com/v1alpha1 kind: ClusterServiceVersion metadata: annotations: "olm.properties": '[{"type": "olm.maxOpenShiftVersion", "value": "<cluster_version>"}]' 1
- 1
- Indiquez la version de cluster maximale d'OpenShift Container Platform avec laquelle votre opérateur est compatible. Par exemple, la définition de
value
sur4.9
empêche les mises à niveau de cluster vers des versions d'OpenShift Container Platform postérieures à 4.9 lorsque ce bundle est installé sur un cluster.
Si votre bundle est destiné à être distribué dans un catalogue Operator fourni par Red Hat, configurez les versions compatibles d'OpenShift Container Platform pour votre Operator en définissant les propriétés suivantes. Cette configuration garantit que votre Operator est uniquement inclus dans les catalogues qui ciblent des versions compatibles d'OpenShift Container Platform :
NoteCette étape n'est valable que pour la publication d'opérateurs dans les catalogues fournis par Red Hat. Si votre offre groupée est uniquement destinée à être distribuée dans un catalogue personnalisé, vous pouvez ignorer cette étape. Pour plus de détails, voir "Catalogues d'opérateurs fournis par Red Hat".
Définissez l'annotation
com.redhat.openshift.versions
dans le fichierbundle/metadata/annotations.yaml
de votre projet :Exemple de fichier
bundle/metadata/annotations.yaml
avec les versions compatiblescom.redhat.openshift.versions : "v4.7-v4.9" 1
- 1
- Définir une gamme ou une version unique.
Pour éviter que votre bundle ne soit transféré vers une version incompatible d'OpenShift Container Platform, assurez-vous que l'image d'index est générée avec l'étiquette
com.redhat.openshift.versions
appropriée dans l'image du bundle de votre Operator. Par exemple, si votre projet a été généré en utilisant le SDK Operator, mettez à jour le fichierbundle.Dockerfile
:Exemple
bundle.Dockerfile
avec versions compatiblesLABEL com.redhat.openshift.versions="<versions>" 1
- 1
- Définir une plage ou une version unique, par exemple,
v4.7-v4.9
. Ce paramètre définit les versions de cluster dans lesquelles l'opérateur doit être distribué, et l'opérateur n'apparaît pas dans le catalogue d'une version de cluster qui se situe en dehors de la plage.
Vous pouvez désormais regrouper une nouvelle version de votre opérateur et publier la version mise à jour dans un catalogue en vue de sa distribution.
Ressources supplémentaires
- Gérer les versions d'OpenShift dans l'espace de travail Certified Operator Build Guide
- Mise à jour des opérateurs installés
- Red Hat-provided Operator catalogs
5.8.6. Ressources supplémentaires
- Voir le format d'emballage de l'Operator Framework pour plus de détails sur le format des paquets.
-
Voir Gestion des catalogues personnalisés pour plus de détails sur l'ajout d'images de paquets aux images d'index à l'aide de la commande
opm
. - Voir le flux de travail du gestionnaire du cycle de vie des opérateurs pour plus de détails sur le fonctionnement des mises à niveau pour les opérateurs installés.