5.3. Opérateurs basés sur le Go
5.3.1. Premiers pas avec Operator SDK pour les opérateurs basés sur Go Copier lienLien copié sur presse-papiers!
Pour démontrer les bases de la configuration et de l'exécution d'un opérateur basé sur Go à l'aide des outils et des bibliothèques fournis par le SDK Operator, les développeurs d'opérateurs peuvent construire un exemple d'opérateur basé sur Go pour Memcached, un magasin de valeurs clés distribué, et le déployer dans un cluster.
5.3.1.1. Conditions préalables Copier lienLien copié sur presse-papiers!
- Operator SDK CLI installé
-
OpenShift CLI (
oc
) v4.12 installé - Go v1.19
-
Connexion à un cluster OpenShift Container Platform 4.12 avec
oc
avec un compte qui a les permissionscluster-admin
- Pour permettre au cluster d'extraire l'image, le dépôt où vous avez poussé votre image doit être défini comme public, ou vous devez configurer un secret d'extraction d'image
5.3.1.2. Création et déploiement d'opérateurs basés sur Go Copier lienLien copié sur presse-papiers!
Vous pouvez construire et déployer un simple opérateur basé sur Go pour Memcached en utilisant le SDK Operator.
Procédure
Create a project.
Créez votre répertoire de projet :
mkdir memcached-operator
$ mkdir memcached-operator
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Allez dans le répertoire du projet :
cd memcached-operator
$ cd memcached-operator
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Exécutez la commande
operator-sdk init
pour initialiser le projet :operator-sdk init \ --domain=example.com \ --repo=github.com/example-inc/memcached-operator
$ operator-sdk init \ --domain=example.com \ --repo=github.com/example-inc/memcached-operator
Copy to Clipboard Copied! Toggle word wrap Toggle overflow La commande utilise par défaut le plugin Go.
Create an API.
Créer une API Memcached simple :
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Build and push the Operator image.
Utilisez les cibles par défaut de
Makefile
pour construire et pousser votre opérateur. DéfinissezIMG
avec une spécification d'extraction pour votre image qui utilise un registre vers lequel vous pouvez pousser :make docker-build docker-push IMG=<registry>/<user>/<image_name>:<tag>
$ make docker-build docker-push IMG=<registry>/<user>/<image_name>:<tag>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Run the Operator.
Installer le CRD :
make install
$ make install
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Déployez le projet sur le cluster. Définissez
IMG
sur l'image que vous avez poussée :make deploy IMG=<registry>/<user>/<image_name>:<tag>
$ make deploy IMG=<registry>/<user>/<image_name>:<tag>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
Create a sample custom resource (CR).
Créer un échantillon de CR :
oc apply -f config/samples/cache_v1_memcached.yaml \ -n memcached-operator-system
$ oc apply -f config/samples/cache_v1_memcached.yaml \ -n memcached-operator-system
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Il faut s'attendre à ce que le CR réconcilie l'opérateur :
oc logs deployment.apps/memcached-operator-controller-manager \ -c manager \ -n memcached-operator-system
$ oc logs deployment.apps/memcached-operator-controller-manager \ -c manager \ -n memcached-operator-system
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
Delete a CR
Supprimez un CR en exécutant la commande suivante :
oc delete -f config/samples/cache_v1_memcached.yaml -n memcached-operator-system
$ oc delete -f config/samples/cache_v1_memcached.yaml -n memcached-operator-system
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Clean up.
Exécutez la commande suivante pour nettoyer les ressources qui ont été créées dans le cadre de cette procédure :
make undeploy
$ make undeploy
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
5.3.1.3. Prochaines étapes Copier lienLien copié sur presse-papiers!
- Voir le tutoriel de l'Operator SDK pour les opérateurs basés sur Go pour une description plus approfondie de la construction d'un opérateur basé sur Go.
5.3.2. Didacticiel sur le SDK pour les opérateurs basés sur Go Copier lienLien copié sur presse-papiers!
Les développeurs d'opérateurs peuvent profiter de la prise en charge du langage de programmation Go dans le SDK de l'opérateur pour créer un exemple d'opérateur basé sur Go pour Memcached, un magasin de valeurs clés distribué, et gérer son cycle de vie.
Ce processus est réalisé à l'aide de deux pièces maîtresses du cadre de l'opérateur :
- SDK de l'opérateur
-
L'outil CLI
operator-sdk
et la bibliothèque APIcontroller-runtime
- Gestionnaire du cycle de vie des opérateurs (OLM)
- Installation, mise à niveau et contrôle d'accès basé sur les rôles (RBAC) des opérateurs sur un cluster
Ce tutoriel est plus détaillé que le tutoriel " Getting started with Operator SDK for Go-based Operators" (Démarrer avec Operator SDK pour les opérateurs basés sur Go).
5.3.2.1. Conditions préalables Copier lienLien copié sur presse-papiers!
- Operator SDK CLI installé
-
OpenShift CLI (
oc
) v4.12 installé - Go v1.19
-
Connexion à un cluster OpenShift Container Platform 4.12 avec
oc
avec un compte qui a les permissionscluster-admin
- Pour permettre au cluster d'extraire l'image, le dépôt où vous avez poussé votre image doit être défini comme public, ou vous devez configurer un secret d'extraction d'image
5.3.2.2. Création d'un projet Copier lienLien copié sur presse-papiers!
Utilisez l'interface de programmation Operator SDK pour créer un projet appelé memcached-operator
.
Procédure
Créer un répertoire pour le projet :
mkdir -p $HOME/projects/memcached-operator
$ mkdir -p $HOME/projects/memcached-operator
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Accédez au répertoire :
cd $HOME/projects/memcached-operator
$ cd $HOME/projects/memcached-operator
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Activer le support pour les modules Go :
export GO111MODULE=on
$ export GO111MODULE=on
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Exécutez la commande
operator-sdk init
pour initialiser le projet :operator-sdk init \ --domain=example.com \ --repo=github.com/example-inc/memcached-operator
$ operator-sdk init \ --domain=example.com \ --repo=github.com/example-inc/memcached-operator
Copy to Clipboard Copied! Toggle word wrap Toggle overflow NoteLa commande
operator-sdk init
utilise par défaut le plugin Go.La commande
operator-sdk init
génère un fichiergo.mod
à utiliser avec les modules Go. Le drapeau--repo
est nécessaire lors de la création d'un projet en dehors de$GOPATH/src/
, car les fichiers générés nécessitent un chemin de module valide.
5.3.2.2.1. Dossier PROJET Copier lienLien copié sur presse-papiers!
Parmi les fichiers générés par la commande operator-sdk init
figure un fichier Kubebuilder PROJECT
. Les commandes operator-sdk
suivantes, ainsi que la sortie help
, qui sont exécutées à partir de la racine du projet, lisent ce fichier et savent que le type de projet est Go. Par exemple :
5.3.2.2.2. À propos du gestionnaire Copier lienLien copié sur presse-papiers!
Le programme principal de l'opérateur est le fichier main.go
, qui initialise et exécute le gestionnaire. Ce dernier enregistre automatiquement le schéma pour toutes les définitions d'API de ressources personnalisées (CR) et met en place et exécute les contrôleurs et les webhooks.
Le gestionnaire peut restreindre l'espace de noms que tous les contrôleurs surveillent à la recherche de ressources :
mgr, err := ctrl.NewManager(cfg, manager.Options{Namespace: namespace})
mgr, err := ctrl.NewManager(cfg, manager.Options{Namespace: namespace})
Par défaut, le gestionnaire surveille l'espace de noms dans lequel l'opérateur s'exécute. Pour surveiller tous les espaces de noms, vous pouvez laisser l'option namespace
vide :
mgr, err := ctrl.NewManager(cfg, manager.Options{Namespace: ""})
mgr, err := ctrl.NewManager(cfg, manager.Options{Namespace: ""})
Vous pouvez également utiliser la fonction MultiNamespacedCacheBuilder
pour surveiller un ensemble spécifique d'espaces de noms :
var namespaces []string mgr, err := ctrl.NewManager(cfg, manager.Options{ NewCache: cache.MultiNamespacedCacheBuilder(namespaces), })
var namespaces []string
mgr, err := ctrl.NewManager(cfg, manager.Options{
NewCache: cache.MultiNamespacedCacheBuilder(namespaces),
})
5.3.2.2.3. À propos des API multigroupes Copier lienLien copié sur presse-papiers!
Avant de créer une API et un contrôleur, demandez-vous si votre opérateur a besoin de plusieurs groupes d'API. Ce didacticiel couvre le cas par défaut d'une API à groupe unique, mais pour modifier la présentation de votre projet afin de prendre en charge des API à groupes multiples, vous pouvez exécuter la commande suivante :
operator-sdk edit --multigroup=true
$ operator-sdk edit --multigroup=true
Cette commande met à jour le fichier PROJECT
, qui devrait ressembler à l'exemple suivant :
domain: example.com layout: go.kubebuilder.io/v3 multigroup: true ...
domain: example.com
layout: go.kubebuilder.io/v3
multigroup: true
...
Pour les projets multi-groupes, les fichiers de type API Go sont créés dans le répertoire apis/<group>/<version>/
, et les contrôleurs sont créés dans le répertoire controllers/<group>/
. Le fichier Dockerfile est ensuite mis à jour en conséquence.
Ressource supplémentaire
- Pour plus de détails sur la migration vers un projet multi-groupe, voir la documentation de Kubebuilder.
5.3.2.3. Création d'une API et d'un contrôleur Copier lienLien copié sur presse-papiers!
Utilisez le SDK CLI de l'opérateur pour créer une API et un contrôleur de définition de ressources personnalisées (CRD).
Procédure
Exécutez la commande suivante pour créer une API avec le groupe
cache
, la versionv1
et le typeMemcached
:operator-sdk create api \ --group=cache \ --version=v1 \ --kind=Memcached
$ operator-sdk create api \ --group=cache \ --version=v1 \ --kind=Memcached
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Lorsque vous y êtes invité, entrez
y
pour créer la ressource et le contrôleur :Create Resource [y/n] y Create Controller [y/n] y
Create Resource [y/n] y Create Controller [y/n] y
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Exemple de sortie
Writing scaffold for you to edit... api/v1/memcached_types.go controllers/memcached_controller.go ...
Writing scaffold for you to edit... api/v1/memcached_types.go controllers/memcached_controller.go ...
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
Ce processus génère la ressource Memcached
API à l'adresse api/v1/memcached_types.go
et le contrôleur à l'adresse controllers/memcached_controller.go
.
5.3.2.3.1. Définition de l'API Copier lienLien copié sur presse-papiers!
Définir l'API pour la ressource personnalisée (CR) Memcached
.
Procédure
Modifiez les définitions du type Go à l'adresse
api/v1/memcached_types.go
pour obtenirspec
etstatus
:Copy to Clipboard Copied! Toggle word wrap Toggle overflow Mettre à jour le code généré pour le type de ressource :
make generate
$ make generate
Copy to Clipboard Copied! Toggle word wrap Toggle overflow AstuceAprès avoir modifié un fichier
*_types.go
, vous devez exécuter la commandemake generate
pour mettre à jour le code généré pour ce type de ressource.La cible Makefile ci-dessus invoque l'utilitaire
controller-gen
pour mettre à jour le fichierapi/v1/zz_generated.deepcopy.go
. Cela permet de s'assurer que les définitions de type de l'API Go implémentent l'interfaceruntime.Object
que tous les types Kind doivent implémenter.
5.3.2.3.2. Générer des manifestes CRD Copier lienLien copié sur presse-papiers!
Une fois l'API définie avec les champs spec
et status
et les marqueurs de validation de la définition des ressources personnalisées (CRD), vous pouvez générer des manifestes CRD.
Procédure
Exécutez la commande suivante pour générer et mettre à jour les manifestes CRD :
make manifests
$ make manifests
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Cette cible Makefile invoque l'utilitaire
controller-gen
pour générer les manifestes CRD dans le fichierconfig/crd/bases/cache.example.com_memcacheds.yaml
.
5.3.2.3.2.1. À propos de la validation de l'OpenAPI Copier lienLien copié sur presse-papiers!
Les schémas OpenAPIv3 sont ajoutés aux manifestes CRD dans le bloc spec.validation
lorsque les manifestes sont générés. Ce bloc de validation permet à Kubernetes de valider les propriétés d'une ressource personnalisée Memcached (CR) lors de sa création ou de sa mise à jour.
Des marqueurs, ou annotations, sont disponibles pour configurer les validations de votre API. Ces marqueurs ont toujours un préfixe kubebuilder:validation
.
5.3.2.4. Mise en œuvre du contrôleur Copier lienLien copié sur presse-papiers!
Après avoir créé une nouvelle API et un nouveau contrôleur, vous pouvez mettre en œuvre la logique du contrôleur.
Procédure
Pour cet exemple, remplacez le fichier de contrôleur généré
controllers/memcached_controller.go
par l'exemple de mise en œuvre suivant :Exemple 5.1. Exemple
memcached_controller.go
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Le contrôleur de l'exemple exécute la logique de rapprochement suivante pour chaque ressource personnalisée (CR)
Memcached
:- Créer un déploiement Memcached s'il n'existe pas.
-
Assurez-vous que la taille du déploiement est la même que celle spécifiée par la spécification CR de
Memcached
. -
Mettre à jour l'état de
Memcached
CR avec les noms des podsmemcached
.
Les sous-sections suivantes expliquent comment le contrôleur de l'exemple de mise en œuvre surveille les ressources et comment la boucle de rapprochement est déclenchée. Vous pouvez sauter ces sous-sections pour passer directement à l'exécution de l'opérateur.
5.3.2.4.1. Ressources surveillées par le contrôleur Copier lienLien copié sur presse-papiers!
La fonction SetupWithManager()
dans controllers/memcached_controller.go
spécifie comment le contrôleur est construit pour surveiller un CR et d'autres ressources qui sont détenues et gérées par ce contrôleur.
NewControllerManagedBy()
fournit un constructeur de contrôleurs qui permet différentes configurations de contrôleurs.
For(&cachev1.Memcached{})
spécifie le type Memcached
en tant que ressource primaire à surveiller. Pour chaque événement d'ajout, de mise à jour ou de suppression d'un type Memcached
, la boucle de rapprochement reçoit un argument de rapprochement Request
, composé d'un espace de noms et d'une clé de nom, pour cet objet Memcached
.
Owns(&appsv1.Deployment{})
spécifie le type Deployment
comme ressource secondaire à surveiller. Pour chaque événement d'ajout, de mise à jour ou de suppression du type Deployment
, le gestionnaire d'événements associe chaque événement à une demande de rapprochement pour le propriétaire du déploiement. Dans ce cas, le propriétaire est l'objet Memcached
pour lequel le déploiement a été créé.
5.3.2.4.2. Configurations du contrôleur Copier lienLien copié sur presse-papiers!
Vous pouvez initialiser un contrôleur en utilisant de nombreuses autres configurations utiles. Par exemple, il est possible d'initialiser un contrôleur en utilisant de nombreuses autres configurations utiles :
Définissez le nombre maximum de rapprochements simultanés pour le contrôleur en utilisant l'option
MaxConcurrentReconciles
, dont la valeur par défaut est1
:Copy to Clipboard Copied! Toggle word wrap Toggle overflow - Filtrer les événements de veille à l'aide de prédicats.
-
Choisissez le type de EventHandler pour modifier la façon dont un événement de surveillance se traduit en demandes de rapprochement pour la boucle de rapprochement. Pour les relations entre opérateurs qui sont plus complexes que les ressources primaires et secondaires, vous pouvez utiliser le gestionnaire
EnqueueRequestsFromMapFunc
pour transformer un événement de surveillance en un ensemble arbitraire de demandes de rapprochement.
Pour plus de détails sur ces configurations et d'autres, voir les GoDocs sur les constructeurs et les contrôleurs en amont.
5.3.2.4.3. Boucle de réconciliation Copier lienLien copié sur presse-papiers!
Chaque contrôleur possède un objet de rapprochement avec une méthode Reconcile()
qui met en œuvre la boucle de rapprochement. La boucle de rapprochement reçoit l'argument Request
, qui est une clé d'espace de noms et de noms utilisée pour trouver l'objet de ressource primaire, Memcached
, à partir du cache :
En fonction des valeurs de retour, du résultat et de l'erreur, la demande peut être remise en file d'attente et la boucle de rapprochement peut être déclenchée à nouveau :
Vous pouvez également paramétrer le site Result.RequeueAfter
pour qu'il relance la demande après un délai de grâce :
import "time" // Reconcile for any reason other than an error after 5 seconds return ctrl.Result{RequeueAfter: time.Second*5}, nil
import "time"
// Reconcile for any reason other than an error after 5 seconds
return ctrl.Result{RequeueAfter: time.Second*5}, nil
Vous pouvez renvoyer Result
avec RequeueAfter
pour réconcilier périodiquement un CR.
Pour en savoir plus sur les réconciliateurs, les clients et l'interaction avec les événements de ressources, consultez la documentation de l 'API Controller Runtime Client.
5.3.2.4.4. Permissions et manifestes RBAC Copier lienLien copié sur presse-papiers!
Le contrôleur a besoin de certaines autorisations RBAC pour interagir avec les ressources qu'il gère. Ces autorisations sont spécifiées à l'aide de marqueurs RBAC, tels que les suivants :
Le manifeste de l'objet ClusterRole
à l'adresse config/rbac/role.yaml
est généré à partir des marqueurs précédents à l'aide de l'utilitaire controller-gen
chaque fois que la commande make manifests
est exécutée.
5.3.2.5. Activation de la prise en charge du proxy Copier lienLien copié sur presse-papiers!
Les auteurs d'opérateurs peuvent développer des opérateurs qui prennent en charge les proxys réseau. Les administrateurs de clusters configurent la prise en charge du proxy pour les variables d'environnement qui sont gérées par Operator Lifecycle Manager (OLM). Pour prendre en charge les clusters proxy, votre opérateur doit inspecter l'environnement à la recherche des variables proxy standard suivantes et transmettre les valeurs aux opérateurs :
-
HTTP_PROXY
-
HTTPS_PROXY
-
NO_PROXY
Ce tutoriel utilise HTTP_PROXY
comme variable d'environnement.
Conditions préalables
- Un cluster dont le proxy de sortie à l'échelle du cluster est activé.
Procédure
Modifiez le fichier
controllers/memcached_controller.go
pour y inclure les éléments suivants :Importez le paquet
proxy
à partir de laoperator-lib
bibliothèque :import ( ... "github.com/operator-framework/operator-lib/proxy" )
import ( ... "github.com/operator-framework/operator-lib/proxy" )
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Ajoutez la fonction d'aide
proxy.ReadProxyVarsFromEnv
à la boucle de rapprochement et ajoutez les résultats aux environnements Operand :for i, container := range dep.Spec.Template.Spec.Containers { dep.Spec.Template.Spec.Containers[i].Env = append(container.Env, proxy.ReadProxyVarsFromEnv()...) } ...
for i, container := range dep.Spec.Template.Spec.Containers { dep.Spec.Template.Spec.Containers[i].Env = append(container.Env, proxy.ReadProxyVarsFromEnv()...) } ...
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
Définissez la variable d'environnement sur le déploiement de l'opérateur en ajoutant ce qui suit au fichier
config/manager/manager.yaml
:Copy to Clipboard Copied! Toggle word wrap Toggle overflow
5.3.2.6. Fonctionnement de l'opérateur Copier lienLien copié sur presse-papiers!
Vous pouvez utiliser l'interface de programmation de l'opérateur SDK de trois manières différentes pour créer et exécuter votre opérateur :
- Exécuter localement en dehors du cluster comme un programme Go.
- Exécuter en tant que déploiement sur le cluster.
- Regroupez votre opérateur et utilisez Operator Lifecycle Manager (OLM) pour le déployer sur le cluster.
Avant d'exécuter votre opérateur basé sur Go en tant que déploiement sur OpenShift Container Platform ou en tant que bundle utilisant OLM, assurez-vous que votre projet a été mis à jour pour utiliser les images prises en charge.
5.3.2.6.1. Exécution locale en dehors du cluster Copier lienLien copié sur presse-papiers!
Vous pouvez exécuter votre projet Operator en tant que programme Go en dehors du cluster. Ceci est utile pour le développement afin d'accélérer le déploiement et les tests.
Procédure
Exécutez la commande suivante pour installer les définitions de ressources personnalisées (CRD) dans le cluster configuré dans votre fichier
~/.kube/config
et exécutez l'opérateur localement :make install run
$ make install run
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Exemple de sortie
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
5.3.2.6.2. Exécution en tant que déploiement sur le cluster Copier lienLien copié sur presse-papiers!
Vous pouvez exécuter votre projet Operator en tant que déploiement sur votre cluster.
Conditions préalables
- Préparez votre opérateur basé sur Go à fonctionner sur OpenShift Container Platform en mettant à jour le projet pour utiliser les images prises en charge
Procédure
Exécutez les commandes
make
suivantes pour construire et pousser l'image de l'opérateur. 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>/<image_name>:<tag>
$ make docker-build IMG=<registry>/<user>/<image_name>:<tag>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 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>/<image_name>:<tag>
$ make docker-push IMG=<registry>/<user>/<image_name>:<tag>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow NoteLe nom et la balise de l'image, par exemple
IMG=<registry>/<user>/<image_name>:<tag>
, dans les deux commandes peuvent également être définis dans votre Makefile. Modifiez la valeur deIMG ?= controller:latest
pour définir votre nom d'image par défaut.
Exécutez la commande suivante pour déployer l'opérateur :
make deploy IMG=<registry>/<user>/<image_name>:<tag>
$ make deploy IMG=<registry>/<user>/<image_name>:<tag>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Par défaut, cette commande crée un espace de noms avec le nom de votre projet Operator sous la forme
<project_name>-system
et est utilisé pour le déploiement. Cette commande installe également les manifestes RBAC à partir deconfig/rbac
.Exécutez la commande suivante pour vérifier que l'opérateur fonctionne :
oc get deployment -n <nom_du_projet>-système
oc get deployment -n <nom_du_projet>-système
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Exemple de sortie
NAME READY UP-TO-DATE AVAILABLE AGE <project_name>-controller-manager 1/1 1 1 8m
NAME READY UP-TO-DATE AVAILABLE AGE <project_name>-controller-manager 1/1 1 1 8m
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
5.3.2.6.3. Regroupement d'un opérateur et déploiement avec Operator Lifecycle Manager Copier lienLien copié sur presse-papiers!
5.3.2.6.3.1. Regroupement d'un opérateur Copier lienLien copié sur presse-papiers!
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>
$ make docker-build IMG=<registry>/<user>/<operator_image_name>:<tag>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 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>
$ make docker-push IMG=<registry>/<user>/<operator_image_name>:<tag>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
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>
$ make bundle IMG=<registry>/<user>/<operator_image_name>:<tag>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 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>
$ make bundle-build BUNDLE_IMG=<registry>/<user>/<bundle_image_name>:<tag>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Pousser l'image de la liasse :
docker push <registry>/<user>/<bundle_image_name>:<tag>
$ docker push <registry>/<user>/<bundle_image_name>:<tag>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
5.3.2.6.3.2. Déploiement d'un opérateur avec Operator Lifecycle Manager Copier lienLien copié sur presse-papiers!
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 \ -n <namespace> \ <registry>/<user>/<bundle_image_name>:<tag>
$ operator-sdk run bundle \
1 -n <namespace> \
2 <registry>/<user>/<bundle_image_name>:<tag>
3 Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 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.
5.3.2.7. Création d'une ressource personnalisée Copier lienLien copié sur presse-papiers!
Une fois votre opérateur installé, vous pouvez le tester en créant une ressource personnalisée (CR) qui est maintenant fournie sur le cluster par l'opérateur.
Conditions préalables
-
Exemple Memcached Operator, qui fournit le CR
Memcached
, installé sur un cluster
Procédure
Passez à l'espace de noms dans lequel votre opérateur est installé. Par exemple, si vous avez déployé l'opérateur à l'aide de la commande
make deploy
:oc project memcached-operator-system
$ oc project memcached-operator-system
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Modifiez l'exemple de manifeste
Memcached
CR à l'adresseconfig/samples/cache_v1_memcached.yaml
pour qu'il contienne la spécification suivante :Copy to Clipboard Copied! Toggle word wrap Toggle overflow Créer le CR :
oc apply -f config/samples/cache_v1_memcached.yaml
$ oc apply -f config/samples/cache_v1_memcached.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Assurez-vous que l'opérateur
Memcached
crée le déploiement pour l'échantillon de CR avec la taille correcte :oc get deployments
$ oc get deployments
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Exemple de sortie
NAME READY UP-TO-DATE AVAILABLE AGE memcached-operator-controller-manager 1/1 1 1 8m memcached-sample 3/3 3 3 1m
NAME READY UP-TO-DATE AVAILABLE AGE memcached-operator-controller-manager 1/1 1 1 8m memcached-sample 3/3 3 3 1m
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Vérifiez l'état des pods et du CR pour confirmer que l'état est mis à jour avec les noms des pods Memcached.
Vérifier les gousses :
oc get pods
$ oc get pods
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Exemple de sortie
NAME READY STATUS RESTARTS AGE memcached-sample-6fd7c98d8-7dqdr 1/1 Running 0 1m memcached-sample-6fd7c98d8-g5k7v 1/1 Running 0 1m memcached-sample-6fd7c98d8-m7vn7 1/1 Running 0 1m
NAME READY STATUS RESTARTS AGE memcached-sample-6fd7c98d8-7dqdr 1/1 Running 0 1m memcached-sample-6fd7c98d8-g5k7v 1/1 Running 0 1m memcached-sample-6fd7c98d8-m7vn7 1/1 Running 0 1m
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Vérifier l'état de la CR :
oc get memcached/memcached-sample -o yaml
$ oc get memcached/memcached-sample -o yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Exemple de sortie
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
Mettre à jour la taille du déploiement.
Mettre à jour le fichier
config/samples/cache_v1_memcached.yaml
pour modifier le champspec.size
dans le CRMemcached
de3
à5
:oc patch memcached memcached-sample \ -p '{"spec":{"size": 5}}' \ --type=merge
$ oc patch memcached memcached-sample \ -p '{"spec":{"size": 5}}' \ --type=merge
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Confirmez que l'opérateur modifie la taille du déploiement :
oc get deployments
$ oc get deployments
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Exemple de sortie
NAME READY UP-TO-DATE AVAILABLE AGE memcached-operator-controller-manager 1/1 1 1 10m memcached-sample 5/5 5 5 3m
NAME READY UP-TO-DATE AVAILABLE AGE memcached-operator-controller-manager 1/1 1 1 10m memcached-sample 5/5 5 5 3m
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
Supprimez le CR en exécutant la commande suivante :
oc delete -f config/samples/cache_v1_memcached.yaml
$ oc delete -f config/samples/cache_v1_memcached.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Nettoyer les ressources qui ont été créées dans le cadre de ce tutoriel.
Si vous avez utilisé la commande
make deploy
pour tester l'opérateur, exécutez la commande suivante :make undeploy
$ make undeploy
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Si vous avez utilisé la commande
operator-sdk run bundle
pour tester l'opérateur, exécutez la commande suivante :operator-sdk cleanup <nom_du_projet>
$ operator-sdk cleanup <nom_du_projet>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
5.3.3. Présentation du projet pour les opérateurs basés à Go Copier lienLien copié sur presse-papiers!
Le CLI operator-sdk
peut générer, ou scaffold, un certain nombre de paquets et de fichiers pour chaque projet Operator.
5.3.3.1. Présentation d'un projet basé sur Go Copier lienLien copié sur presse-papiers!
Les projets Operator basés sur Go, le type par défaut, générés à l'aide de la commande operator-sdk init
contiennent les fichiers et répertoires suivants :
Fichier ou répertoire | Objectif |
---|---|
|
Programme principal de l'opérateur. Il instancie un nouveau gestionnaire qui enregistre toutes les définitions de ressources personnalisées (CRD) dans le répertoire |
|
Arborescence de répertoires qui définit les API des CRD. Vous devez modifier les fichiers |
|
Implémentations de contrôleurs. Modifiez les fichiers |
| Manifestes Kubernetes utilisés pour déployer votre contrôleur sur un cluster, y compris les CRD, RBAC et les certificats. |
| Cibles utilisées pour construire et déployer votre contrôleur. |
| Instructions utilisées par un moteur de conteneur pour construire votre opérateur. |
| Les manifestes Kubernetes pour l'enregistrement des CRD, la configuration du RBAC et le déploiement de l'opérateur en tant que déploiement. |
5.3.4. Mise à jour des projets Operator basés sur Go pour les nouvelles versions du SDK Operator Copier lienLien copié sur presse-papiers!
OpenShift Container Platform 4.12 supporte Operator SDK 1.25.4. Si vous avez déjà le CLI 1.22.0 installé sur votre station de travail, vous pouvez mettre à jour le CLI vers 1.25.4 en installant la dernière version.
Cependant, pour que vos projets Operator existants restent compatibles avec Operator SDK 1.25.4, des étapes de mise à jour sont nécessaires pour les ruptures associées introduites depuis la version 1.22.0. Vous devez effectuer les étapes de mise à jour manuellement dans tous vos projets Operator qui ont été précédemment créés ou maintenus avec la version 1.22.0.
5.3.4.1. Mise à jour des projets Operator basés sur Go pour Operator SDK 1.25.4 Copier lienLien copié sur presse-papiers!
La procédure suivante met à jour un projet Go-based Operator existant pour le rendre compatible avec la version 1.25.4.
Conditions préalables
- Operator SDK 1.25.4 installé
- Un projet Operator créé ou maintenu avec Operator SDK 1.22.0
Procédure
Apportez les modifications suivantes au fichier
config/default/manager_auth_proxy_patch.yaml
:Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- Mettre à jour la version de la balise de
v4.11
àv4.12
.
Apportez les modifications suivantes à votre site
Makefile
:Pour activer la prise en charge des architectures multiples, ajoutez la cible
docker-buildx
à votre projetMakefile
:Exemple
Makefile
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Mettez à jour l'échafaudage de votre projet pour prendre en charge les modifications apportées à
kubebuilder
, comme le montre l'exemple suivant :Ancienne
Makefile
.PHONY: test test: manifests generate fmt vet envtest ## Run tests. KUBEBUILDER_ASSETS="$(shell $(ENVTEST) use $(ENVTEST_K8S_VERSION) -p path)" go test ./... -coverprofile cover.out
.PHONY: test test: manifests generate fmt vet envtest ## Run tests. KUBEBUILDER_ASSETS="$(shell $(ENVTEST) use $(ENVTEST_K8S_VERSION) -p path)" go test ./... -coverprofile cover.out
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Nouveau
Makefile
.PHONY: test test: manifests generate fmt vet envtest ## Run tests. KUBEBUILDER_ASSETS="$(shell $(ENVTEST) use $(ENVTEST_K8S_VERSION) -p path)" go test $(go list ./... | grep -v /test/) -coverprofile cover.out
.PHONY: test test: manifests generate fmt vet envtest ## Run tests. KUBEBUILDER_ASSETS="$(shell $(ENVTEST) use $(ENVTEST_K8S_VERSION) -p path)" go test $(go list ./... | grep -v /test/) -coverprofile cover.out
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Pour s'assurer que les cibles de
Makefile
ne téléchargent pas des binaires déjà présents dans votre chemin binaire, apportez les modifications suivantes à votre fichierMakefile
:Ancienne
Makefile
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Nouveau
Makefile
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Mettez à jour
controller-tools
vers la versionv0.9.2
comme indiqué dans l'exemple suivant :Exemple `Makefile
## Tool Versions KUSTOMIZE_VERSION ?= v3.8.7 CONTROLLER_TOOLS_VERSION ?= v0.9.2
## Tool Versions KUSTOMIZE_VERSION ?= v3.8.7 CONTROLLER_TOOLS_VERSION ?= v0.9.2
1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- Mise à jour de la version
v0.9.0
versv0.9.2
.
Pour appliquer les changements à votre
Makefile
et reconstruire votre Opérateur, entrez la commande suivante :make
$ make
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
Pour mettre à jour Go et ses dépendances, apportez les modifications suivantes à votre fichier
go.mod
:Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- Mise à jour de la version
1.18
vers1.19
. - 2
- Mise à jour de la version
v1.16.5
versv2.1.4
. - 3
- Mise à jour de la version
v1.18.1
versv1.19.0
. - 4
- Mise à jour de la version
v0.24.0
versv0.25.0
. - 5
- Mise à jour de la version
v0.24.0
versv0.25.0
. - 6
- Mise à jour de la version
v0.24.0
versv0.25.0
. - 7
- Mise à jour de la version
v0.12.1
versv0.13.0
.
Pour télécharger les versions mises à jour, nettoyer les dépendances et appliquer les changements dans votre fichier
go.mod
, exécutez la commande suivante :go mod tidy
$ go mod tidy
Copy to Clipboard Copied! Toggle word wrap Toggle overflow