Comment changer rapidement de contexte Kubernetes avec Kubectx et Kubens
Agence web » Actualités du digital » Que sont les définitions de ressources personnalisées (CRD) Kubernetes ?

Que sont les définitions de ressources personnalisées (CRD) Kubernetes ?

Les définitions de ressources personnalisées (CRD) sont des extensions d’API Kubernetes qui peuvent définir de nouveaux types d’objets. Les pods, ReplicaSets, ConfigMaps et Ingresses sont des exemples de ressources intégrées courantes. Les CRD vous permettent d’ajouter des types entièrement nouveaux à cette liste, puis de les gérer à l’aide d’outils Kubernetes familiers tels que Kubectl.

Le mécanisme CRD est intentionnellement abstrait et peut être utilisé de multiples façons pour stocker des données et créer de nouvelles fonctionnalités. Vous trouverez des ressources personnalisées dans de nombreux outils communautaires populaires : Cert-Manager définit les objets qui représentent les certificats SSL et les émetteurs, tandis que Helm représente les graphiques comme leur propre CRD.

Qu’est-ce qui fait une ressource ?

Les ressources Kubernetes définissent les types de données que vous pouvez stocker dans votre cluster. Ils sont accessibles via l’API Kubernetes qui fournit des points de terminaison pour créer, répertorier et modifier des éléments dans chaque type de ressource.

Vous pouvez ajouter des ressources personnalisées pour stocker vos propres données arbitraires dans votre cluster. Les éléments que vous créez seront stockés par le composant de plan de contrôle etcd, aux côtés des instances de ressources intégrées. Les ressources personnalisées sont automatiquement affichées par l’API, vous n’avez donc pas besoin de configurer vos propres outils pour créer des instances d’élément.

Les CRD agissent par défaut comme de simples structures de données. Bien que les CRD dans la nature aient souvent leurs propres comportements, cela n’est pas fourni par le mécanisme CRD. Les contrôleurs et opérateurs Kubernetes personnalisés peuvent être utilisés pour implémenter des fonctionnalités autour de ressources personnalisées. Sans contrôleur, les éléments d’un CRD existeront toujours en tant que données statiques dans le cluster avec lesquelles vous pouvez interagir via les points de terminaison CRUD fournis par l’API Kubernetes.

Les CRD sont des composants dynamiques qui peuvent être créés et supprimés à tout moment. Certains types d’objets inclus dans Kubernetes sont également implémentés en tant que CRD, ce qui offre une plus grande modularité au cœur du cluster.

Création d’un CRD

Les CRD sont eux-mêmes un type d’objet Kubernetes. Vous les créez de la même manière que n’importe quelle autre ressource, en écrivant un fichier YAML et en l’appliquant à votre cluster :

apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
  name: custom-apps.crds.example.com
spec:
  group: crds.example.com
  versions:
    - name: v1
      served: true
      storage: true
      schema:
        openAPIV3Schema:
          type: object
          properties:
            spec:
              type: object
              properties:
                app-name:
                  type: string
                app-version:
                  type: string
                release-count:
                  type: integer
  scope: Namespaced
  names:
    plural: custom-apps
    singular: custom-app
    kind: CustomApp

Utilisez Kubectl pour ajouter le CustomApp CRD à votre cluster :

$ kubectl apply -f custom-apps-crd.yaml
customresourcedefinition.apiextensions.k8s.io/custom-apps.crds.example.com created

Le fichier YAML définit un CRD qui peut être utilisé pour stocker des données sur les applications. Les CRD ont besoin d’un metadata.name et spec.group champ dans un format précis : le groupe prend la forme d’un sous-domaine auquel appartient le CRD. Le même sous-domaine doit être inclus dans les CRD metadata.name . La valeur de names.plural est ajouté en tant que nouveau composant de sous-domaine pour créer la version finale metadata.name.

La spec.names Le champ définit comment vous ferez référence au CRD lors de l’utilisation de l’API Kubernetes et des commandes Kubectl. Dans cet exemple, vous pourrez exécuter kubectl get custom-apps et kubectl get custom-app/example-app pour interagir avec les objets qui utilisent le CRD. Lorsque vous créez un nouvel objet en tant que fichier YAML, vous devez définir kind: CustomApp pour en faire une instance du CRD.

Le CRD est configuré comme un type d’objet au niveau de l’espace de noms par le scope champ. Vous pouvez utiliser Cluster comme valeur alternative pour ce champ afin de créer des objets qui existent au niveau du cluster, en dehors de tout espace de noms.

Les données associées à vos objets personnalisés sont définies dans le spec.versions.schema.openAPIV3Schema champ. Chaque « version » répertoriée crée une nouvelle version de l’API du CRD que vous pouvez référencer avec le apiVersion dans vos fichiers YAML de ressources. Les données du CRD sont configurées à l’aide des propriétés OpenAPI ; ici, chaque « application personnalisée » de votre cluster doit avoir app-name, app-versionet release-count propriétés définies dans son YAML spec.

Utilisation de votre CRD

Le provisionnement des points de terminaison d’API d’un nouveau CRD peut prendre quelques minutes. Vérifiez la progression en récupérant les détails du CRD avec Kubectl :

$ kubectl describe crd custom-apps.crds.example.com
...
Status:
  Accepted Names:
    Kind:       CustomApp
    List Kind:  CustomAppList
    Plural:     custom-apps
    Singular:   custom-app
  Conditions:
    Last Transition Time:  2022-04-04T13:29:24Z
    Message:               no conflicts found
    Reason:                NoConflicts
    Status:                True
    Type:                  NamesAccepted
    Last Transition Time:  2022-04-04T13:29:24Z
    Message:               the initial names have been accepted
    Reason:                InitialNamesAccepted
    Status:                True
    Type:                  Established
...

Le CRD est prêt à être utilisé lorsque vous voyez Type: Established vers la fin de la sortie de la commande. Kubernetes acceptera les demandes adressées au point de terminaison API du CRD. Dans ce cas, l’URL de base de l’API sera la suivante :

/apis/custom-apps.crds.example.com/v1/namespaces/*/custom-apps/...

Vous pouvez maintenant utiliser Kubectl pour afficher les objets qui ont été créés avec le CRD :

$ kubectl get custom-apps
No resources found in default namespace.

Bien qu’aucun objet n’existe encore, Kubernetes sait maintenant qu’il a un type de ressource appelé custom-apps.

Pour créer un objet « application personnalisée », écrivez un nouveau fichier YAML avec kind: CustomApp. La apiVersion doit être défini sur le nom du groupe et la version de l’API fournis par le CRD. Au sein de la spec incluez les propriétés que vous avez définies dans le schéma du CRD.

apiVersion: crds.example.com/v1
kind: CustomApp
metadata:
  name: demo-app-1
spec:
  app-name: demo-app
  app-version: 1.1.0
  release-count: 5

Utilisez Kubectl pour ajouter l’objet à votre cluster :

$ kubectl apply -f custom-app.yaml
customapp.crds.example.com/demo-app created

Vous pouvez maintenant récupérer les détails de l’objet à l’aide des commandes Kubectl habituelles :

$ kubectl describe custom-app/demo-app-1
Name:         demo-app
Namespace:    default
Labels:       <none>
Annotations:  <none>
API Version:  crds.example.com/v1
Kind:         CustomApp
...
Spec:
  App - Name:       demo-app
  App - Version:    1.1.0
  Release - Count:  5
...
Events:             <none>

Vous disposez d’une ressource personnalisée fonctionnelle qui stocke maintenant certaines données dans votre cluster Kubernetes. Vous pouvez supprimer le CRD en le supprimant dans Kubectl ; cela nettoiera automatiquement tous les objets qui l’utilisent.

$ kubectl delete crd custom-apps.crds.example.com
customresourcedefinition.apiextensions.k8s.io "custom-apps.crds.example.com" deleted

Construire des API déclaratives avec des CRD

Ce CRD n’ajoute aucune fonctionnalité au cluster. Il stocke les données, fournit une API pour interagir avec elles et peut être référencé par d’autres objets. Les CRD deviennent plus puissants lorsqu’ils sont associés à un contrôleur personnalisé qui peut prendre la responsabilité de les gérer.

Les contrôleurs suivent les ressources et prennent des mesures en réponse à leurs événements. L’écriture d’un contrôleur pour vos CRD vous permet de les transformer en API déclaratives qui provoquent de réels changements au sein de votre cluster. Vos objets peuvent représenter le voulu état, au lieu de l’état actuel précis.

Cert-Manager utilise ce modèle pour acquérir automatiquement des certificats SSL lorsque de nouveaux objets CertificateRequest apparaissent dans votre cluster. Au sein du cœur de Kubernetes, les nœuds extraient et exécutent des images de conteneur en réponse à l’apparition de pods. Les contrôleurs vous permettent d’attacher un comportement à vos propres CRD, de sorte que l’ajout d’une « application personnalisée » pourrait entraîner la récupération de sa configuration à partir d’un service externe. Vous pouvez commencer à créer des contrôleurs en utilisant le SDK Go pour intégrer votre propre code à l’environnement d’exécution Kubernetes.

Quand utiliser les CRD ?

Les CRD sont mieux utilisés pour gérer les données internes à votre organisation, équipe ou projet. Ils sont conçus pour représenter des schémas clairement définis, sous forme de valeurs statiques ou d’API déclaratives soutenues par une implémentation de contrôleur personnalisée.

Les fonctionnalités avancées vous permettent d’implémenter des routines de validation pour les champs de votre schéma. Vous pouvez également utiliser des finaliseurs pour gérer les suppressions d’objets et adopter le système de gestion des versions pour gérer les modifications apportées à vos définitions CRD.

Les CRD se chevauchent parfois avec Kubernetes ConfigMaps. Ce sont des objets intégrés pour stocker les données de configuration génériques associées à vos applications. Un ConfigMap est approprié lorsque vous consommez les valeurs à un endroit spécifique de votre cluster, tel qu’un pod qui accède aux paramètres de la base de données en tant que variables d’environnement injectées à partir d’un ConfigMap.

Les CRD sont destinés à être utilisés lorsque les données doivent être un citoyen de première classe dans votre cluster. Vous pouvez créer plusieurs instances du type de ressource du CRD, interagir directement avec elles à l’aide de Kubectl et créer vos propres schémas structurés qui guident les utilisateurs vers la saisie de valeurs correctes. Ils peuvent constituer un meilleur choix lorsque les données existent indépendamment de tout autre élément de votre cluster.

Sommaire

Les définitions de ressources personnalisées (CRD) Kubernetes définissent de nouveaux types d’objets que vous pouvez utiliser avec l’API Kubernetes et Kubectl. Chaque CRD obtient sa propre API versionnée, possède un schéma structuré et peut être utilisé pour implémenter de nouvelles fonctionnalités dans le cluster lorsqu’il est soutenu par un contrôleur compagnon.

Les CRD peuvent parfois sembler compliqués et réservés aux situations avancées. Cela ne doit pas être le cas. Des CRD simples pour stocker des valeurs statiques dans votre cluster sont faciles à créer, comme illustré par l’exemple « application personnalisée » ci-dessus. Ils peuvent être utilisés pour contenir des données de cluster autonomes afin qu’elles reçoivent un traitement de première classe dans Kubernetes.

Il est également important de reconnaître où les CRD ne conviennent pas. Les objets intégrés tels que ConfigMaps et Secrets sont conçus pour s’adapter à la plupart des formes de configuration qui seront directement utilisées par les pods de votre application. L’écriture d’un CRD qui définit le schéma du fichier de configuration de votre application est généralement inutile et plus difficile à maintenir au fil du temps, car vous ne bénéficierez pas des fonctionnalités de ConfigMap telles que les mises à jour continues automatiques et l’injection de variables d’environnement.

★★★★★