5.7. Définition des versions de service de cluster (CSV)
Un cluster service version (CSV), défini par un objet ClusterServiceVersion
, est un manifeste YAML créé à partir des métadonnées de l'opérateur qui aide Operator Lifecycle Manager (OLM) à exécuter l'opérateur dans un cluster. Il s'agit des métadonnées qui accompagnent l'image d'un conteneur Operator, utilisées pour remplir les interfaces utilisateur avec des informations telles que le logo, la description et la version. Il s'agit également d'une source d'informations techniques nécessaires au fonctionnement de l'opérateur, comme les règles RBAC dont il a besoin et les ressources personnalisées (CR) qu'il gère ou dont il dépend.
L'Operator SDK comprend le générateur CSV qui permet de générer un CSV pour le projet Operator en cours, personnalisé à l'aide des informations contenues dans les manifestes YAML et les fichiers source de l'Operator.
Une commande générant des CSV supprime la responsabilité des auteurs d'opérateurs ayant une connaissance approfondie d'OLM pour que leur opérateur interagisse avec OLM ou publie des métadonnées dans le registre du catalogue. En outre, comme la spécification CSV est susceptible d'évoluer au fil du temps avec la mise en œuvre de nouvelles fonctionnalités Kubernetes et OLM, le SDK de l'opérateur est équipé pour étendre facilement son système de mise à jour afin de gérer les nouvelles fonctionnalités CSV à l'avenir.
5.7.1. Comment fonctionne la génération de CSV
Les manifestes de l'offre groupée Operator, qui comprennent des versions de service de cluster (CSV), décrivent comment afficher, créer et gérer une application avec Operator Lifecycle Manager (OLM). Le générateur CSV du SDK Operator, appelé par la sous-commande generate bundle
, est la première étape vers la publication de votre Operator dans un catalogue et son déploiement avec OLM. La sous-commande nécessite certains manifestes d'entrée pour construire un manifeste CSV ; toutes les entrées sont lues lorsque la commande est invoquée, ainsi qu'une base CSV, pour générer ou régénérer un CSV de manière autonome.
En règle générale, la sous-commande generate kustomize manifests
est exécutée en premier pour générer les bases Kustomize en entrée qui sont consommées par la sous-commande generate bundle
. Cependant, l'Operator SDK fournit la commande make bundle
, qui automatise plusieurs tâches, y compris l'exécution des sous-commandes suivantes dans l'ordre :
-
generate kustomize manifests
-
generate bundle
-
bundle validate
Ressources supplémentaires
- Voir la section Regroupement d'un opérateur pour une procédure complète comprenant la génération d'un regroupement et d'un fichier CSV.
5.7.1.1. Fichiers et ressources générés
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
(CSV) -
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
Les ressources suivantes sont généralement incluses dans un CSV :
- Rôle
- Définit les autorisations de l'opérateur au sein d'un espace de noms.
- ClusterRole
- Définit les autorisations de l'opérateur à l'échelle du cluster.
- Déploiement
- Définit la manière dont l'opérande d'un opérateur est exécuté dans les modules.
- CustomResourceDefinition (CRD)
- Définit les ressources personnalisées que votre opérateur réconcilie.
- Exemples de ressources personnalisées
- Exemples de ressources respectant les spécifications d'un CRD particulier.
5.7.1.2. Gestion des versions
L'option --version
de la sous-commande generate bundle
fournit une version sémantique de votre bundle lors de sa création et de la mise à jour d'un bundle existant.
En définissant la variable VERSION
dans votre Makefile
, l'indicateur --version
est automatiquement invoqué en utilisant cette valeur lorsque la sous-commande generate bundle
est exécutée par la commande make bundle
. La version du CSV est la même que celle de l'opérateur, et un nouveau CSV est généré lors de la mise à niveau des versions de l'opérateur.
5.7.2. Champs CSV définis manuellement
De nombreux champs CSV ne peuvent pas être remplis à l'aide de manifestes génériques générés qui ne sont pas spécifiques à Operator SDK. Ces champs sont principalement des métadonnées écrites par l'homme sur l'opérateur et diverses définitions de ressources personnalisées (CRD).
Les auteurs d'opérateurs doivent modifier directement leur fichier YAML de version de service de cluster (CSV), en ajoutant des données personnalisées aux champs obligatoires suivants. Le SDK de l'opérateur émet un avertissement lors de la génération du fichier CSV lorsqu'il détecte un manque de données dans l'un des champs obligatoires.
Les tableaux suivants détaillent les champs CSV définis manuellement qui sont obligatoires et ceux qui sont facultatifs.
Field | Description |
---|---|
|
Un nom unique pour ce CSV. La version de l'opérateur doit être incluse dans le nom pour garantir l'unicité, par exemple |
|
Le niveau de capacité selon le modèle de maturité de l'opérateur. Les options comprennent |
| Un nom public pour identifier l'opérateur. |
| Brève description de la fonctionnalité de l'opérateur. |
| Mots clés décrivant l'opérateur. |
|
Entités humaines ou organisationnelles assurant la maintenance de l'opérateur, avec un |
|
Le fournisseur de l'opérateur (généralement une organisation), avec une adresse |
| Paires clé-valeur à utiliser par les éléments internes de l'opérateur. |
|
Version sémantique de l'opérateur, par exemple |
|
Tous les CRD que l'opérateur utilise. Ce champ est rempli automatiquement par le SDK de l'opérateur si des fichiers YAML de CRD sont présents sur
|
Field | Description |
---|---|
| Le nom du CSV remplacé par ce CSV. |
|
URL (par exemple, sites web et documentation) relatifs à l'opérateur ou à l'application gérée, chacun avec |
| Sélecteurs permettant à l'opérateur d'associer des ressources dans un cluster. |
|
Une icône codée en base64 unique à l'opérateur, placée dans un champ |
|
Le niveau de maturité atteint par le logiciel dans cette version. Les options comprennent |
Pour plus de détails sur les données que chaque champ ci-dessus doit contenir, voir la spécification CSV.
Plusieurs champs YAML nécessitant actuellement une intervention de l'utilisateur peuvent potentiellement être analysés à partir du code de l'opérateur.
Ressources supplémentaires
5.7.2.1. Annotations des métadonnées de l'opérateur
Les développeurs d'opérateurs peuvent définir manuellement certaines annotations dans les métadonnées d'une version de service de cluster (CSV) pour activer des fonctionnalités ou mettre en évidence des capacités dans les interfaces utilisateur (UI), telles que OperatorHub.
Le tableau suivant énumère les annotations de métadonnées de l'opérateur qui peuvent être définies manuellement à l'aide des champs metadata.annotations
.
Field | Description |
---|---|
| Fournir des modèles de définition de ressources personnalisées (CRD) avec un ensemble minimal de configurations. Les interfaces utilisateur compatibles pré-remplissent ce modèle pour que les utilisateurs puissent le personnaliser davantage. |
|
Spécifiez une seule ressource personnalisée requise en ajoutant l'annotation |
| Définir un espace de noms suggéré où l'opérateur doit être déployé. |
| Caractéristiques de l'infrastructure prises en charge par l'opérateur. Les utilisateurs peuvent visualiser et filtrer ces caractéristiques lorsqu'ils découvrent des opérateurs via OperatorHub dans la console web. Valeurs valides, sensibles à la casse :
Important
The use of FIPS Validated / Modules in Process cryptographic libraries is only supported on OpenShift Container Platform deployments on the
|
|
Tableau libre permettant d'énumérer les abonnements spécifiques nécessaires à l'utilisation de l'opérateur. Par exemple, |
| Masque les CRD dans l'interface utilisateur qui ne sont pas destinés à être manipulés par l'utilisateur. |
Exemples de cas d'utilisation
L'opérateur prend en charge les services déconnectés et les services proxy
operators.openshift.io/infrastructure-features: '["disconnected", "proxy-aware"]'
L'opérateur a besoin d'une licence OpenShift Container Platform
operators.openshift.io/valid-subscription: '["OpenShift Container Platform"]'
L'opérateur a besoin d'une licence 3scale
operators.openshift.io/valid-subscription: '["3Scale Commercial License", "Red Hat Managed Integration"]'
L'opérateur prend en charge le mode déconnecté et le mode proxy, et nécessite une licence OpenShift Container Platform
operators.openshift.io/infrastructure-features: '["disconnected", "proxy-aware"]' operators.openshift.io/valid-subscription: '["OpenShift Container Platform"]'
Ressources supplémentaires
5.7.3. Permettre à votre opérateur de s'adapter à des environnements réseau restreints
En tant qu'auteur d'un opérateur, votre opérateur doit répondre à des exigences supplémentaires pour fonctionner correctement dans un réseau restreint, ou dans un environnement déconnecté.
Exigences de l'opérateur pour la prise en charge du mode déconnecté
- Remplacer les références d'images codées en dur par des variables d'environnement.
Dans la version du service de cluster (CSV) de votre Opérateur :
- Dressez la liste des related images ou des autres images de conteneurs dont votre opérateur pourrait avoir besoin pour remplir ses fonctions.
- Référencer toutes les images spécifiées par un condensé (SHA) et non par un tag.
- Toutes les dépendances de votre opérateur doivent également pouvoir fonctionner en mode déconnecté.
- Votre opérateur ne doit pas nécessiter de ressources hors cluster.
Conditions préalables
- Un projet d'opérateur avec un fichier CSV. La procédure suivante utilise l'opérateur Memcached comme exemple pour les projets basés sur Go, Ansible et Helm.
Procédure
Définir une variable d'environnement pour les références d'images supplémentaires utilisées par l'opérateur dans le fichier
config/manager/manager.yaml
:Exemple 5.10. Exemple de fichier
config/manager/manager.yaml
... spec: ... spec: ... containers: - command: - /manager ... env: - name: <related_image_environment_variable> 1 value: "<related_image_reference_with_tag>" 2
Remplacez les références d'images codées en dur par des variables d'environnement dans le fichier correspondant au type de projet de l'opérateur :
Pour les projets Operator basés sur Go, ajoutez la variable d'environnement au fichier
controllers/memcached_controller.go
comme indiqué dans l'exemple suivant :Exemple 5.11. Exemple de fichier
controllers/memcached_controller.go
// deploymentForMemcached returns a memcached Deployment object ... Spec: corev1.PodSpec{ Containers: []corev1.Container{{ - Image: "memcached:1.4.36-alpine", 1 + Image: os.Getenv("<related_image_environment_variable>"), 2 Name: "memcached", Command: []string{"memcached", "-m=64", "-o", "modern", "-v"}, Ports: []corev1.ContainerPort{{ ...
NoteLa fonction
os.Getenv
renvoie une chaîne vide si une variable n'est pas définie. Définissez la variable<related_image_environment_variable>
avant de modifier le fichier.Pour les projets Operator basés sur Ansible, ajoutez la variable d'environnement au fichier
roles/memcached/tasks/main.yml
comme indiqué dans l'exemple suivant :Exemple 5.12. Exemple de fichier
roles/memcached/tasks/main.yml
spec: containers: - name: memcached command: - memcached - -m=64 - -o - modern - -v - image: "docker.io/memcached:1.4.36-alpine" 1 + image: "{{ lookup('env', '<related_image_environment_variable>') }}" 2 ports: - containerPort: 11211 ...
Pour les projets d'opérateurs basés sur Helm, ajoutez le champ
overrideValues
au fichierwatches.yaml
comme indiqué dans l'exemple suivant :Exemple 5.13. Exemple de fichier
watches.yaml
... - group: demo.example.com version: v1alpha1 kind: Memcached chart: helm-charts/memcached overrideValues: 1 relatedImage: ${<related_image_environment_variable>} 2
Ajoutez la valeur du champ
overrideValues
au fichierhelm-charts/memchached/values.yaml
comme indiqué dans l'exemple suivant :Exemple de fichier
helm-charts/memchached/values.yaml
... relatedImage: ""
Modifiez le modèle de graphique dans le fichier
helm-charts/memcached/templates/deployment.yaml
comme indiqué dans l'exemple suivant :Exemple 5.14. Exemple de fichier
helm-charts/memcached/templates/deployment.yaml
containers: - name: {{ .Chart.Name }} securityContext: - toYaml {{ .Values.securityContext | nindent 12 }} image: "{{ .Values.image.pullPolicy }} env: 1 - name: related_image 2 value: "{{ .Values.relatedImage }}" 3
Ajoutez la définition de la variable
BUNDLE_GEN_FLAGS
à votreMakefile
en y apportant les modifications suivantes :Exemple
Makefile
BUNDLE_GEN_FLAGS ?= -q --overwrite --version $(VERSION) $(BUNDLE_METADATA_OPTS) # USE_IMAGE_DIGESTS defines if images are resolved via tags or digests # You can enable this value if you would like to use SHA Based Digests # To enable set flag to true USE_IMAGE_DIGESTS ?= false ifeq ($(USE_IMAGE_DIGESTS), true) BUNDLE_GEN_FLAGS += --use-image-digests endif ... - $(KUSTOMIZE) build config/manifests | operator-sdk generate bundle -q --overwrite --version $(VERSION) $(BUNDLE_METADATA_OPTS) 1 + $(KUSTOMIZE) build config/manifests | operator-sdk generate bundle $(BUNDLE_GEN_FLAGS) 2 ...
Pour mettre à jour l'image de votre opérateur en utilisant un condensé (SHA) et non une balise, exécutez la commande
make bundle
et remplacezUSE_IMAGE_DIGESTS
partrue
:$ make bundle USE_IMAGE_DIGESTS=true
Ajouter l'annotation
disconnected
, qui indique que l'opérateur travaille dans un environnement déconnecté :metadata: annotations: operators.openshift.io/infrastructure-features: '["disconnected"]'
Les opérateurs peuvent être filtrés dans OperatorHub grâce à cette fonctionnalité de l'infrastructure.
5.7.4. Permettre à votre opérateur de s'adapter à de multiples architectures et systèmes d'exploitation
Operator Lifecycle Manager (OLM) suppose que tous les opérateurs s'exécutent sur des hôtes Linux. Cependant, en tant qu'auteur d'un opérateur, vous pouvez spécifier si votre opérateur prend en charge la gestion des charges de travail sur d'autres architectures, si des nœuds de travail sont disponibles dans le cluster OpenShift Container Platform.
Si votre opérateur prend en charge des variantes autres que AMD64 et Linux, vous pouvez ajouter des étiquettes à la version du service de cluster (CSV) qui fournit à l'opérateur la liste des variantes prises en charge. Les étiquettes indiquant les architectures et les systèmes d'exploitation pris en charge sont définies comme suit :
labels: operatorframework.io/arch.<arch>: supported 1 operatorframework.io/os.<os>: supported 2
Seules les étiquettes de la tête de canal du canal par défaut sont prises en compte pour le filtrage des manifestes de paquetage par étiquette. Cela signifie, par exemple, qu'il est possible de fournir une architecture supplémentaire à un opérateur dans le canal autre que celui par défaut, mais que cette architecture n'est pas disponible pour le filtrage dans l'API PackageManifest
.
Si un CSV ne comporte pas d'étiquette os
, il est traité par défaut comme s'il comportait l'étiquette de support Linux suivante :
labels: operatorframework.io/os.linux: supported
Si un CSV ne comporte pas d'étiquette arch
, il est traité par défaut comme s'il comportait l'étiquette de prise en charge AMD64 suivante :
labels: operatorframework.io/arch.amd64: supported
Si un opérateur prend en charge plusieurs architectures de nœuds ou systèmes d'exploitation, vous pouvez également ajouter plusieurs étiquettes.
Conditions préalables
- Un projet d'opérateur avec un CSV.
- Pour pouvoir répertorier plusieurs architectures et systèmes d'exploitation, l'image de l'opérateur référencée dans le CSV doit être une image de la liste des manifestes.
- Pour que l'opérateur fonctionne correctement dans des environnements de réseaux restreints ou déconnectés, l'image référencée doit également être spécifiée à l'aide d'un condensé (SHA) et non d'une balise.
Procédure
Ajoutez une étiquette à l'adresse
metadata.labels
de votre CSV pour chaque architecture et système d'exploitation pris en charge par votre opérateur :labels: operatorframework.io/arch.s390x: supported operatorframework.io/os.zos: supported operatorframework.io/os.linux: supported 1 operatorframework.io/arch.amd64: supported 2
Ressources supplémentaires
- Voir la spécification Image Manifest V 2, Schema 2 pour plus d'informations sur les listes de manifestes.
5.7.4.1. Architecture et système d'exploitation pour les opérateurs
Les chaînes suivantes sont prises en charge dans Operator Lifecycle Manager (OLM) sur OpenShift Container Platform lors de l'étiquetage ou du filtrage des opérateurs qui prennent en charge plusieurs architectures et systèmes d'exploitation :
Architecture | String |
---|---|
AMD64 |
|
IBM Power |
|
IBM zSystems |
|
Système d'exploitation | String |
---|---|
Linux |
|
z/OS |
|
Différentes versions d'OpenShift Container Platform et d'autres distributions basées sur Kubernetes peuvent prendre en charge un ensemble différent d'architectures et de systèmes d'exploitation.
5.7.5. Définition d'un espace de noms suggéré
Certains opérateurs doivent être déployés dans un espace de noms spécifique, ou avec des ressources auxiliaires dans des espaces de noms spécifiques, pour fonctionner correctement. S'il est résolu à partir d'un abonnement, Operator Lifecycle Manager (OLM) définit par défaut les ressources de l'espace de noms d'un opérateur dans l'espace de noms de son abonnement.
En tant qu'auteur d'un Opérateur, vous pouvez exprimer un espace de noms cible souhaité dans le cadre de votre version de service de cluster (CSV) afin de garder le contrôle sur les espaces de noms finaux des ressources installées pour leurs Opérateurs. Lorsque vous ajoutez l'opérateur à un cluster en utilisant OperatorHub, cela permet à la console web de remplir automatiquement l'espace de noms suggéré pour l'administrateur du cluster pendant le processus d'installation.
Procédure
Dans votre CSV, définissez l'annotation
operatorframework.io/suggested-namespace
sur l'espace de noms suggéré :metadata: annotations: operatorframework.io/suggested-namespace: <namespace> 1
- 1
- Définissez l'espace de noms suggéré.
5.7.6. Activation des conditions de l'opérateur
Le gestionnaire du cycle de vie des opérateurs (OLM) fournit aux opérateurs un canal pour communiquer des états complexes qui influencent le comportement d'OLM lors de la gestion de l'opérateur. Par défaut, OLM crée une définition de ressource personnalisée (CRD) OperatorCondition
lorsqu'il installe un opérateur. En fonction des conditions définies dans la ressource personnalisée (CR) OperatorCondition
, le comportement d'OLM change en conséquence.
Pour prendre en charge les conditions de l'opérateur, celui-ci doit pouvoir lire le CR OperatorCondition
créé par OLM et être en mesure d'effectuer les tâches suivantes :
- Obtenir la condition spécifique.
- Définir l'état d'une condition spécifique.
Pour ce faire, il suffit d'utiliser la bibliothèque operator-lib
library. L'auteur d'un opérateur peut fournir un clientcontroller-runtime
dans son opérateur pour que la bibliothèque puisse accéder au CR OperatorCondition
appartenant à l'opérateur dans le cluster.
La bibliothèque fournit une interface générique Conditions
, qui possède les méthodes suivantes pour Get
et Set
une conditionType
dans la CR OperatorCondition
:
Get
-
Pour obtenir la condition spécifique, la bibliothèque utilise la fonction
client.Get
decontroller-runtime
, qui nécessite unObjectKey
de typetypes.NamespacedName
présent dansconditionAccessor
. Set
-
Pour mettre à jour le statut de la condition spécifique, la bibliothèque utilise la fonction
client.Update
decontroller-runtime
. Une erreur se produit si le siteconditionType
n'est pas présent dans le CRD.
L'opérateur n'est autorisé à modifier que la sous-ressource status
du CR. Les opérateurs peuvent soit supprimer, soit mettre à jour le tableau status.conditions
pour y inclure la condition. Pour plus de détails sur le format et la description des champs présents dans les conditions, voir les GoDocs des conditions en amont.
Operator SDK v1.10.1 supporte operator-lib
v0.3.0.
Conditions préalables
- Un projet Operator généré à l'aide du SDK Operator.
Procédure
Pour activer les conditions de l'opérateur dans votre projet d'opérateur :
Dans le fichier
go.mod
de votre projet Operator, ajoutezoperator-framework/operator-lib
comme bibliothèque requise :module github.com/example-inc/memcached-operator go 1.15 require ( k8s.io/apimachinery v0.19.2 k8s.io/client-go v0.19.2 sigs.k8s.io/controller-runtime v0.7.0 operator-framework/operator-lib v0.3.0 )
Écrivez votre propre constructeur dans votre logique d'opérateur qui aboutira aux résultats suivants :
-
Accepte un client
controller-runtime
. -
Accepte un
conditionType
. -
Renvoie une interface
Condition
pour mettre à jour ou ajouter des conditions.
Comme OLM prend actuellement en charge la condition
Upgradeable
, vous pouvez créer une interface comportant des méthodes permettant d'accéder à la conditionUpgradeable
. Par exemple, vous pouvez créer une interface avec des méthodes permettant d'accéder à la condition :import ( ... apiv1 "github.com/operator-framework/api/pkg/operators/v1" ) func NewUpgradeable(cl client.Client) (Condition, error) { return NewCondition(cl, "apiv1.OperatorUpgradeable") } cond, err := NewUpgradeable(cl);
Dans cet exemple, le constructeur
NewUpgradeable
est utilisé pour créer une variablecond
de typeCondition
. La variablecond
possède à son tour les méthodesGet
etSet
, qui peuvent être utilisées pour traiter la condition OLMUpgradeable
.-
Accepte un client
Ressources supplémentaires
5.7.7. Définition des webhooks
Les webhooks permettent aux auteurs de l'opérateur d'intercepter, de modifier et d'accepter ou de rejeter des ressources avant qu'elles ne soient enregistrées dans le magasin d'objets et traitées par le contrôleur de l'opérateur. Operator Lifecycle Manager (OLM) peut gérer le cycle de vie de ces webhooks lorsqu'ils sont livrés avec votre opérateur.
La ressource CSV (Cluster Service Version) d'un opérateur peut inclure une section webhookdefinitions
pour définir les types de webhooks suivants :
- Admission des webhooks (validation et mutation)
- Crochets web de conversion
Procédure
Ajoutez une section
webhookdefinitions
à la sectionspec
du CSV de votre opérateur et incluez toutes les définitions de webhooks utilisant untype
deValidatingAdmissionWebhook
,MutatingAdmissionWebhook
ouConversionWebhook
. L'exemple suivant contient les trois types de webhooks :CSV contenant des webhooks
apiVersion: operators.coreos.com/v1alpha1 kind: ClusterServiceVersion metadata: name: webhook-operator.v0.0.1 spec: customresourcedefinitions: owned: - kind: WebhookTest name: webhooktests.webhook.operators.coreos.io 1 version: v1 install: spec: deployments: - name: webhook-operator-webhook ... ... ... strategy: deployment installModes: - supported: false type: OwnNamespace - supported: false type: SingleNamespace - supported: false type: MultiNamespace - supported: true type: AllNamespaces webhookdefinitions: - type: ValidatingAdmissionWebhook 2 admissionReviewVersions: - v1beta1 - v1 containerPort: 443 targetPort: 4343 deploymentName: webhook-operator-webhook failurePolicy: Fail generateName: vwebhooktest.kb.io rules: - apiGroups: - webhook.operators.coreos.io apiVersions: - v1 operations: - CREATE - UPDATE resources: - webhooktests sideEffects: None webhookPath: /validate-webhook-operators-coreos-io-v1-webhooktest - type: MutatingAdmissionWebhook 3 admissionReviewVersions: - v1beta1 - v1 containerPort: 443 targetPort: 4343 deploymentName: webhook-operator-webhook failurePolicy: Fail generateName: mwebhooktest.kb.io rules: - apiGroups: - webhook.operators.coreos.io apiVersions: - v1 operations: - CREATE - UPDATE resources: - webhooktests sideEffects: None webhookPath: /mutate-webhook-operators-coreos-io-v1-webhooktest - type: ConversionWebhook 4 admissionReviewVersions: - v1beta1 - v1 containerPort: 443 targetPort: 4343 deploymentName: webhook-operator-webhook generateName: cwebhooktest.kb.io sideEffects: None webhookPath: /convert conversionCRDs: - webhooktests.webhook.operators.coreos.io 5 ...
Ressources supplémentaires
- Types de plugins d'admission aux webhooks
Documentation sur Kubernetes :
5.7.7.1. Considérations sur les webhooks pour OLM
Lorsque vous déployez un opérateur avec des webhooks à l'aide d'Operator Lifecycle Manager (OLM), vous devez définir les éléments suivants :
-
Le champ
type
doit être défini surValidatingAdmissionWebhook
,MutatingAdmissionWebhook
, ouConversionWebhook
, sinon le CSV sera placé dans une phase d'échec. -
Le fichier CSV doit contenir un déploiement dont le nom est équivalent à la valeur fournie dans le champ
deploymentName
du fichierwebhookdefinition
.
Lorsque le webhook est créé, OLM veille à ce qu'il n'agisse que sur les espaces de noms qui correspondent au groupe d'opérateurs dans lequel l'opérateur est déployé.
Contraintes de l'autorité de certification
OLM est configuré pour fournir à chaque déploiement une seule autorité de certification (CA). La logique qui génère et monte l'autorité de certification dans le déploiement était à l'origine utilisée par la logique du cycle de vie du service API. En conséquence :
-
Le fichier du certificat TLS est monté sur le déploiement à l'adresse
/apiserver.local.config/certificates/apiserver.crt
. -
Le fichier de clés TLS est monté sur le déploiement à l'adresse
/apiserver.local.config/certificates/apiserver.key
.
Contraintes liées aux règles d'admission des webhooks
Pour éviter qu'un opérateur ne configure le cluster dans un état irrécupérable, OLM place le CSV dans la phase d'échec si les règles définies dans un webhook d'admission interceptent l'une des demandes suivantes :
- Des demandes qui ciblent tous les groupes
-
Demandes ciblant le groupe
operators.coreos.com
-
Demandes ciblant les ressources
ValidatingWebhookConfigurations
ouMutatingWebhookConfigurations
Contraintes de conversion des webhooks
OLM place le CSV dans la phase d'échec si la définition d'un webhook de conversion ne respecte pas les contraintes suivantes :
-
Les CSV comportant un webhook de conversion ne peuvent prendre en charge que le mode d'installation
AllNamespaces
. -
Le champ
spec.preserveUnknownFields
du CRD ciblé par le webhook de conversion doit avoir la valeurfalse
ounil
. - Le webhook de conversion défini dans le CSV doit cibler un CRD appartenant à l'entreprise.
- Il ne peut y avoir qu'un seul webhook de conversion sur l'ensemble du cluster pour un CRD donné.
5.7.8. Comprendre les définitions de ressources personnalisées (CRD)
Il existe deux types de définitions de ressources personnalisées (CRD) que votre opérateur peut utiliser : celles qu'il utilise à l'adresse owned et celles dont il dépend à l'adresse required.
5.7.8.1. CRD détenus
Les définitions de ressources personnalisées (CRD) appartenant à votre opérateur constituent la partie la plus importante de votre CSV. Elles établissent le lien entre votre opérateur et les règles RBAC requises, la gestion des dépendances et d'autres concepts Kubernetes.
Il est courant que votre opérateur utilise plusieurs CRD pour relier des concepts, tels que la configuration de la base de données de premier niveau dans un objet et une représentation des ensembles de répliques dans un autre. Chacun d'entre eux doit être répertorié dans le fichier CSV.
Field | Description | Obligatoire/facultatif |
---|---|---|
| Le nom complet de votre CRD. | Exigée |
| La version de cet objet API. | Exigée |
| Le nom lisible par machine de votre CRD. | Exigée |
|
Une version lisible de votre nom de CRD, par exemple | Exigée |
| Une brève description de l'utilisation de ce CRD par l'opérateur ou une description de la fonctionnalité fournie par le CRD. | Exigée |
|
Le groupe API auquel appartient ce CRD, par exemple | En option |
|
Vos CRD possèdent un ou plusieurs types d'objets Kubernetes. Ceux-ci sont répertoriés dans la section Il est recommandé de ne répertorier que les objets qui sont importants pour un être humain, et non pas une liste exhaustive de tout ce que vous orchestrez. Par exemple, ne listez pas les cartes de configuration qui stockent un état interne qui n'est pas censé être modifié par un utilisateur. | En option |
| Ces descripteurs sont un moyen d'indiquer aux interfaces utilisateur certaines entrées ou sorties de votre opérateur qui sont les plus importantes pour l'utilisateur final. Si votre CRD contient le nom d'un secret ou d'une carte de configuration que l'utilisateur doit fournir, vous pouvez le spécifier ici. Ces éléments sont liés et mis en évidence dans les interfaces utilisateur compatibles. Il existe trois types de descripteurs :
Tous les descripteurs acceptent les champs suivants :
Voir également le projet openshift/console pour plus d'informations sur les descripteurs en général. | En option |
L'exemple suivant décrit un CRD MongoDB Standalone
qui nécessite une entrée utilisateur sous la forme d'un secret et d'une carte de configuration, et qui orchestre des services, des ensembles avec état, des pods et des cartes de configuration :
Exemple de CRD détenu
- displayName: MongoDB Standalone group: mongodb.com kind: MongoDbStandalone name: mongodbstandalones.mongodb.com resources: - kind: Service name: '' version: v1 - kind: StatefulSet name: '' version: v1beta2 - kind: Pod name: '' version: v1 - kind: ConfigMap name: '' version: v1 specDescriptors: - description: Credentials for Ops Manager or Cloud Manager. displayName: Credentials path: credentials x-descriptors: - 'urn:alm:descriptor:com.tectonic.ui:selector:core:v1:Secret' - description: Project this deployment belongs to. displayName: Project path: project x-descriptors: - 'urn:alm:descriptor:com.tectonic.ui:selector:core:v1:ConfigMap' - description: MongoDB version to be installed. displayName: Version path: version x-descriptors: - 'urn:alm:descriptor:com.tectonic.ui:label' statusDescriptors: - description: The status of each of the pods for the MongoDB cluster. displayName: Pod Status path: pods x-descriptors: - 'urn:alm:descriptor:com.tectonic.ui:podStatuses' version: v1 description: >- MongoDB Deployment consisting of only one host. No replication of data.
5.7.8.2. CRDs requis
Le recours à d'autres CRD obligatoires est totalement facultatif et n'existe que pour réduire la portée des opérateurs individuels et fournir un moyen de composer plusieurs opérateurs ensemble pour résoudre un cas d'utilisation de bout en bout.
Par exemple, un opérateur peut configurer une application et installer un cluster etcd (provenant d'un opérateur etcd) pour le verrouillage distribué et une base de données Postgres (provenant d'un opérateur Postgres) pour le stockage des données.
Operator Lifecycle Manager (OLM) vérifie que les CRD et les opérateurs disponibles dans le cluster répondent à ces exigences. Si des versions appropriées sont trouvées, les opérateurs sont démarrés dans l'espace de noms souhaité et un compte de service est créé pour chaque opérateur afin de créer, surveiller et modifier les ressources Kubernetes requises.
Field | Description | Obligatoire/facultatif |
---|---|---|
| Le nom complet du CRD dont vous avez besoin. | Exigée |
| La version de cet objet API. | Exigée |
| Le type d'objet Kubernetes. | Exigée |
| Une version du CRD lisible par l'homme. | Exigée |
| Un résumé de la manière dont le composant s'intègre dans votre architecture globale. | Exigée |
Exemple de CRD requis
required: - name: etcdclusters.etcd.database.coreos.com version: v1beta2 kind: EtcdCluster displayName: etcd Cluster description: Represents a cluster of etcd nodes.
5.7.8.3. Améliorations du CRD
OLM met à niveau une définition de ressource personnalisée (CRD) immédiatement si elle appartient à une seule version de service de cluster (CSV). Si une CRD appartient à plusieurs CSV, elle est mise à niveau lorsqu'elle remplit toutes les conditions de compatibilité ascendante suivantes :
- Toutes les versions de service existantes dans le CRD actuel sont présentes dans le nouveau CRD.
- Toutes les instances existantes, ou les ressources personnalisées, qui sont associées aux versions de service du document de référence sont valides lorsqu'elles sont validées par rapport au schéma de validation du nouveau document de référence.
5.7.8.3.1. Ajouter une nouvelle version du CRD
Procédure
Pour ajouter une nouvelle version d'un CRD à votre opérateur :
Ajoutez une nouvelle entrée dans la ressource CRD sous la section
versions
de votre CSV.Par exemple, si le CRD actuel a une version
v1alpha1
et que vous souhaitez ajouter une nouvelle versionv1beta1
et la marquer comme la nouvelle version de stockage, ajoutez une nouvelle entrée pourv1beta1
:versions: - name: v1alpha1 served: true storage: false - name: v1beta1 1 served: true storage: true
- 1
- Nouvelle entrée.
Veillez à ce que la version de référence du CRD dans la section
owned
de votre CSV soit mise à jour si le CSV a l'intention d'utiliser la nouvelle version :customresourcedefinitions: owned: - name: cluster.example.com version: v1beta1 1 kind: cluster displayName: Cluster
- 1
- Mettre à jour le site
version
.
- Transférez le CRD et le CSV mis à jour vers votre bundle.
5.7.8.3.2. Déclassement ou suppression d'une version du CRD
Operator Lifecycle Manager (OLM) ne permet pas de supprimer immédiatement une version en service d'une définition de ressource personnalisée (CRD). Au lieu de cela, une version obsolète du CRD doit d'abord être désactivée en définissant le champ served
du CRD sur false
. Ensuite, la version non servante peut être supprimée lors de la mise à niveau ultérieure du CRD.
Procédure
Déclasser et supprimer une version spécifique d'un CRD :
Marquez la version obsolète comme n'étant pas utile pour indiquer que cette version n'est plus utilisée et qu'elle peut être supprimée lors d'une mise à jour ultérieure. Par exemple :
versions: - name: v1alpha1 served: false 1 storage: true
- 1
- Régler sur
false
.
Passer de la version
storage
à une version de service si la version à supprimer est actuellement la versionstorage
. Par exemple :versions: - name: v1alpha1 served: false storage: false 1 - name: v1beta1 served: true storage: true 2
NotePour supprimer d'un CRD une version spécifique qui est ou était la version
storage
, cette version doit être supprimée destoredVersion
dans le statut du CRD. OLM tentera de le faire pour vous s'il détecte qu'une version stockée n'existe plus dans le nouveau CRD.- Mettre à jour le CRD avec les modifications ci-dessus.
Lors des cycles de mise à niveau ultérieurs, la version qui ne sert pas peut être complètement supprimée du document de référence. Par exemple :
versions: - name: v1beta1 served: true storage: true
-
Veillez à ce que la version du CRD de référence dans la section
owned
de votre CSV soit mise à jour en conséquence si cette version est retirée du CRD.
5.7.8.4. Modèles de CRD
Les utilisateurs de votre opérateur doivent savoir quelles options sont obligatoires ou facultatives. Vous pouvez fournir des modèles pour chacune de vos définitions de ressources personnalisées (CRD) avec un ensemble minimum de configurations sous la forme d'une annotation nommée alm-examples
. Les interfaces utilisateur compatibles rempliront ce modèle à l'avance pour que les utilisateurs puissent le personnaliser davantage.
L'annotation consiste en une liste du type, par exemple, le nom du CRD et les adresses metadata
et spec
correspondantes de l'objet Kubernetes.
L'exemple complet suivant fournit des modèles pour EtcdCluster
, EtcdBackup
et EtcdRestore
:
metadata: annotations: alm-examples: >- [{"apiVersion":"etcd.database.coreos.com/v1beta2","kind":"EtcdCluster","metadata":{"name":"example","namespace":"default"},"spec":{"size":3,"version":"3.2.13"}},{"apiVersion":"etcd.database.coreos.com/v1beta2","kind":"EtcdRestore","metadata":{"name":"example-etcd-cluster"},"spec":{"etcdCluster":{"name":"example-etcd-cluster"},"backupStorageType":"S3","s3":{"path":"<full-s3-path>","awsSecret":"<aws-secret>"}}},{"apiVersion":"etcd.database.coreos.com/v1beta2","kind":"EtcdBackup","metadata":{"name":"example-etcd-cluster-backup"},"spec":{"etcdEndpoints":["<etcd-cluster-endpoints>"],"storageType":"S3","s3":{"path":"<full-s3-path>","awsSecret":"<aws-secret>"}}}]
5.7.8.5. Masquage des objets internes
Il est courant que les opérateurs utilisent des définitions de ressources personnalisées (CRD) en interne pour accomplir une tâche. Ces objets ne sont pas destinés à être manipulés par les utilisateurs et peuvent prêter à confusion pour les utilisateurs de l'opérateur. Par exemple, un opérateur de base de données peut avoir un CRD Replication
qui est créé chaque fois qu'un utilisateur crée un objet Base de données avec replication: true
.
En tant qu'auteur d'un opérateur, vous pouvez masquer dans l'interface utilisateur les CRD qui ne sont pas destinés à être manipulés par l'utilisateur en ajoutant l'annotation operators.operatorframework.io/internal-objects
à la version du service de cluster (CSV) de votre opérateur.
Procédure
-
Avant de marquer l'un de vos CRD comme interne, assurez-vous que les informations de débogage ou la configuration éventuellement nécessaires pour gérer l'application sont reflétées dans le statut ou le bloc
spec
de votre CR, si cela s'applique à votre opérateur. Ajoutez l'annotation
operators.operatorframework.io/internal-objects
au CSV de votre opérateur pour spécifier les objets internes à cacher dans l'interface utilisateur :Annotation d'un objet interne
apiVersion: operators.coreos.com/v1alpha1 kind: ClusterServiceVersion metadata: name: my-operator-v1.2.3 annotations: operators.operatorframework.io/internal-objects: '["my.internal.crd1.io","my.internal.crd2.io"]' 1 ...
- 1
- Définir tout CRD interne comme un tableau de chaînes de caractères.
5.7.8.6. Initialisation des ressources personnalisées requises
Un opérateur peut exiger de l'utilisateur qu'il instancie une ressource personnalisée avant que l'opérateur ne soit pleinement fonctionnel. Cependant, il peut être difficile pour un utilisateur de déterminer ce qui est nécessaire ou comment définir la ressource.
En tant que développeur Operator, vous pouvez spécifier une seule ressource personnalisée requise en ajoutant operatorframework.io/initialization-resource
à la version du service de cluster (CSV) lors de l'installation d'Operator. Vous êtes alors invité à créer la ressource personnalisée à l'aide d'un modèle fourni dans la CSV. L'annotation doit inclure un modèle qui contient une définition YAML complète nécessaire pour initialiser la ressource lors de l'installation.
Si cette annotation est définie, après avoir installé l'opérateur à partir de la console web d'OpenShift Container Platform, l'utilisateur est invité à créer la ressource en utilisant le modèle fourni dans le CSV.
Procédure
Ajoutez l'annotation
operatorframework.io/initialization-resource
au CSV de votre opérateur pour spécifier une ressource personnalisée requise. Par exemple, l'annotation suivante exige la création d'une ressourceStorageCluster
et fournit une définition YAML complète :Annotation de la ressource d'initialisation
apiVersion: operators.coreos.com/v1alpha1 kind: ClusterServiceVersion metadata: name: my-operator-v1.2.3 annotations: operatorframework.io/initialization-resource: |- { "apiVersion": "ocs.openshift.io/v1", "kind": "StorageCluster", "metadata": { "name": "example-storagecluster" }, "spec": { "manageNodes": false, "monPVCTemplate": { "spec": { "accessModes": [ "ReadWriteOnce" ], "resources": { "requests": { "storage": "10Gi" } }, "storageClassName": "gp2" } }, "storageDeviceSets": [ { "count": 3, "dataPVCTemplate": { "spec": { "accessModes": [ "ReadWriteOnce" ], "resources": { "requests": { "storage": "1Ti" } }, "storageClassName": "gp2", "volumeMode": "Block" } }, "name": "example-deviceset", "placement": {}, "portable": true, "resources": {} } ] } } ...
5.7.9. Comprendre vos services API
Comme pour les CRD, il existe deux types de services API que votre opérateur peut utiliser : owned et required.
5.7.9.1. Services API propres
Lorsqu'un CSV possède un service API, il est responsable de la description du déploiement de l'extension api-server
qui le soutient et du groupe/version/genre (GVK) qu'il fournit.
Un service API est identifié de manière unique par le groupe/la version qu'il fournit et peut être listé plusieurs fois pour indiquer les différents types de services qu'il est censé fournir.
Field | Description | Obligatoire/facultatif |
---|---|---|
|
Groupe que le service API fournit, par exemple | Exigée |
|
Version du service API, par exemple | Exigée |
| Type de service que le service API est censé fournir. | Exigée |
| Le nom pluriel du service API fourni. | Exigée |
|
Nom du déploiement défini par votre CSV qui correspond à votre service API (requis pour les services API détenus). Pendant la phase d'attente du CSV, l'opérateur OLM recherche sur le site | Exigée |
|
Une version lisible du nom de votre service API, par exemple | Exigée |
| Une brève description de la manière dont ce service API est utilisé par l'opérateur ou une description de la fonctionnalité fournie par le service API. | Exigée |
| Vos services API possèdent un ou plusieurs types d'objets Kubernetes. Ceux-ci sont répertoriés dans la section des ressources afin d'informer vos utilisateurs des objets dont ils pourraient avoir besoin pour dépanner ou pour se connecter à l'application, comme le service ou la règle d'entrée qui expose une base de données. Il est recommandé de ne répertorier que les objets qui sont importants pour un être humain, et non pas une liste exhaustive de tout ce que vous orchestrez. Par exemple, ne listez pas les cartes de configuration qui stockent un état interne qui n'est pas censé être modifié par un utilisateur. | En option |
| Essentiellement la même chose que pour les CRD détenus. | En option |
5.7.9.1.1. Création d'une ressource de service API
Le gestionnaire du cycle de vie de l'opérateur (OLM) est chargé de créer ou de remplacer le service et les ressources du service API pour chaque service API unique appartenant à l'opérateur :
-
Les sélecteurs de pods de service sont copiés à partir du déploiement CSV correspondant au champ
DeploymentName
de la description du service API. - Une nouvelle paire clé/certificat d'autorité de certification est générée pour chaque installation et le paquet d'autorités de certification codé en base64 est incorporé dans la ressource de service API correspondante.
5.7.9.1.2. Service API servant des certificats
OLM se charge de la génération d'une paire clé/certificat de service lors de l'installation d'un service API appartenant à l'utilisateur. Le certificat de service a un nom commun (CN) contenant le nom d'hôte de la ressource Service
générée et est signé par la clé privée de la liasse CA intégrée dans la ressource de service API correspondante.
Le certificat est stocké en tant que secret de type kubernetes.io/tls
dans l'espace de noms du déploiement, et un volume nommé apiservice-cert
est automatiquement ajouté à la section des volumes du déploiement dans le CSV correspondant au champ DeploymentName
de la description du service API.
S'il n'existe pas encore, un montage de volume avec un nom correspondant est également ajouté à tous les conteneurs de ce déploiement. Cela permet aux utilisateurs de définir un montage de volume avec le nom attendu pour répondre à toute exigence de chemin d'accès personnalisé. Le chemin du montage de volume généré est par défaut /apiserver.local.config/certificates
et tous les montages de volume existants ayant le même chemin sont remplacés.
5.7.9.2. Required API services
OLM s'assure que tous les CSV requis disposent d'un service API disponible et que tous les GVK attendus peuvent être découverts avant de tenter l'installation. Cela permet à un CSV de s'appuyer sur des types spécifiques fournis par des services API qu'il ne possède pas.
Field | Description | Obligatoire/facultatif |
---|---|---|
|
Groupe que le service API fournit, par exemple | Exigée |
|
Version du service API, par exemple | Exigée |
| Type de service que le service API est censé fournir. | Exigée |
|
Une version lisible du nom de votre service API, par exemple | Exigée |
| Une brève description de la manière dont ce service API est utilisé par l'opérateur ou une description de la fonctionnalité fournie par le service API. | Exigée |