Rechercher

5.5. Opérateurs à la barre

download PDF

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

  1. Create a project.

    1. Créez votre répertoire de projet :

      $ mkdir nginx-operator
    2. Allez dans le répertoire du projet :

      $ cd nginx-operator
    3. Exécutez la commande operator-sdk init avec le plugin helm pour initialiser le projet :

      $ operator-sdk init \
          --plugins=helm
  2. 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.

  3. Build and push the Operator image.

    Utilisez les cibles par défaut de Makefile pour construire et pousser votre opérateur. Définissez IMG 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>
  4. Run the Operator.

    1. Installer le CRD :

      $ make install
    2. 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>
  5. 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
  6. Create a sample custom resource (CR).

    1. Créer un échantillon de CR :

      $ oc apply -f config/samples/demo_v1_nginx.yaml \
          -n nginx-operator-system
    2. 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
  7. 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
  8. 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

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 pods nginx

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 API controller-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
Note

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

  1. Créer un répertoire pour le projet :

    $ mkdir -p $HOME/projects/nginx-operator
  2. Accédez au répertoire :

    $ cd $HOME/projects/nginx-operator
  3. Exécutez la commande operator-sdk init avec le plugin helm pour initialiser le projet :

    $ operator-sdk init \
        --plugins=helm \
        --domain=example.com \
        --group=demo \
        --version=v1 \
        --kind=Nginx
    Note

    Par 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 projet nginx-operator spécifiquement pour observer une ressource avec la version de l'API example.com/v1 et le type Nginx.

  4. Pour les projets basés sur Helm, la commande init génère les règles RBAC dans le fichier config/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 :

DrapeauValeur

--domain

my.domain

--group

charts

--version

v1

--kind

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 :

FormatDescription

<repo_name>/<chart_name>

Récupérer la carte Helm nommée <chart_name> à partir du référentiel de cartes Helm nommé <repo_name>, comme spécifié dans le fichier $HELM_HOME/repositories/repositories.yaml. Utilisez la commande helm repo add pour configurer ce fichier.

<url>

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 :

FormatDescription

<chart_name>

Récupère le graphique Helm nommé <chart_name> dans le référentiel graphique Helm spécifié par la valeur URL --helm-chart-repo.

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

  1. Le fichier helm-charts/nginx/values.yaml contient une valeur appelée replicaCount définie par défaut sur 1. Pour avoir deux instances Nginx dans votre déploiement, votre spécification CR doit contenir replicaCount: 2.

    Modifiez le fichier config/samples/demo_v1_nginx.yaml pour définir replicaCount: 2:

    apiVersion: demo.example.com/v1
    kind: Nginx
    metadata:
      name: nginx-sample
    ...
    spec:
    ...
      replicaCount: 2
  2. De même, le port de service par défaut est défini sur 80. Pour utiliser 8080, modifiez le fichier config/samples/demo_v1_nginx.yaml pour définir spec.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
Note

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 champ overrideValues:

    ...
    - group: demo.example.com
      version: v1alpha1
      kind: Nginx
      chart: helm-charts/nginx
      overrideValues:
        proxy.http: $HTTP_PROXY
    ...
    1. Ajouter la valeur proxy.http dans le fichier helmcharts/nginx/values.yaml:

      ...
      proxy:
        http: ""
        https: ""
        no_proxy: ""
    2. 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 }}"
    3. 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

  1. Exécutez les commandes make suivantes pour construire et pousser l'image de l'opérateur. Modifiez l'argument IMG 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.

    1. Construire l'image :

      $ make docker-build IMG=<registry>/<user>/<image_name>:<tag>
      Note

      Le fichier Docker généré par le SDK pour l'Operator fait explicitement référence à GOARCH=amd64 pour go build. Cette référence peut être modifiée en GOARCH=$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.

    2. Transférer l'image dans un référentiel :

      $ make docker-push IMG=<registry>/<user>/<image_name>:<tag>
      Note

      Le 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 de IMG ?= controller:latest pour définir votre nom d'image par défaut.

  2. 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 de config/rbac.

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

  1. Exécutez les commandes make suivantes dans le répertoire de votre projet Operator pour construire et pousser votre image Operator. Modifiez l'argument IMG 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.

    1. Construire l'image :

      $ make docker-build IMG=<registry>/<user>/<operator_image_name>:<tag>
      Note

      Le fichier Docker généré par le SDK pour l'Operator fait explicitement référence à GOARCH=amd64 pour go build. Cette référence peut être modifiée en GOARCH=$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.

    2. Transférer l'image dans un référentiel :

      $ make docker-push IMG=<registry>/<user>/<operator_image_name>:<tag>
  2. Créez votre manifeste Operator bundle en exécutant la commande make bundle, qui invoque plusieurs commandes, dont les sous-commandes Operator SDK generate bundle et bundle 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 objet ClusterServiceVersion
    • 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.

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

    1. 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>
    2. 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 de cluster-admin

Procédure

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

    Depuis 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

  1. 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
  2. Modifiez l'exemple de manifeste Nginx CR à l'adresse config/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
  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
  4. Créer le CR :

    $ oc apply -f config/samples/demo_v1_nginx.yaml
  5. 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

  6. Vérifiez le statut des pods et du CR pour confirmer que le statut est mis à jour avec les noms des pods Nginx.

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

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

  7. Mettre à jour la taille du déploiement.

    1. Mettre à jour le fichier config/samples/demo_v1_nginx.yaml pour modifier le champ spec.size dans le CR Nginx de 3 à 5:

      $ oc patch nginx nginx-sample \
          -p '{"spec":{"replicaCount": 5}}' \
          --type=merge
    2. 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

  8. Supprimez le CR en exécutant la commande suivante :

    $ oc delete -f config/samples/demo_v1_nginx.yaml
  9. 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

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/dossiersObjectif

config

Personnaliser les manifestes pour déployer l'opérateur sur un cluster Kubernetes.

helm-charts/

La carte du gouvernail est initialisée par la commande operator-sdk create api.

Dockerfile

Utilisé pour construire l'image de l'opérateur avec la commande make docker-build.

watches.yaml

Groupe/version/genre (GVK) et emplacement de la carte du gouvernail.

Makefile

Objectifs utilisés pour gérer le projet.

PROJECT

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

  1. 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.
  2. Apportez les modifications suivantes à votre site Makefile:

    1. Pour activer la prise en charge des architectures multiples, ajoutez la cible docker-buildx à votre projet Makefile:

      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

    2. Pour permettre la prise en charge des architectures arm64 dans votre projet Operator, apportez les modifications suivantes à votre projet Makefile:

      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/')

    3. 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 vers v4.5.5.
      Important

      La version de Kustomize 4.0.0 a supprimé le plugin go-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.

    4. Pour appliquer les changements à votre Makefile et reconstruire votre Opérateur, entrez la commande suivante :

      $ make
  3. 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

    1
    Remplacer le champ commonLabels par le champ labels.
    2
    Ajouter includeSelectors: true.
    3
    Remplacer le champ bases par le champ resources.

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

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

  1. Créer un répertoire pour le projet :

    $ mkdir -p $HOME/github.com/example/memcached-operator
  2. Accédez au répertoire :

    $ cd $HOME/github.com/example/memcached-operator
  3. Exécutez la commande operator-sdk init pour initialiser le projet. Utilisez un domaine de example.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 fichier config/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 fichier config/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 version v1 et le type Memcached:

    $ operator-sdk create api \
        --plugins helm.sdk.operatorframework.io/v1 \
        --group cache \
        --version v1 \
        --kind Memcached
Note

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

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, et Uninstall 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 et Post

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

  1. Exécutez la commande suivante pour créer une API Go avec le groupe cache, la version v1 et le type MemcachedBackup:

    $ operator-sdk create api \
        --group=cache \
        --version v1 \
        --kind MemcachedBackup \
        --resource \
        --controller \
        --plugins=go/v3
  2. 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.

Note

Le champ Node est utilisé pour illustrer un exemple de champ Status.

Procédure

  1. Définir l'API pour le CR MemcachedBackup en modifiant les définitions de type Go dans le fichier api/v1/memcachedbackup_types.go pour obtenir les types spec et status:

    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"`
    }
  2. Mettre à jour le code généré pour le type de ressource :

    $ make generate
    Astuce

    Après avoir modifié un fichier *_types.go, vous devez exécuter la commande make generate pour mettre à jour le code généré pour ce type de ressource.

  3. Une fois l'API définie avec les champs spec et status 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 pods memcached.

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.

Note

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

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

  1. Exécutez les commandes make suivantes pour construire et pousser l'image de l'opérateur. Modifiez l'argument IMG 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.

    1. Construire l'image :

      $ make docker-build IMG=<registry>/<user>/<image_name>:<tag>
      Note

      Le fichier Docker généré par le SDK pour l'Operator fait explicitement référence à GOARCH=amd64 pour go build. Cette référence peut être modifiée en GOARCH=$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.

    2. Transférer l'image dans un référentiel :

      $ make docker-push IMG=<registry>/<user>/<image_name>:<tag>
      Note

      Le 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 de IMG ?= controller:latest pour définir votre nom d'image par défaut.

  2. 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 de config/rbac.

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

  1. Passez à l'espace de noms dans lequel votre opérateur est installé :

    $ oc project <nom_du_projet>-système
  2. Mettez à jour l'exemple de manifeste Memcached CR dans le fichier config/samples/cache_v1_memcached.yaml en remplaçant le champ replicaCount par 3:

    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: []
  3. Créer le CR Memcached:

    $ oc apply -f config/samples/cache_v1_memcached.yaml
  4. 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

  5. Mettez à jour l'exemple de manifeste MemcachedBackup CR dans le fichier config/samples/cache_v1_memcachedbackup.yaml en mettant à jour le fichier size en 2:

    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
  6. Créer le CR MemcachedBackup:

    $ oc apply -f config/samples/cache_v1_memcachedbackup.yaml
  7. 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

  8. 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 site spec des CR respectifs.
  9. Nettoyer les ressources qui ont été créées dans le cadre de ce tutoriel :

    1. Supprimer la ressource Memcached:

      $ oc delete -f config/samples/cache_v1_memcached.yaml
    2. Supprimer la ressource MemcachedBackup:

      $ oc delete -f config/samples/cache_v1_memcachedbackup.yaml
    3. 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/dossiersObjectif

Dockerfile

Instructions utilisées par un moteur de conteneur pour construire votre image d'opérateur avec la commande make docker-build.

Makefile

Fichier de construction avec des cibles d'aide pour vous aider à travailler avec votre projet.

PROJECT

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.

bin/

Contient des binaires utiles tels que manager qui est utilisé pour exécuter votre projet localement et l'utilitaire kustomize utilisé pour la configuration du projet.

config/

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.

config/crd/
Contient des définitions de ressources personnalisées (CRD).
config/default/
Contient une base Kustomize pour lancer le contrôleur dans une configuration standard.
config/manager/
Contient les manifestes pour lancer votre projet Operator en tant que pods sur le cluster.
config/manifests/
Contient la base pour générer vos manifestes OLM dans le répertoire bundle/.
config/prometheus/
Contient les manifestes nécessaires pour permettre au projet de servir des métriques à Prometheus, comme la ressource ServiceMonitor.
config/scorecard/
Contient les manifestes nécessaires pour vous permettre de tester votre projet avec l'outil scorecard.
config/rbac/
Contient les autorisations RBAC nécessaires à l'exécution de votre projet.
config/samples/
Contient des exemples de ressources personnalisées.

api/

Contient la définition de l'API Go.

controllers/

Contient les contrôleurs de l'API Go.

hack/

Contient des fichiers utilitaires, tels que le fichier utilisé pour structurer l'en-tête de licence pour les fichiers de votre projet.

main.go

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 apis/ et démarre tous les contrôleurs dans le répertoire controllers/.

helm-charts/

Contient les graphiques Helm qui peuvent être spécifiés en utilisant la commande create api avec le plugin Helm.

watches.yaml

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

  1. 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.
  2. Apportez les modifications suivantes à votre site Makefile:

    1. Pour activer la prise en charge des architectures multiples, ajoutez la cible docker-buildx à votre projet Makefile:

      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

    2. Pour appliquer les changements à votre Makefile et reconstruire votre Opérateur, entrez la commande suivante :

      $ make
  3. 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 vers 1.19.
    2
    Mise à jour de la version v1.16.5 vers v2.1.4.
    3
    Mise à jour de la version v1.18.1 vers v1.19.0.
    4
    Mise à jour de la version v0.24.0 vers v0.25.0.
    5
    Mise à jour de la version v0.24.0 vers v0.25.0.
    6
    Mise à jour de la version v0.24.0 vers v0.25.0.
    7
    Mise à jour de la version v0.12.1 vers v0.13.0.
  4. 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

5.5.7.2. Ressources supplémentaires

Red Hat logoGithubRedditYoutubeTwitter

Apprendre

Essayez, achetez et vendez

Communautés

À propos de la documentation Red Hat

Nous aidons les utilisateurs de Red Hat à innover et à atteindre leurs objectifs grâce à nos produits et services avec un contenu auquel ils peuvent faire confiance.

Rendre l’open source plus inclusif

Red Hat s'engage à remplacer le langage problématique dans notre code, notre documentation et nos propriétés Web. Pour plus de détails, consultez leBlog Red Hat.

À propos de Red Hat

Nous proposons des solutions renforcées qui facilitent le travail des entreprises sur plusieurs plates-formes et environnements, du centre de données central à la périphérie du réseau.

© 2024 Red Hat, Inc.