Une brève introduction à Kustomize

Remarque perev. : L'article a été écrit par Scott Lowe, un ingénieur informatique senior qui est l'auteur / co-auteur de sept livres imprimés (principalement pour VMware vSphere). Il travaille actuellement dans sa filiale VMware, Heptio (acquise en 2016), spécialisée dans le cloud computing et Kubernetes. Le texte lui-même sert d'introduction vaste et facile à comprendre à la gestion de la configuration pour Kubernetes à l'aide de la technologie Kustomize , récemment incluse avec les K8.



Kustomize est un outil qui permet aux utilisateurs de "personnaliser des fichiers YAML simples et sans modèle à diverses fins, en laissant le YAML d'origine intact et utilisable" (la description est empruntée directement au référentiel kustomize sur GitHub ). Kustomize peut être exécuté directement ou, à partir de Kubernetes 1.14, utiliser kubectl -k pour accéder à ses fonctions (bien que depuis Kubernetes 1.15, un binaire distinct soit plus récent que les fonctionnalités intégrées à kubectl). ( Remarque : Avec la récente version de Kubernetes 1.16 , kustomize est également pris en charge dans l'utilitaire kubeadm.) Dans cet article, je souhaite présenter aux lecteurs les bases de kustomize.

Dans sa forme / application la plus simple, kustomize est simplement une collection de ressources (fichiers YAML qui définissent les objets Kubernetes: déploiements, services, etc.) plus une liste d'instructions sur les modifications à apporter à ces ressources. Tout comme make utilise le jeu d'instructions contenu dans le Makefile et Docker Dockerfile conteneur basé sur les instructions du Dockerfile , kustomize utilise kustomization.yaml pour stocker des instructions sur les modifications que l'utilisateur souhaite apporter au jeu de ressources.

Voici un exemple de fichier kustomization.yaml :

 resources: - deployment.yaml - service.yaml namePrefix: dev- namespace: development commonLabels: environment: development 

Je n'essaierai pas de parler de tous les champs possibles du fichier kustomization.yaml (c'est bien écrit ici ), mais je donnerai une brève explication d'un exemple spécifique:

  • Le champ des resources indique quelles (quelles ressources) kustomize va changer. Dans ce cas, il recherchera des ressources dans les fichiers deployment.yaml et service.yaml dans son répertoire (si nécessaire, vous pouvez spécifier des chemins d'accès complets ou relatifs).
  • Le champ namePrefix demande à kustomize d'ajouter un préfixe spécifique (dans ce cas, dev- ) à l'attribut name de toutes les ressources définies dans le champ resources . Ainsi, s'il existe un name dans Deployment avec la valeur nginx-deployment , kustomize en fera dev-nginx-deployment .
  • Le champ d' namespace demande à kustomize d'ajouter l'espace de noms spécifié à toutes les ressources. Dans ce cas, Deployment and Service tombera dans l'espace de noms de development .
  • Enfin, le champ commonLabels contient un ensemble d'étiquettes qui seront ajoutées à toutes les ressources. Dans notre exemple, kustomize attribuera une étiquette aux ressources avec l' environment nom et le development valeur.

Si l'utilisateur exécute kustomize build . dans le répertoire avec le fichier kustomization.yaml et les ressources nécessaires (c'est-à-dire les fichiers deployment.yaml et service.yaml ), puis à la sortie, il recevra le texte avec les modifications enregistrées dans kustomization.yaml .


Remarque perev. : Illustration tirée de la documentation du projet pour l'utilisation «simple» de kustomize

La sortie peut être redirigée si vous devez valider les modifications:

 kustomize build . > custom-config.yaml 

La sortie est déterministe (avec la même entrée, la même sortie sera obtenue), vous ne pouvez donc pas enregistrer le résultat dans un fichier. Au lieu de cela, vous pouvez immédiatement le passer à une autre commande:

 kustomize build . | kubectl apply -f - 

Les fonctions Kustomize sont également accessibles via kubectl -k (depuis la version 1.14 de Kubernetes). Cependant, gardez à l'esprit qu'un package kustomize distinct est mis à jour plus rapidement qu'un package intégré dans kubectl (du moins c'est le cas avec la version de Kubernetes 1.15).

Les lecteurs peuvent demander: «Pourquoi toutes ces difficultés, si vous pouvez éditer des fichiers directement?». Grande question. Dans notre exemple, il est vraiment possible de modifier directement les fichiers deployment.yaml et service.yaml , mais qu'en est-il s'ils sont un fork du projet de quelqu'un d'autre? La modification directe des fichiers rend difficile (voire impossible) le rebasage du fork lorsque des modifications sont apportées à la source / source. L'utilisation de kustomize vous permet de centraliser ces modifications dans le fichier kustomization.yaml , en laissant les fichiers d'origine intacts et en facilitant ainsi le rebase des fichiers source si nécessaire.

Les avantages de kustomize deviennent évidents dans des cas d'utilisation plus complexes. Dans l'exemple ci-dessus, kustomization.yaml et les ressources se trouvent dans le même répertoire. Cependant, kustomize prend en charge les scénarios d'utilisation lorsqu'il existe une configuration de base et plusieurs de ses variantes, également appelées superpositions . Par exemple, un utilisateur voulait prendre Déploiement et Service pour nginx, que j'ai utilisé comme exemple, et créer des versions (ou variantes) de développement, de transfert et de production (ou variantes) de ces fichiers. Pour ce faire, il aura besoin des superpositions mentionnées ci-dessus et, en fait, des ressources de base elles-mêmes.

Pour illustrer l'idée de superpositions et de ressources de base , supposons que les répertoires aient la structure suivante:

 - base - deployment.yaml - service.yaml - kustomization.yaml - overlays - dev - kustomization.yaml - staging - kustomization.yaml - prod - kustomization.yaml 

Dans le base/kustomization.yaml utilisateurs utilisent simplement le champ des resources pour déclarer les ressources que kustomize doit activer.

Dans chacun des overlays/{dev,staging,prod}/kustomization.yaml utilisateurs se réfèrent à la configuration de base dans le champ des resources , puis indiquent les modifications spécifiques à cet environnement . Par exemple, le overlays/dev/kustomization.yaml peut ressembler à l'exemple donné précédemment:

 resources: - ../../base namePrefix: dev- namespace: development commonLabels: environment: development 

Dans le même temps, le overlays/prod/kustomization.yaml peut être complètement différent:

 resources: - ../../base namePrefix: prod- namespace: production commonLabels: environment: production sre-team: blue 

Lorsque l'utilisateur démarre la kustomize build . dans le overlays/dev , kustomize générera une option de développement. Si vous exécutez kustomize build . dans le répertoire overlays/prod - vous obtenez l'option de production. Et tout cela - sans apporter de modifications aux fichiers (de base) d'origine , et tout cela - de manière déclarative et déterministe. Vous pouvez valider la configuration de base et les répertoires de superposition directement dans le système de contrôle de version, sachant qu'à partir de ces fichiers, vous pouvez reproduire la configuration souhaitée à tout moment.


Remarque perev. : Illustration de la documentation du projet pour l'utilisation de superpositions dans kustomize

Kustomize peut faire bien plus que ce qui est décrit dans cet article. Cependant, j'espère que cela servira de bonne introduction.

Ressources supplémentaires


Il existe de nombreux bons articles et publications sur kustomize. En voici quelques-unes que j'ai trouvées particulièrement utiles:


Remarque perev. : Vous pouvez également conseiller le bloc de liens publiés en tant que ressources sur le site Web de l'utilitaire, et la collection ultérieure de vidéos avec les derniers rapports sur kustomize.

Si vous avez des questions ou des suggestions pour améliorer ce matériel, je suis toujours ouvert aux commentaires. Vous pouvez me contacter sur Twitter ou sur la chaîne Kubernetes Slack . Amusez-vous à modifier vos manifestes avec kustomize!

PS du traducteur


Lisez aussi dans notre blog:

Source: https://habr.com/ru/post/fr469179/


All Articles