5.5. Opérateurs à la barre
5.5.1. Premiers pas avec Operator SDK pour les opérateurs basés sur Helm
Le SDK Operator comprend des options permettant de générer un projet Operator qui exploite les cartes Helm existantes pour déployer des ressources Kubernetes en tant qu'application unifiée, sans avoir à écrire de code Go.
Pour démontrer les bases de la configuration et de l'exécution d'un opérateur basé sur Helm à 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 Helm pour Nginx et le déployer dans un cluster.
5.5.1.1. Conditions préalables
- Operator SDK CLI installé
-
OpenShift CLI (
oc
) v4.12 installé -
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
Ressources supplémentaires
5.5.1.2. Création et déploiement d'opérateurs basés sur Helm
Vous pouvez construire et déployer un simple opérateur basé sur Helm pour Nginx en utilisant le SDK de l'opérateur.
Procédure
Create a project.
Créez votre répertoire de projet :
$ mkdir nginx-operator
Allez dans le répertoire du projet :
$ cd nginx-operator
Exécutez la commande
operator-sdk init
avec le pluginhelm
pour initialiser le projet :$ operator-sdk init \ --plugins=helm
Create an API.
Créer une API Nginx simple :
$ operator-sdk create api \ --group demo \ --version v1 \ --kind Nginx
Cette API utilise le modèle de graphique intégré de Helm de la commande
helm create
.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>
Run the Operator.
Installer le CRD :
$ make install
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>
Add a security context constraint (SCC).
Le compte de service Nginx nécessite un accès privilégié pour fonctionner dans OpenShift Container Platform. Ajoutez le SCC suivant au compte de service pour le pod
nginx-sample
:$ oc adm policy add-scc-to-user \ anyuid system:serviceaccount:nginx-operator-system:nginx-sample
Create a sample custom resource (CR).
Créer un échantillon de CR :
$ oc apply -f config/samples/demo_v1_nginx.yaml \ -n nginx-operator-system
Il faut s'attendre à ce que le CR réconcilie l'opérateur :
$ oc logs deployment.apps/nginx-operator-controller-manager \ -c manager \ -n nginx-operator-system
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
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
5.5.1.3. Prochaines étapes
- Voir le tutoriel du SDK pour les opérateurs basés sur Hel m pour une description plus détaillée de la construction d'un opérateur basé sur Helm.
5.5.2. Didacticiel sur le SDK pour les opérateurs basés sur Helm
Les développeurs d'opérateurs peuvent profiter de la prise en charge de Helm dans le SDK de l'opérateur pour construire un exemple d'opérateur basé sur Helm pour Nginx et gérer son cycle de vie. Ce tutoriel décrit le processus suivant :
- Créer un déploiement Nginx
-
Veillez à ce que la taille du déploiement soit la même que celle spécifiée par la spécification de ressource personnalisée (CR) de
Nginx
-
Mettre à jour le statut du CR
Nginx
en utilisant le rédacteur de statut avec les noms des podsnginx
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 Helm-based Operators" (Démarrer avec Operator SDK pour les opérateurs basés sur le Helm).
5.5.2.1. Conditions préalables
- Operator SDK CLI installé
-
OpenShift CLI (
oc
) v4.12 installé -
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
Ressources supplémentaires
5.5.2.2. Création d'un projet
Utilisez l'interface de programmation Operator SDK pour créer un projet appelé nginx-operator
.
Procédure
Créer un répertoire pour le projet :
$ mkdir -p $HOME/projects/nginx-operator
Accédez au répertoire :
$ cd $HOME/projects/nginx-operator
Exécutez la commande
operator-sdk init
avec le pluginhelm
pour initialiser le projet :$ operator-sdk init \ --plugins=helm \ --domain=example.com \ --group=demo \ --version=v1 \ --kind=Nginx
NotePar défaut, le plugin
helm
initialise un projet à l'aide d'un diagramme Helm standard. Vous pouvez utiliser des drapeaux supplémentaires, tels que le drapeau--helm-chart
, pour initialiser un projet à l'aide d'un diagramme Helm existant.La commande
init
crée le projetnginx-operator
spécifiquement pour observer une ressource avec la version de l'APIexample.com/v1
et le typeNginx
.-
Pour les projets basés sur Helm, la commande
init
génère les règles RBAC dans le fichierconfig/rbac/role.yaml
en se basant sur les ressources qui seraient déployées par le manifeste par défaut de la carte. Vérifiez que les règles générées dans ce fichier répondent aux exigences de permission de l'opérateur.
5.5.2.2.1. Cartes existantes du gouvernail
Au lieu de créer votre projet avec un diagramme Helm standard, vous pouvez utiliser un diagramme existant, provenant de votre système de fichiers local ou d'un dépôt de diagrammes distant, en utilisant les drapeaux suivants :
-
--helm-chart
-
--helm-chart-repo
-
--helm-chart-version
Si l'option --helm-chart
est spécifiée, les options --group
, --version
et --kind
deviennent facultatives. S'ils ne sont pas définis, les valeurs par défaut suivantes sont utilisées :
Drapeau | Valeur |
---|---|
|
|
|
|
|
|
| Déduit du graphique spécifié |
Si l'indicateur --helm-chart
spécifie une archive de graphique locale, par exemple example-chart-1.2.0.tgz
, ou un répertoire, le graphique est validé et décompressé ou copié dans le projet. Dans le cas contraire, le SDK Operator tente de récupérer la carte à partir d'un référentiel distant.
Si l'URL d'un référentiel personnalisé n'est pas spécifiée par l'option --helm-chart-repo
, les formats de référence graphique suivants sont pris en charge :
Format | Description |
---|---|
|
Récupérer la carte Helm nommée |
| Récupère l'archive graphique de Helm à l'URL spécifiée. |
Si une URL de référentiel personnalisée est spécifiée par --helm-chart-repo
, le format de référence graphique suivant est pris en charge :
Format | Description |
---|---|
|
Récupère le graphique Helm nommé |
Si l'option --helm-chart-version
n'est pas activée, l'Operator SDK récupère la dernière version disponible de la carte Helm. Sinon, il récupère la version spécifiée. L'option --helm-chart-version
n'est pas utilisée lorsque la carte spécifiée avec l'option --helm-chart
fait référence à une version spécifique, par exemple lorsqu'il s'agit d'un chemin d'accès local ou d'une URL.
Pour plus de détails et d'exemples, exécutez :
$ operator-sdk init --plugins helm --help
5.5.2.2.2. Dossier PROJET
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 Helm. Par exemple :
domain: example.com layout: helm.sdk.operatorframework.io/v1 projectName: helm-operator resources: - group: demo kind: Nginx version: v1 version: 3
5.5.2.3. Comprendre la logique de l'opérateur
Dans cet exemple, le projet nginx-operator
exécute la logique de rapprochement suivante pour chaque ressource personnalisée (CR) Nginx
:
- Créer un déploiement Nginx s'il n'existe pas.
- Créer un service Nginx s'il n'existe pas.
- Créer une entrée Nginx si elle est activée et n'existe pas.
-
Assurez-vous que le déploiement, le service et l'entrée optionnelle correspondent à la configuration souhaitée, telle que spécifiée par la CR
Nginx
, par exemple le nombre de répliques, l'image et le type de service.
Par défaut, le projet nginx-operator
surveille les événements relatifs aux ressources Nginx
, comme indiqué dans le fichier watches.yaml
, et exécute les mises à jour Helm à l'aide du diagramme spécifié :
# Use the 'create api' subcommand to add watches to this file. - group: demo version: v1 kind: Nginx chart: helm-charts/nginx # +kubebuilder:scaffold:watch
5.5.2.3.1. Exemple de tableau de bord
Lorsqu'un projet Helm Operator est créé, le SDK Operator crée un exemple de diagramme Helm qui contient un ensemble de modèles pour une version simple de Nginx.
Dans cet exemple, des modèles sont disponibles pour les ressources de déploiement, de service et d'entrée, ainsi qu'un modèle NOTES.txt
, que les développeurs de diagrammes Helm utilisent pour transmettre des informations utiles sur une version.
Si vous n'êtes pas encore familiarisé avec les graphiques Helm, consultez la documentation du développeur Helm.
5.5.2.3.2. Modifier les spécifications des ressources personnalisées
Helm utilise un concept appelé valeurs pour personnaliser les valeurs par défaut d'un graphique Helm, qui sont définies dans le fichier values.yaml
.
Vous pouvez remplacer ces valeurs par défaut en définissant les valeurs souhaitées dans la spécification des ressources personnalisées (CR). Vous pouvez utiliser le nombre de répliques comme exemple.
Procédure
Le fichier
helm-charts/nginx/values.yaml
contient une valeur appeléereplicaCount
définie par défaut sur1
. Pour avoir deux instances Nginx dans votre déploiement, votre spécification CR doit contenirreplicaCount: 2
.Modifiez le fichier
config/samples/demo_v1_nginx.yaml
pour définirreplicaCount: 2
:apiVersion: demo.example.com/v1 kind: Nginx metadata: name: nginx-sample ... spec: ... replicaCount: 2
De même, le port de service par défaut est défini sur
80
. Pour utiliser8080
, modifiez le fichierconfig/samples/demo_v1_nginx.yaml
pour définirspec.port: 8080
, ce qui ajoute la priorité sur le port de service :apiVersion: demo.example.com/v1 kind: Nginx metadata: name: nginx-sample spec: replicaCount: 2 service: port: 8080
L'opérateur Helm applique l'intégralité de la spécification comme s'il s'agissait du contenu d'un fichier de valeurs, tout comme la commande helm install -f ./overrides.yaml
.
5.5.2.4. Activation de la prise en charge du proxy
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
watches.yaml
pour y inclure les dérogations basées sur une variable d'environnement en ajoutant le champoverrideValues
:... - group: demo.example.com version: v1alpha1 kind: Nginx chart: helm-charts/nginx overrideValues: proxy.http: $HTTP_PROXY ...
Ajouter la valeur
proxy.http
dans le fichierhelmcharts/nginx/values.yaml
:... proxy: http: "" https: "" no_proxy: ""
Pour vous assurer que le modèle de graphique prend en charge l'utilisation des variables, modifiez le modèle de graphique dans le fichier
helm-charts/nginx/templates/deployment.yaml
pour qu'il contienne les éléments suivants :containers: - name: {{ .Chart.Name }} securityContext: - toYaml {{ .Values.securityContext | nindent 12 }} image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}" imagePullPolicy: {{ .Values.image.pullPolicy }} env: - name: http_proxy value: "{{ .Values.proxy.http }}"
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
:containers: - args: - --leader-elect - --leader-election-id=ansible-proxy-demo image: controller:latest name: manager env: - name: "HTTP_PROXY" value: "http_proxy_test"
5.5.2.5. Fonctionnement de l'opérateur
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.
5.5.2.5.1. Exécution locale en dehors du cluster
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
Exemple de sortie
... {"level":"info","ts":1612652419.9289865,"logger":"controller-runtime.metrics","msg":"metrics server is starting to listen","addr":":8080"} {"level":"info","ts":1612652419.9296563,"logger":"helm.controller","msg":"Watching resource","apiVersion":"demo.example.com/v1","kind":"Nginx","namespace":"","reconcilePeriod":"1m0s"} {"level":"info","ts":1612652419.929983,"logger":"controller-runtime.manager","msg":"starting metrics server","path":"/metrics"} {"level":"info","ts":1612652419.930015,"logger":"controller-runtime.manager.controller.nginx-controller","msg":"Starting EventSource","source":"kind source: demo.example.com/v1, Kind=Nginx"} {"level":"info","ts":1612652420.2307851,"logger":"controller-runtime.manager.controller.nginx-controller","msg":"Starting Controller"} {"level":"info","ts":1612652420.2309358,"logger":"controller-runtime.manager.controller.nginx-controller","msg":"Starting workers","worker count":8}
5.5.2.5.2. Exécution en tant que déploiement sur le cluster
Vous pouvez exécuter votre projet Operator en tant que déploiement sur votre cluster.
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>
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>
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>
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
Exemple de sortie
NAME READY UP-TO-DATE AVAILABLE AGE <project_name>-controller-manager 1/1 1 1 8m
5.5.2.5.3. Regroupement d'un opérateur et déploiement avec Operator Lifecycle Manager
5.5.2.5.3.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
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.5.2.5.3.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
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.
5.5.2.6. Création d'une ressource personnalisée
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 Nginx Operator, qui fournit le CR
Nginx
, 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 nginx-operator-system
Modifiez l'exemple de manifeste
Nginx
CR à l'adresseconfig/samples/demo_v1_nginx.yaml
pour qu'il contienne la spécification suivante :apiVersion: demo.example.com/v1 kind: Nginx metadata: name: nginx-sample ... spec: ... replicaCount: 3
Le compte de service Nginx nécessite un accès privilégié pour fonctionner dans OpenShift Container Platform. Ajoutez la contrainte de contexte de sécurité (SCC) suivante au compte de service du pod
nginx-sample
:$ oc adm policy add-scc-to-user \ anyuid system:serviceaccount:nginx-operator-system:nginx-sample
Créer le CR :
$ oc apply -f config/samples/demo_v1_nginx.yaml
Assurez-vous que l'opérateur
Nginx
crée le déploiement pour l'échantillon de CR avec la taille correcte :$ oc get deployments
Exemple de sortie
NAME READY UP-TO-DATE AVAILABLE AGE nginx-operator-controller-manager 1/1 1 1 8m nginx-sample 3/3 3 3 1m
Vérifiez le statut des pods et du CR pour confirmer que le statut est mis à jour avec les noms des pods Nginx.
Vérifier les gousses :
$ oc get pods
Exemple de sortie
NAME READY STATUS RESTARTS AGE nginx-sample-6fd7c98d8-7dqdr 1/1 Running 0 1m nginx-sample-6fd7c98d8-g5k7v 1/1 Running 0 1m nginx-sample-6fd7c98d8-m7vn7 1/1 Running 0 1m
Vérifier l'état de la CR :
$ oc get nginx/nginx-sample -o yaml
Exemple de sortie
apiVersion: demo.example.com/v1 kind: Nginx metadata: ... name: nginx-sample ... spec: replicaCount: 3 status: nodes: - nginx-sample-6fd7c98d8-7dqdr - nginx-sample-6fd7c98d8-g5k7v - nginx-sample-6fd7c98d8-m7vn7
Mettre à jour la taille du déploiement.
Mettre à jour le fichier
config/samples/demo_v1_nginx.yaml
pour modifier le champspec.size
dans le CRNginx
de3
à5
:$ oc patch nginx nginx-sample \ -p '{"spec":{"replicaCount": 5}}' \ --type=merge
Confirmez que l'opérateur modifie la taille du déploiement :
$ oc get deployments
Exemple de sortie
NAME READY UP-TO-DATE AVAILABLE AGE nginx-operator-controller-manager 1/1 1 1 10m nginx-sample 5/5 5 5 3m
Supprimez le CR en exécutant la commande suivante :
$ oc delete -f config/samples/demo_v1_nginx.yaml
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
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>
5.5.2.7. Ressources supplémentaires
- Pour en savoir plus sur les structures de répertoire créées par le SDK de l'opérateur, consultez la section Présentation du projet pour les opérateurs basés sur Helm.
- Si un proxy de sortie à l'échelle du cluster est configuré, les administrateurs du cluster peuvent remplacer les paramètres du proxy ou injecter un certificat CA personnalisé pour des opérateurs spécifiques fonctionnant sur Operator Lifecycle Manager (OLM).
5.5.3. Présentation du projet pour les opérateurs à la barre
Le CLI operator-sdk
peut générer, ou scaffold, un certain nombre de paquets et de fichiers pour chaque projet Operator.
5.5.3.1. Présentation du projet à partir de la barre
Les projets Operator basés sur Helm et générés à l'aide de la commande operator-sdk init --plugins helm
contiennent les répertoires et fichiers suivants :
Fichiers/dossiers | Objectif |
---|---|
| Personnaliser les manifestes pour déployer l'opérateur sur un cluster Kubernetes. |
|
La carte du gouvernail est initialisée par la commande |
|
Utilisé pour construire l'image de l'opérateur avec la commande |
| Groupe/version/genre (GVK) et emplacement de la carte du gouvernail. |
| Objectifs utilisés pour gérer le projet. |
| Fichier YAML contenant des informations sur les métadonnées de l'opérateur. |
5.5.4. Mise à jour des projets basés sur Helm pour les nouvelles versions du SDK Operator
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.5.4.1. Mise à jour des projets d'opérateurs basés sur Helm pour Operator SDK 1.25.4
La procédure suivante permet de mettre à jour un projet d'opérateur basé sur Helm 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
:apiVersion: apps/v1 kind: Deployment metadata: name: controller-manager namespace: system spec: template: spec: containers: - name: kube-rbac-proxy image: registry.redhat.io/openshift4/ose-kube-rbac-proxy:v4.12 1 args: - "--secure-listen-address=0.0.0.0:8443" - "--upstream=http://127.0.0.1:8080/" - "--logtostderr=true" - "--v=0" ...
- 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
# PLATFORMS defines the target platforms for the manager image be build to provide support to multiple # architectures. (i.e. make docker-buildx IMG=myregistry/mypoperator:0.0.1). To use this option you need to: # - able to use docker buildx . More info: https://docs.docker.com/build/buildx/ # - have enable BuildKit, More info: https://docs.docker.com/develop/develop-images/build_enhancements/ # - be able to push the image for your registry (i.e. if you do not inform a valid value via IMG=<myregistry/image:<tag>> than the export will fail) # To properly provided solutions that supports more than one platform you should use this option. PLATFORMS ?= linux/arm64,linux/amd64,linux/s390x,linux/ppc64le .PHONY: docker-buildx docker-buildx: test ## Build and push docker image for the manager for cross-platform support # copy existing Dockerfile and insert --platform=${BUILDPLATFORM} into Dockerfile.cross, and preserve the original Dockerfile sed -e '1 s/\(^FROM\)/FROM --platform=\$$\{BUILDPLATFORM\}/; t' -e ' 1,// s//FROM --platform=\$$\{BUILDPLATFORM\}/' Dockerfile > Dockerfile.cross - docker buildx create --name project-v3-builder docker buildx use project-v3-builder - docker buildx build --push --platform=$(PLATFORMS) --tag ${IMG} -f Dockerfile.cross - docker buildx rm project-v3-builder rm Dockerfile.cross
Pour permettre la prise en charge des architectures
arm64
dans votre projet Operator, apportez les modifications suivantes à votre projetMakefile
:Ancienne
Makefile
OS := $(shell uname -s | tr '[:upper:]' '[:lower:]') ARCH := $(shell uname -m | sed 's/x86_64/amd64/')
Nouveau
Makefile
OS := $(shell uname -s | tr '[:upper:]' '[:lower:]') ARCH := $(shell uname -m | sed 's/x86_64/amd64/' | sed 's/aarch64/arm64/')
Mettez à jour la version de Kustomize à
v4.5.5
comme indiqué dans l'exemple suivant :Ancienne
Makefile
.PHONY: kustomize KUSTOMIZE = $(shell pwd)/bin/kustomize kustomize: ## Download kustomize locally if necessary. ifeq (,$(wildcard $(KUSTOMIZE))) ifeq (,$(shell which kustomize 2>/dev/null)) @{ \ set -e ;\ mkdir -p $(dir $(KUSTOMIZE)) ;\ curl -sSLo - https://github.com/kubernetes-sigs/kustomize/releases/download/kustomize/v3.8.7/kustomize_v3.8.7_$(OS)_$(ARCH).tar.gz | \ tar xzf - -C bin/ ;\ } else
Nouveau
Makefile
.PHONY: kustomize KUSTOMIZE = $(shell pwd)/bin/kustomize kustomize: ## Download kustomize locally if necessary. ifeq (,$(wildcard $(KUSTOMIZE))) ifeq (,$(shell which kustomize 2>/dev/null)) @{ \ set -e ;\ mkdir -p $(dir $(KUSTOMIZE)) ;\ curl -sSLo - https://github.com/kubernetes-sigs/kustomize/releases/download/kustomize/v4.5.5/kustomize_v4.5.5_$(OS)_$(ARCH).tar.gz | \ 1 tar xzf - -C bin/ ;\ } else
- 1
- Mise à jour de la version
v3.8.7
versv4.5.5
.
ImportantLa version de Kustomize
4.0.0
a supprimé le plugingo-getter
et a introduit des changements qui ne sont pas compatibles avec les versions antérieures. Les projets d'opérateurs qui s'appuient sur des versions antérieures de Kustomize pourraient ne pas fonctionner avec les nouvelles versions.Pour appliquer les changements à votre
Makefile
et reconstruire votre Opérateur, entrez la commande suivante :$ make
Mettez à jour votre fichier
config/default/kustomizations.yaml
comme indiqué dans les exemples suivants :Exemple de fichier
kustomizations.yaml
# Adds namespace to all resources. namespace: memcached-operator-system # Value of this field is prepended to the # names of all resources, e.g. a deployment named # "wordpress" becomes "alices-wordpress". # Note that it should also match with the prefix (text before '-') of the namespace # field above. namePrefix: memcached-operator- # Labels to add to all resources and selectors. #labels: 1 #- includeSelectors: true 2 # pairs: # someName: someValue resources: 3 - ../crd - ../rbac - ../manager
5.5.4.2. Ressources supplémentaires
5.5.5. Prise en charge de Helm dans Operator SDK
5.5.5.1. Tableaux de bord
L'une des options du SDK Operator pour générer un projet Operator comprend l'exploitation d'un diagramme Helm existant pour déployer des ressources Kubernetes en tant qu'application unifiée, sans avoir à écrire de code Go. De tels opérateurs basés sur Helm sont conçus pour exceller dans les applications sans état qui nécessitent très peu de logique lors du déploiement, car les changements doivent être appliqués aux objets Kubernetes qui sont générés dans le cadre du diagramme. Cela peut sembler restrictif, mais peut être suffisant pour un nombre surprenant de cas d'utilisation, comme le montre la prolifération des diagrammes Helm construits par la communauté Kubernetes.
La fonction principale d'un opérateur est de lire un objet personnalisé qui représente votre instance d'application et de faire en sorte que son état souhaité corresponde à ce qui est en cours d'exécution. Dans le cas d'un opérateur basé sur Helm, le champ spec
de l'objet est une liste d'options de configuration qui sont généralement décrites dans le fichier Helm values.yaml
. Au lieu de définir ces valeurs avec des drapeaux à l'aide de la CLI Helm (par exemple, helm install -f values.yaml
), vous pouvez les exprimer dans une ressource personnalisée (CR), qui, en tant qu'objet Kubernetes natif, permet de bénéficier des avantages du RBAC qui lui est appliqué et d'une piste d'audit.
Pour un exemple de CR simple appelé Tomcat
:
apiVersion: apache.org/v1alpha1 kind: Tomcat metadata: name: example-app spec: replicaCount: 2
La valeur replicaCount
, 2
dans le cas présent, est propagée dans le modèle de graphique où le texte suivant est utilisé :
{{ .Values.replicaCount }}
Une fois qu'un opérateur est construit et déployé, vous pouvez déployer une nouvelle instance d'une application en créant une nouvelle instance d'un CR, ou répertorier les différentes instances en cours d'exécution dans tous les environnements à l'aide de la commande oc
:
$ oc get Tomcats --all-namespaces
Il n'est pas nécessaire d'utiliser l'interface de programmation Helm ou d'installer Tiller ; les opérateurs basés sur Helm importent le code du projet Helm. Tout ce que vous avez à faire est d'avoir une instance de l'opérateur en cours d'exécution et d'enregistrer le CR avec une définition de ressource personnalisée (CRD). Parce qu'il obéit au RBAC, vous pouvez plus facilement empêcher les changements de production.
5.5.6. Tutoriel sur le SDK pour les opérateurs du gouvernail hybride
Le support standard de l'opérateur basé sur Helm dans le SDK de l'opérateur a des fonctionnalités limitées par rapport au support de l'opérateur basé sur Go et Ansible qui a atteint la capacité de pilotage automatique (niveau V) dans le modèle de maturité de l'opérateur.
L'opérateur hybride Helm améliore les capacités du support existant basé sur Helm grâce aux API Go. Avec cette approche hybride de Helm et Go, le SDK de l'Opérateur permet aux auteurs de l'Opérateur d'utiliser le processus suivant :
- Générer une structure par défaut pour, ou scaffold, une API Go dans le même projet que Helm.
-
Configurer le réconciliateur Helm dans le fichier
main.go
du projet, à l'aide des bibliothèques fournies par l'Opérateur Helm Hybride.
L'opérateur Hybrid Helm est une fonctionnalité d'aperçu technologique uniquement. Les fonctionnalités de l'aperçu technologique ne sont pas prises en charge par les accords de niveau de service (SLA) de production de Red Hat et peuvent ne pas être complètes sur le plan fonctionnel. Red Hat ne recommande pas leur utilisation en production. Ces fonctionnalités offrent un accès anticipé aux fonctionnalités des produits à venir, ce qui permet aux clients de tester les fonctionnalités et de fournir un retour d'information pendant le processus de développement.
Pour plus d'informations sur la portée de l'assistance des fonctionnalités de l'aperçu technologique de Red Hat, voir Portée de l'assistance des fonctionnalités de l'aperçu technologique.
Ce tutoriel décrit le processus suivant à l'aide de l'opérateur de pilotage hybride :
-
Créer un déploiement
Memcached
à travers une carte Helm si elle n'existe pas -
Assurez-vous que la taille du déploiement est la même que celle spécifiée par
Memcached
custom resource (CR) spec -
Créer un déploiement
MemcachedBackup
en utilisant l'API Go
5.5.6.1. Conditions préalables
- Operator SDK CLI installé
-
OpenShift CLI (
oc
) v4.12 installé -
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
Ressources supplémentaires
5.5.6.2. Création d'un projet
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/github.com/example/memcached-operator
Accédez au répertoire :
$ cd $HOME/github.com/example/memcached-operator
Exécutez la commande
operator-sdk init
pour initialiser le projet. Utilisez un domaine deexample.com
pour que tous les groupes API soient<group>.example.com
:$ operator-sdk init \ --plugins=hybrid.helm.sdk.operatorframework.io \ --project-version="3" \ --domain example.com \ --repo=github.com/example/memcached-operator
La commande
init
génère les règles RBAC dans le fichierconfig/rbac/role.yaml
en se basant sur les ressources qui seraient déployées par les manifestes par défaut de la carte. Vérifiez que les règles générées dans le fichierconfig/rbac/role.yaml
répondent aux exigences de permission de votre opérateur.
Ressources supplémentaires
- Cette procédure crée une structure de projet compatible avec les API Helm et Go. Pour en savoir plus sur la structure du répertoire du projet, voir Disposition du projet.
5.5.6.3. Création d'une API Helm
Utilisez le SDK CLI de l'opérateur pour créer une API Helm.
Procédure
Exécutez la commande suivante pour créer une API Helm avec le groupe
cache
, la versionv1
et le typeMemcached
:$ operator-sdk create api \ --plugins helm.sdk.operatorframework.io/v1 \ --group cache \ --version v1 \ --kind Memcached
Cette procédure configure également votre projet Operator pour qu'il observe la ressource Memcached
avec la version d'API v1
et met en place un modèle de graphique Helm. Au lieu de créer le projet à partir du modèle de graphique Helm fourni par le SDK Operator, vous pouvez utiliser un graphique existant de votre système de fichiers local ou d'un référentiel de graphiques distant.
Pour plus de détails et d'exemples sur la création d'une API Helm basée sur des graphiques existants ou nouveaux, exécutez la commande suivante :
$ operator-sdk create api --plugins helm.sdk.operatorframework.io/v1 --help
Ressources supplémentaires
5.5.6.3.1. Logique de l'opérateur pour l'API Helm
Par défaut, votre projet Operator scaffolded observe les événements de ressources Memcached
comme indiqué dans le fichier watches.yaml
et exécute les releases Helm en utilisant le diagramme spécifié.
Exemple 5.2. Exemple de fichier watches.yaml
# Use the 'create api' subcommand to add watches to this file. - group: cache.my.domain version: v1 kind: Memcached chart: helm-charts/memcached #+kubebuilder:scaffold:watch
Ressources supplémentaires
- Pour une documentation détaillée sur la personnalisation de la logique de l'opérateur de barre par le biais du tableau, voir Comprendre la logique de l'opérateur.
5.5.6.3.2. Configurations personnalisées du réconciliateur Helm à l'aide des bibliothèques API fournies
L'un des inconvénients des opérateurs existants basés sur Helm est l'impossibilité de configurer le réconciliateur Helm, car il n'est pas pris en compte par les utilisateurs. Pour qu'un opérateur basé sur Helm puisse atteindre la capacité de mise à niveau transparente (niveau II et suivants) qui réutilise une carte Helm déjà existante, un hybride entre les types Go et Helm Operator apporte une valeur ajoutée.
Les API fournies dans la bibliothèque helm-operator-plugins
permettent aux auteurs d'opérateurs d'effectuer les configurations suivantes :
- Personnaliser la cartographie des valeurs en fonction de l'état de la grappe
- Exécuter du code dans des événements spécifiques en configurant l'enregistreur d'événements du réconciliateur
- Personnaliser le journal du réconciliateur
-
Configurer les annotations
Install
,Upgrade
, etUninstall
pour permettre aux actions de Helm d'être configurées en fonction des annotations trouvées dans les ressources personnalisées surveillées par le réconciliateur -
Configurer le réconciliateur pour qu'il fonctionne avec les crochets
Pre
etPost
Les configurations ci-dessus peuvent être effectuées dans le fichier main.go
:
Exemple de fichier main.go
// Operator's main.go // With the help of helpers provided in the library, the reconciler can be // configured here before starting the controller with this reconciler. reconciler := reconciler.New( reconciler.WithChart(*chart), reconciler.WithGroupVersionKind(gvk), ) if err := reconciler.SetupWithManager(mgr); err != nil { panic(fmt.Sprintf("unable to create reconciler: %s", err)) }
5.5.6.4. Création d'une API Go
Utilisez le SDK CLI de l'opérateur pour créer une API Go.
Procédure
Exécutez la commande suivante pour créer une API Go avec le groupe
cache
, la versionv1
et le typeMemcachedBackup
:$ operator-sdk create api \ --group=cache \ --version v1 \ --kind MemcachedBackup \ --resource \ --controller \ --plugins=go/v3
Lorsque vous y êtes invité, entrez
y
pour créer à la fois la ressource et le contrôleur :$ Create Resource [y/n] y Create Controller [y/n] y
Cette procédure génère la ressource MemcachedBackup
API à l'adresse api/v1/memcachedbackup_types.go
et le contrôleur à l'adresse controllers/memcachedbackup_controller.go
.
5.5.6.4.1. Définition de l'API
Définir l'API pour la ressource personnalisée (CR) MemcachedBackup
.
Représentez cette API Go en définissant le type MemcachedBackup
, qui aura un champ MemcachedBackupSpec.Size
pour définir la quantité d'instances de sauvegarde Memcached (CR) à déployer, et un champ MemcachedBackupStatus.Nodes
pour stocker les noms des pods d'un CR.
Le champ Node
est utilisé pour illustrer un exemple de champ Status
.
Procédure
Définir l'API pour le CR
MemcachedBackup
en modifiant les définitions de type Go dans le fichierapi/v1/memcachedbackup_types.go
pour obtenir les typesspec
etstatus
:Exemple 5.3. Exemple de fichier
api/v1/memcachedbackup_types.go
// MemcachedBackupSpec defines the desired state of MemcachedBackup type MemcachedBackupSpec struct { // INSERT ADDITIONAL SPEC FIELDS - desired state of cluster // Important: Run "make" to regenerate code after modifying this file //+kubebuilder:validation:Minimum=0 // Size is the size of the memcached deployment Size int32 `json:"size"` } // MemcachedBackupStatus defines the observed state of MemcachedBackup type MemcachedBackupStatus struct { // INSERT ADDITIONAL STATUS FIELD - define observed state of cluster // Important: Run "make" to regenerate code after modifying this file // Nodes are the names of the memcached pods Nodes []string `json:"nodes"` }
Mettre à jour le code généré pour le type de ressource :
$ make generate
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.Une fois l'API définie avec les champs
spec
etstatus
et les marqueurs de validation CRD, générer et mettre à jour les manifestes CRD :$ make manifests
Cette cible Makefile invoque l'utilitaire controller-gen
pour générer les manifestes CRD dans le fichier config/crd/bases/cache.my.domain_memcachedbackups.yaml
.
5.5.6.4.2. Mise en œuvre du contrôleur
Le contrôleur de ce tutoriel effectue les actions suivantes :
-
Créez 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
.
Pour une explication détaillée sur la manière de configurer le contrôleur pour qu'il effectue les actions mentionnées ci-dessus, voir Mise en œuvre du contrôleur dans le tutoriel SDK de l'opérateur pour les opérateurs standard basés sur Go.
5.5.6.4.3. Différences dans main.go
Pour les opérateurs standard basés sur Go et l'opérateur hybride Helm, le fichier main.go
gère l'échafaudage, l'initialisation et l'exécution du programme pour l'API Go Manager
pour l'API Go. Pour l'opérateur Helm hybride, cependant, le fichier main.go
expose également la logique de chargement du fichier watches.yaml
et de configuration du réconciliateur Helm.
Exemple 5.4. Exemple de fichier main.go
... for _, w := range ws { // Register controller with the factory reconcilePeriod := defaultReconcilePeriod if w.ReconcilePeriod != nil { reconcilePeriod = w.ReconcilePeriod.Duration } maxConcurrentReconciles := defaultMaxConcurrentReconciles if w.MaxConcurrentReconciles != nil { maxConcurrentReconciles = *w.MaxConcurrentReconciles } r, err := reconciler.New( reconciler.WithChart(*w.Chart), reconciler.WithGroupVersionKind(w.GroupVersionKind), reconciler.WithOverrideValues(w.OverrideValues), reconciler.SkipDependentWatches(w.WatchDependentResources != nil && !*w.WatchDependentResources), reconciler.WithMaxConcurrentReconciles(maxConcurrentReconciles), reconciler.WithReconcilePeriod(reconcilePeriod), reconciler.WithInstallAnnotations(annotation.DefaultInstallAnnotations...), reconciler.WithUpgradeAnnotations(annotation.DefaultUpgradeAnnotations...), reconciler.WithUninstallAnnotations(annotation.DefaultUninstallAnnotations...), ) ...
Le gestionnaire est initialisé avec les conciliateurs Helm
et Go
:
Exemple 5.5. Exemple de conciliateurs Helm
et Go
... // Setup manager with Go API if err = (&controllers.MemcachedBackupReconciler{ Client: mgr.GetClient(), Scheme: mgr.GetScheme(), }).SetupWithManager(mgr); err != nil { setupLog.Error(err, "unable to create controller", "controller", "MemcachedBackup") os.Exit(1) } ... // Setup manager with Helm API for _, w := range ws { ... if err := r.SetupWithManager(mgr); err != nil { setupLog.Error(err, "unable to create controller", "controller", "Helm") os.Exit(1) } setupLog.Info("configured watch", "gvk", w.GroupVersionKind, "chartPath", w.ChartPath, "maxConcurrentReconciles", maxConcurrentReconciles, "reconcilePeriod", reconcilePeriod) } // Start the manager if err := mgr.Start(ctrl.SetupSignalHandler()); err != nil { setupLog.Error(err, "problem running manager") os.Exit(1) }
5.5.6.4.4. Permissions et manifestes RBAC
Le contrôleur nécessite certaines autorisations de contrôle d'accès basé sur les rôles (RBAC) pour interagir avec les ressources qu'il gère. Pour l'API Go, ces autorisations sont spécifiées à l'aide de marqueurs RBAC, comme le montre le didacticiel Operator SDK pour les opérateurs standard basés sur Go.
Pour l'API Helm, les permissions sont échafaudées par défaut dans roles.yaml
. Actuellement, cependant, en raison d'un problème connu lorsque l'API Go est scaffoldée, les permissions pour l'API Helm sont écrasées. En raison de ce problème, assurez-vous que les autorisations définies dans roles.yaml
correspondent à vos besoins.
Ce problème connu fait l'objet d'un suivi sur https://github.com/operator-framework/helm-operator-plugins/issues/142.
Voici un exemple de role.yaml
pour un opérateur Memcached :
Exemple 5.6. Exemple de conciliateurs Helm
et Go
--- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: manager-role rules: - apiGroups: - "" resources: - namespaces verbs: - get - apiGroups: - apps resources: - deployments - daemonsets - replicasets - statefulsets verbs: - create - delete - get - list - patch - update - watch - apiGroups: - cache.my.domain resources: - memcachedbackups verbs: - create - delete - get - list - patch - update - watch - apiGroups: - cache.my.domain resources: - memcachedbackups/finalizers verbs: - create - delete - get - list - patch - update - watch - apiGroups: - "" resources: - pods - services - services/finalizers - endpoints - persistentvolumeclaims - events - configmaps - secrets - serviceaccounts verbs: - create - delete - get - list - patch - update - watch - apiGroups: - cache.my.domain resources: - memcachedbackups/status verbs: - get - patch - update - apiGroups: - policy resources: - events - poddisruptionbudgets verbs: - create - delete - get - list - patch - update - watch - apiGroups: - cache.my.domain resources: - memcacheds - memcacheds/status - memcacheds/finalizers verbs: - create - delete - get - list - patch - update - watch
Ressources supplémentaires
5.5.6.5. Exécution locale en dehors du cluster
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
5.5.6.6. Exécution en tant que déploiement sur le cluster
Vous pouvez exécuter votre projet Operator en tant que déploiement sur votre cluster.
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>
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>
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>
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
Exemple de sortie
NAME READY UP-TO-DATE AVAILABLE AGE <project_name>-controller-manager 1/1 1 1 8m
5.5.6.7. Créer des ressources personnalisées
Une fois votre opérateur installé, vous pouvez le tester en créant des ressources personnalisées (CR) qui sont désormais fournies sur le cluster par l'opérateur.
Procédure
Passez à l'espace de noms dans lequel votre opérateur est installé :
$ oc project <nom_du_projet>-système
Mettez à jour l'exemple de manifeste
Memcached
CR dans le fichierconfig/samples/cache_v1_memcached.yaml
en remplaçant le champreplicaCount
par3
:Exemple 5.7. Exemple de fichier
config/samples/cache_v1_memcached.yaml
apiVersion: cache.my.domain/v1 kind: Memcached metadata: name: memcached-sample spec: # Default values copied from <project_dir>/helm-charts/memcached/values.yaml affinity: {} autoscaling: enabled: false maxReplicas: 100 minReplicas: 1 targetCPUUtilizationPercentage: 80 fullnameOverride: "" image: pullPolicy: IfNotPresent repository: nginx tag: "" imagePullSecrets: [] ingress: annotations: {} className: "" enabled: false hosts: - host: chart-example.local paths: - path: / pathType: ImplementationSpecific tls: [] nameOverride: "" nodeSelector: {} podAnnotations: {} podSecurityContext: {} replicaCount: 3 resources: {} securityContext: {} service: port: 80 type: ClusterIP serviceAccount: annotations: {} create: true name: "" tolerations: []
Créer le CR
Memcached
:$ oc apply -f config/samples/cache_v1_memcached.yaml
Assurez-vous que l'opérateur Memcached crée le déploiement pour l'exemple de CR avec la taille correcte :
$ oc get pods
Exemple de sortie
NAME READY STATUS RESTARTS AGE memcached-sample-6fd7c98d8-7dqdr 1/1 Running 0 18m memcached-sample-6fd7c98d8-g5k7v 1/1 Running 0 18m memcached-sample-6fd7c98d8-m7vn7 1/1 Running 0 18m
Mettez à jour l'exemple de manifeste
MemcachedBackup
CR dans le fichierconfig/samples/cache_v1_memcachedbackup.yaml
en mettant à jour le fichiersize
en2
:Exemple 5.8. Exemple de fichier
config/samples/cache_v1_memcachedbackup.yaml
apiVersion: cache.my.domain/v1 kind: MemcachedBackup metadata: name: memcachedbackup-sample spec: size: 2
Créer le CR
MemcachedBackup
:$ oc apply -f config/samples/cache_v1_memcachedbackup.yaml
Assurez-vous que le nombre de pods
memcachedbackup
est le même que celui spécifié dans le CR :$ oc get pods
Exemple de sortie
NAME READY STATUS RESTARTS AGE memcachedbackup-sample-8649699989-4bbzg 1/1 Running 0 22m memcachedbackup-sample-8649699989-mq6mx 1/1 Running 0 22m
-
Vous pouvez mettre à jour les
spec
dans chacun des CR ci-dessus, puis les appliquer à nouveau. Le contrôleur procède à une nouvelle réconciliation et s'assure que la taille des pods est conforme à ce qui est spécifié dans le sitespec
des CR respectifs. Nettoyer les ressources qui ont été créées dans le cadre de ce tutoriel :
Supprimer la ressource
Memcached
:$ oc delete -f config/samples/cache_v1_memcached.yaml
Supprimer la ressource
MemcachedBackup
:$ oc delete -f config/samples/cache_v1_memcachedbackup.yaml
Si vous avez utilisé la commande
make deploy
pour tester l'opérateur, exécutez la commande suivante :$ make undeploy
5.5.6.8. Schéma du projet
L'échafaudage de l'opérateur hybride Helm est personnalisé pour être compatible avec les API Helm et Go.
Fichiers/dossiers | Objectif |
---|---|
|
Instructions utilisées par un moteur de conteneur pour construire votre image d'opérateur avec la commande |
| Fichier de construction avec des cibles d'aide pour vous aider à travailler avec votre projet. |
| Fichier YAML contenant des informations sur les métadonnées de l'opérateur. Représente la configuration du projet et est utilisé pour suivre les informations utiles pour le CLI et les plugins. |
|
Contient des binaires utiles tels que |
| Contient les fichiers de configuration, y compris tous les manifestes Kustomize, pour lancer votre projet Operator sur un cluster. Les plugins peuvent l'utiliser pour fournir des fonctionnalités. Par exemple, pour que le SDK Operator vous aide à créer votre bundle Operator, le CLI recherche les CRD et CR qui sont échafaudés dans ce répertoire.
|
| Contient la définition de l'API Go. |
| Contient les contrôleurs de l'API Go. |
| Contient des fichiers utilitaires, tels que le fichier utilisé pour structurer l'en-tête de licence pour les fichiers de votre projet. |
|
Programme principal de l'opérateur. Installe un nouveau gestionnaire qui enregistre toutes les définitions de ressources personnalisées (CRD) dans le répertoire |
|
Contient les graphiques Helm qui peuvent être spécifiés en utilisant la commande |
| Contient le groupe/la version/l'espèce (GVK) et l'emplacement de la carte Helm. Utilisé pour configurer les montres Helm. |
5.5.7. Mise à jour des projets basés sur Hybrid Helm pour les nouvelles versions du SDK Operator
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.5.7.1. Mise à jour des projets d'opérateurs hybrides basés sur Helm pour Operator SDK 1.25.4
La procédure suivante permet de mettre à jour un projet d'opérateur hybride basé sur Helm 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
:apiVersion: apps/v1 kind: Deployment metadata: name: controller-manager namespace: system spec: template: spec: containers: - name: kube-rbac-proxy image: registry.redhat.io/openshift4/ose-kube-rbac-proxy:v4.12 1 args: - "--secure-listen-address=0.0.0.0:8443" - "--upstream=http://127.0.0.1:8080/" - "--logtostderr=true" - "--v=0" ...
- 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
# PLATFORMS defines the target platforms for the manager image be build to provide support to multiple # architectures. (i.e. make docker-buildx IMG=myregistry/mypoperator:0.0.1). To use this option you need to: # - able to use docker buildx . More info: https://docs.docker.com/build/buildx/ # - have enable BuildKit, More info: https://docs.docker.com/develop/develop-images/build_enhancements/ # - be able to push the image for your registry (i.e. if you do not inform a valid value via IMG=<myregistry/image:<tag>> than the export will fail) # To properly provided solutions that supports more than one platform you should use this option. PLATFORMS ?= linux/arm64,linux/amd64,linux/s390x,linux/ppc64le .PHONY: docker-buildx docker-buildx: test ## Build and push docker image for the manager for cross-platform support # copy existing Dockerfile and insert --platform=${BUILDPLATFORM} into Dockerfile.cross, and preserve the original Dockerfile sed -e '1 s/\(^FROM\)/FROM --platform=\$$\{BUILDPLATFORM\}/; t' -e ' 1,// s//FROM --platform=\$$\{BUILDPLATFORM\}/' Dockerfile > Dockerfile.cross - docker buildx create --name project-v3-builder docker buildx use project-v3-builder - docker buildx build --push --platform=$(PLATFORMS) --tag ${IMG} -f Dockerfile.cross - docker buildx rm project-v3-builder rm Dockerfile.cross
Pour appliquer les changements à votre
Makefile
et reconstruire votre Opérateur, entrez la commande suivante :$ make
Pour mettre à jour Go et ses dépendances, apportez les modifications suivantes à votre fichier
go.mod
:go 1.19 1 require ( github.com/onsi/ginkgo/v2 v2.1.4 2 github.com/onsi/gomega v1.19.0 3 k8s.io/api v0.25.0 4 k8s.io/apimachinery v0.25.0 5 k8s.io/client-go v0.25.0 6 sigs.k8s.io/controller-runtime v0.13.0 7 )
- 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