2 minutes pour comprendre... les CRDs
Sommaire
En 2 minutes #
Les objets de type Custom Resource Definition (CRD), apparus dans la version 1.7 de Kubernetes, permettent d’étendre l’API de Kubernetes et d’y ajouter de nouveaux types d’objets. Chaque nouveau type d’objet défini par une CRD possède un schéma commun et des champs spécifiques à ce dernier. Cependant, un nouveau type d’objet créé à partir d’une CRD n’est pas exploité s’il est ajouté seul dans un cluster Kubernetes. Afin d’en tirer parti, il faudra également mettre en œuvre des opérateurs ou contrôleurs qui auront pour rôle de manipuler les objets de ce nouveau type et d’en exploiter les champs afin de réaliser différentes actions. Les nouveaux objets créés à partir des types personnalisés sont bien évidement utilisables dans les fonctionnalités natives de Kubernetes comme les RBAC, les Validating Admission Policy, etc…
Voici quelques cas d’usages des CRDs :
- définir les spécifications d’une application personnalisée
- utiliser Kubernetes comme API centrale pour construire des plateformes (applicatives ou d’infrastructure)
- disposer des fonctionnalités de Kubernetes comme les systèmes d’authentification et d’autorisation pour la gestion des ressources personnalisées sur les clusters
- avoir un standard pour la définition de nouveaux endpoint d’API
En savoir plus… #
Architecture #
Pour illustrer le format des CRDs, nous utiliserons un exemple de la documentation officielle.
Voici donc un exemple de CRD au format YAML :
| |
Dans les spécifications de cet objet (spec), on peut distinguer plusieurs champs qui sont, par ailleur, des éléments définissable dans chaque CRDs :
group: indique le nom du groupe de l’API, généralement défini à partir d’un nom de domaine (eg.networking.k8s.io)versions: indique la ou les version(s) utilisables de l’objet, telles quev1alpha1,v1beta,v1, …schema: définit le schéma de l’objet à l’aide de la spécification OpenAPI qui permet de vérifier le format de l’objet avant chaque opération en envoyant ce dernier à l’API Kubernetesscope: spécifie si l’objet doit être présent dans un namespace Kubernetes (Namespaced) ou bien s’il est disponible à l’échelle du cluster (Cluster)names.pluraletnames.singular: spécifie le nom pluriel et singulier de la ressourceshortNames: spécifie le nom court disponible pour les appels à cette ressource via kubectl (eg.deploypourdeployments)
Voici un exemple d’objet créé à partir du schéma de cette ressource :
| |
Ecosystème #
Vous pourrez trouver dans ce dépôt GitHub un grand nombre de CRDs liés à des projets et solutions populaires.
Il existe également Kubeconform qui est un projet permettant de valider le schéma des CRDs et autres ressources Kubernetes avant leur application, dans le cadre d’une CI, par exemple.