Déployer un opérateur Kubernetes avec OLM

Photo by Pixabay from Pexels

TL;DR: Cet article présente le déploiement de l'opérateur créé précédemment à l'aide de Operator Lifecycle Manager ou OLM

Avant de commencer, ces 2 articles sont essentiels:

Ce nouvel article présente comment utiliser operator Marketplace pour se connecter à quay.io et déployer l'opérateur spécifique créé précédemment. Il met en avant certains problèmes ainsi que les solutions associées.

Pour une description détaillée et comprendre comment réaliser ce déploiement, les documents suivants sont de très bonnes sources d'informations:

Configurer OLM et Marketplace

Pour configurer le cluster Kubernetes, il faut installer OLM comme décrit sur la page Release de operator-lifecycle-manager

Il faut ensuite installer operator-framework/operator-marketplace. Pour cela, il convient de cloner le projet

git clone https://github.com/operator-framework/operator-marketplace.git

Puis en supposant que l'environnement est correctement configuré, que kubectl est disponible, et que la connexion a le role administrateur du clustern il convient d'installer marketplace.

cd operator-marketplace
kubectl apply -f deploy/upstream

Note: Marketplace ne s'installe pas sur une version de Kubernetes plus ancienne que la version 1.15. Cela est du au fait que les CRD associées s'appuient sur des fonctionnalités de cette version.

Les installations créent 3 workspaces et des ressources associées:

kubectl get namespace olm marketplace operators

Enregistrer quay.io dans marketplace

Avant d'aller plus loin, il faut de vérifier un certain nombre de pré-requis:

  • L'image docker du controller bot-controller doit être publique. Pour modifier le paramétrage, connectez-vous sur quay.io et vérifiez dans l'onglet Settings que l'option Make public est activée
  • L'application qui correspont à l'opérateur bot-operator doit être publique. Pour modifier le paramétrage, connectez-vous sur quay.io et vérifier dans l'onglet Settings que l'option Make public est activée pour l'application
  • La CRD doit avoir un champ displayName dans spec.customresourcedefinitions.owned[]. Si ce n'est pas le cas, il faudra modifier la CRD et recréer l'application sur quay.io.
  • Les propriétés spec.keywords, spec.maintainers[].email, spec.maintainers[].name et spec.provider.name doivent être remplis dans la CRD associée à l'opérateur. Si ce n'est pas le cas, il faudra modifier la CRD et recréer l'application sur quay.io.
  • S'il s'agit de la première version de l'opérateur, le champ spec.replaces doit être supprimé. Si ce n'est pas le cas, il faudra modifier la CRD et recréer l'application sur quay.io.

Si ces conditions sont bien remplies, enregistrer la source de l'opérateur dans marketplace consiste à appliquer le manifeste comme celui ci-dessous:

cat <<EOF | kubectl apply -f -
apiVersion: operators.coreos.com/v1
kind: OperatorSource
metadata:
  name: easyteam
  namespace: marketplace
spec:
  type: appregistry
  endpoint: https://quay.io/cnr
  registryNamespace: easyteam
  displayName: "Bot Operator"
  publisher: "Easyteam"
EOF

operatorsource et catalogsource doivent être enregistrées dans le namespace marketplace et aucune erreur ne soit apparaître:

kubectl get operatorsource easyteam -n marketplace
kubectl get catalogsource easyteam -n marketplace

L'opérateur est alors visible depuis la nouvelle source des opérateurs:

kubectl get opsrc easyteam \
   -o=custom-columns=NAME:.metadata.name,PACKAGES:.status.packages -n marketplace

Note: pour fonctionner, le nom de OperatorSource doit être différent du nom du package. Elle ne doit donc pas s'appeler bot-operator...

Créer un OperatorGroup et une Subscription

Pour installer l'opérateur, il faut créer un OperatorGroup dans le namespace marketplace et créer une subscription dans ce même namespace. Les commandes ci-dessous configure une subscription :

cat <<EOF | kubectl apply -f -
apiVersion: operators.coreos.com/v1
kind: OperatorGroup
metadata:
  name: bot-group
  namespace: marketplace
spec:
  targetNamespaces:
  - marketplace
EOF

cat <<EOF | kubectl apply -f -
apiVersion: operators.coreos.com/v1alpha1
kind: Subscription
metadata:
  name: bot-subscription
  namespace: marketplace
spec:
  channel: alpha
  name: bot-operator
  source: easyteam
  sourceNamespace: marketplace
EOF

Pour valider le statut des ressources, y compris de l'installplan, il faut lancer :

kubectl get operatorgroup bot-group -n marketplace
kubectl get subscription bot-subscription -n marketplace
kubectl describe installplan \
  $(kubectl get installplan -n marketplace \
       -o custom-columns=NAME:metadata.name --no-headers) \
  -n marketplace 

Valider que l'opérateur est installé

Une fois la subscription créé, la ressource ClusterServiceVersion doit apparaître comme ci-dessous:

kubectl get csv -n marketplace

NAME                  DISPLAY        VERSION   REPLACES   PHASE
bot-operator.v0.0.1   Bot Operator   0.0.1                Succeeded

Il est également possible de lister les pods démarrés. Ceux-ci correspondent aux pods qui gèrent les différentes ressources ainsi que le pod de l'opérateur bot-operator lequel est géré par un deployment:

kubectl get pods -n marketplace

NAME                                           READY   STATUS    RESTARTS   AGE
bot-operator-77d98bb46-l9bl8                   1/1     Running   0          50s
easyteam-59f477bb66-kt9c8                      1/1     Running   0          89s
marketplace-operator-69756457d8-6gx77          1/1     Running   0          72m
upstream-community-operators-c9dcf648f-rgcl4   1/1     Running   0          72m

Déployer un nouveau bot

Pour déployer un bot, il faut instancer une ressource correspondant à la CRD de l'opérateur bot-operator :

cat <<EOF | kubectl apply -n marketplace -f -
apiVersion: natives.easyteam.fr/v1alpha1
kind: Bot
metadata:
  name: red-bot
spec:
  alias: red
EOF

La resource étant déployée, l'opérateur créé avec operateur-sdk démarre un pod qui lui correspond :

kubectl get pods red-bot-pod -n marketplace
NAME          READY   STATUS    RESTARTS   AGE
red-bot-pod   1/1     Running   0          17s

kubectl get bots -n marketplace
NAME      AGE
red-bot   23s

Supprimer le bot

Pour supprimer le bot, il suffit de supprimer la ressource. Le pod associé est alors terminé:

kubectl delete bot red-bot -n  marketplace

kubectl get pods red-bot-pod -n marketplace

NAME          READY   STATUS        RESTARTS   AGE
red-bot-pod   1/1     Terminating   4          4h41m

Supprimer la configuration

Pour supprimer l'opérateur, la souscription et la connexion à quay.io, il faut supprimer, les ressources ClusterServiceVersio, InstallPlan, Subscription, OperatorGroup, CatalogSource et OperatorSource comme ci-dessous:

kubectl delete csv bot-operator.v0.0.1 -n marketplace
kubectl delete installplan \
  $(kubectl get installplan -n marketplace \
       -o custom-columns=NAME:metadata.name --no-headers) \
  -n marketplace 
kubectl delete subscription bot-subscription -n marketplace
kubectl delete operatorgroup bot-group -n marketplace
kubectl delete catalogsource easyteam -n marketplace
kubectl delete operatorsource easyteam -n marketplace

Prêt à programmer et utiliser des opérateurs personnalisés ? Maintenant commence la partie intéressante, coder vos opérateurs...

Published under  on .

Easyteam DevOps

Easyteam DevOps