Operator Lifecycle Manager

Photo by Pixabay from Pexels

TL;DR: Cet article montre comment utiliser Operator Lifecycle Manager et OperatorHub.io pour gérer des opérateurs, un peu comme on installe des applications depuis une place de marché d'applications.

Operator Lifecycle Manager est disponible sur Github operator-framework/operator-lifecycle-manager. Les sections ci-dessous présentent son fonctionnement et comment interagir avec OperatorHub.io. Pour aller plus loin, les documents de design sont essentiels.

La Philosophie

OLM est un opérateur qui gère vos opérateurs. Installé dans un cluster Kubernetes, il découvre les opérateurs disponibles, rend leur installation très simple et gère les mises à jour. Pour interagir avec OLM, il suffit d'utiliser kubectl comme pour n'importe quel opérateur.

OLM est un framework. Il suppose qu'un certain nombre de règles sont respectées par les opérateurs:

  • Il suppose que les ressources gérées par les opérateurs sont coordonnées au seing d'un même namespace
  • Il nécessite que les CRD dont dépendent un opérateur soient déclarées dans le package, même si celles-ci dépendent d'un autre opérateur
  • Il suppose que les CRD et ressources sont configurées dans le cluster et pas à l'extérieur
  • Lorsqu'un opérateur dépend d'un autre opérateur, il ne doit pas être inclus mais c'est à OLM de gérer la dépendance. Par exemple si un opérateur MySQL dépend d'un opérateur Prometheus, ça sera à OLM de gérer les 2 opérateurs séparément et pas à l'opérateur MySQL de gérer Prometheus.
  • L'installation d'un opérateur doit être répétable et doit gérer les erreurs d'installation
  • Les opérateurs doivent nettoyer les ressources qu'ils gèrent eux-mêmes et dans la mesure du possible s'appuyer sur les dépendances inter-services de Kubernetes
  • Les opérateurs doivent poser des labels sur les services et s'appuyer sur les selecteurs de label

Pour être géré par OLM, un opérateur doit implémenter les ressources suivantes

  • Une ressource de type ClusterServiceVersion qui inclut un nom global pour un opérateur ainsi que les versions, les CRD implémentées, les CRD dont il dépend, les dépendances du cluster et le mode d'installation
  • Un InstallPlan qui définit la structure de paramétrage de l'opérateur, y compris si celui-ci est installé au niveau d'un namespace ou global. OLM inclut les InstallPlan des opérateurs dépendants. Ceux-ci peuvent être approvés automatiquement ou manuellement
  • Une CatalogSource qui lie une ClusterServiceVersion à une URL externe ou interne et cache les ressources associées
  • Une Subscription qui définit comment les ClusterServiceVersion sont mises à jour. Il lie la ClusterServiceVersion à un channel du CatalogSource et définit une stratégie de mise à jour.

OLM est lui-même constitué de 2 opérateurs:

  • L'opérateur OLM qui gère les ClusterServiceVersion généralement par namespace, gère les installation, les mises à jour et les suppressions,
  • L'opérateur de Service Catalog qui cache les CRD et ClusterServiceVersion disponibles ainsi que leur dépendances. Il résoud les InstallPlan et ses InstallPlans dépendants. Il supervise les CatalogSources et les Subscriptions.

Le fichier architecture.md décrit plus en détail OLM

Installation OLM

Il existe plusieurs façons pour installer OLM dans un cluster Kubernetes. La procédure générale en mode manuel ou automatique fait partie de la release page. On préfèrera la procédure manuelle. Cela étant pour réaliser une première évaluation de la version 0.13.0 sur un cluster, moyennant que le client Kubernetes soit configuré et que vous soyez administrateur, il est possible de lancer la commande ci-dessous:

export OLM_REPO=https://github.com/operator-framework/operator-lifecycle-manager
curl -L ${OLM_REPO}/releases/download/0.13.0/install.sh -o install.sh
chmod +x install.sh
./install.sh 0.13.0

Pour valider l'installation, il faut vérifier que les namespaces olm et operators ont été créés et que les CRD associées ont été enregistrées:

kubectl get namespaces olm operators

NAME        STATUS   AGE
olm         Active   64s
operators   Active   64s

kubectl api-resources --api-group=operators.coreos.com

NAME                     SHORTNAMES   APIGROUP               NAMESPACED   KIND
catalogsources           catsrc       operators.coreos.com   true         CatalogSource
clusterserviceversions   csv,csvs     operators.coreos.com   true         ClusterServiceVersion
installplans             ip           operators.coreos.com   true         InstallPlan
operatorgroups           og           operators.coreos.com   true         OperatorGroup
subscriptions            sub,subs     operators.coreos.com   true         Subscription

kubectl get catalogsources -n olm

NAME                    DISPLAY               TYPE   PUBLISHER        AGE
operatorhubio-catalog   Community Operators   grpc   OperatorHub.io   2m46s

kubectl get csv -n olm

NAME            DISPLAY          VERSION   REPLACES   PHASE
packageserver   Package Server   0.13.0               Succeeded

Pour plus d'information sur l'installation d'OLM, lire install.md

Installer un opérateur à l'aide d'OLM

La page etcd sur operatorhub.io permet d'installer etcd sur un cluster Kubernetes géré par OLM. Pour cela, cliquer sur le bouton Install. Pour cela, il suffit de modifier et d'appliquer le fichier etcd.yaml. Pour télécharger le fichier, on peut procéder comme suit:

curl -LO https://operatorhub.io/install/etcd.yaml

Les ressources subscription et operatorgroup peuvent être modifiées pour être installées sur le cluster dans le namespace par défaut. Le fichier modifié ressemble à ce qui suit:

apiVersion: operators.coreos.com/v1alpha2
kind: OperatorGroup
metadata:
  name: operatorgroup
  namespace: default
spec:
  targetNamespaces:
  - default
---
apiVersion: operators.coreos.com/v1alpha1
kind: Subscription
metadata:
  name: my-etcd
  namespace: default
spec:
  channel: singlenamespace-alpha
  name: etcd
  source: operatorhubio-catalog
  sourceNamespace: olm

Pour installer la Subscription, il suffit de lancer:

kubectl apply -f etcd.yaml

operatorgroup.operators.coreos.com/operatorgroup unchanged
subscription.operators.coreos.com/my-etcd unchanged

L'opérateur est démarré dans le namespace default comme ci-dessous:

kubectl get csv

NAME                  DISPLAY   VERSION   REPLACES              PHASE
etcdoperator.v0.9.4   etcd      0.9.4     etcdoperator.v0.9.2   Succeeded

kubectl get deploy

NAME            READY   UP-TO-DATE   AVAILABLE   AGE
etcd-operator   1/1     1            1           3m6s

Pour créer un cluster, il suffit alors de créer une resource de type EtcdCluster à l'aide d'un fichier manifest comme celui qui suit. Les champs version et size permettent de configurer celui-ci:

cat <<EOF | kubectl apply -f -
apiVersion: etcd.database.coreos.com/v1beta2
kind: EtcdCluster
metadata:
  name: myetcd
spec:
  size: 1
  version: 3.3.18
EOF

etcdcluster.etcd.database.coreos.com/myetc created

Tester le cluster etcd

Pour tester le cluster etcd depuis un client, il suffit de lancer un pod, et d'installer le client etcdctl comme ci-dessous :

kubectl run -it debian --image=debian:stable \
  --restart=Never --rm=true -- bash

apt update && apt install -y curl

export ETCD_VERSION=3.3.18
export ETCD_DOWNLOAD=https://github.com/etcd-io/etcd/releases/download

curl -L ${ETCD_DOWNLOAD}/v${ETCD_VERSION}/etcd-v${ETCD_VERSION}-linux-amd64.tar.gz | \
  tar zxv -C . --transform "s/etcd-v${ETCD_VERSION}-linux-amd64\///" \
     etcd-v${ETCD_VERSION}-linux-amd64/etcdctl

./etcdctl --endpoints http://myetcd-client.default.svc:2379 ls /
exit 

Désinstaller le cluster et l'opérateur

Pour supprimer etcd et l'opérateur, on supprime les ressources EtcdCluster, ClusterServiceVersion, Subscription et OperatorGroup comme ci-dessous:

kubectl delete etcd/myetcd

etcdcluster.etcd.database.coreos.com "myetcd" deleted

kubectl delete csv/etcdoperator.v0.9.4

clusterserviceversion.operators.coreos.com "etcdoperator.v0.9.4" deleted

kubectl delete sub/my-etcd

subscription.operators.coreos.com "my-etcd" deleted

kubectl delete og/operatorgroup

operatorgroup.operators.coreos.com "operatorgroup" deleted

Installer et utiliser Operator Lifecycle Manager est relativement simple et permet de configurer une liste importante d'opérateurs en quelques minutes. Le prochain article reprend l'opérateurs développé avec operator-sdk et illustre comment le gérer avec OLM depuis la registry quay.io.

Published under  on .

Easyteam DevOps

Easyteam DevOps