Boostez les Charts Helm : Utiliser Kustomize pour Gérer les Déploiements Kubernetes

Les équipes d’exploitation doivent automatiser le déploiement des applications, et Helm est la solution standard du secteur pour le déploiement sur Kubernetes. Comme de nombreux fournisseurs de logiciels, nous fournissons des charts Helm pour l’installation d’Artifactory et d’autres produits de la plateforme JFrog DevOps, conçus pour les configurations standard/recommandées dont la plupart des équipes auront besoin. Ces modèles fournissent aux clients un ensemble limité d’options de configuration.

Si vous avez besoin de personnaliser votre Artifactory, Xray ou d'autres déploiements à votre manière, vous pouvez dupliquer le chart pour créer votre propre version personnalisée. Mais si vous le faites, chaque fois que JFrog met à jour son chart Helm, votre version personnalisée devient désynchronisée et obsolète. Pour garder votre version à jour, vous devez réintégrer chaque mise à jour.

Comment personnaliser un chart Helm sans duplication ? C’est exactement pour cette raison que Google a créé Kustomize. Dans cet article, ainsi que dans un webinaire à venir, nous allons vous montrer comment vous pouvez utiliser les superpositions Kustomize pour effectuer des déploiements personnalisés tout en utilisant toujours la dernière version du chart Helm de votre fournisseur.

Modèles ou Superpositions

Un modèle est un formulaire qui comporte des espaces réservés qui seront analysés par un processus automatisé pour les remplacer par des valeurs. Conçu pour remplir une fonction spécifique, il signale les emplacements où vous devez fournir les détails. Si vous avez déjà joué à « Mad Libs », ce processus de « remplir les blancs » vous paraîtra familier.

En tant que développeur, vous vous rendrez compte que les modèles et les valeurs sont comme les macros et leurs variables, ou les sous-routines et leurs paramètres. 

Une superposition est un ensemble de chaînes de remplacement. De nouveaux blocs de texte remplacent entièrement ceux du fichier d'origine.

Quelle est la différence ? 

  • Un modèle doit être soigneusement préparé pour exiger des informations spécifiques aux endroits clés. Lorsque vous utilisez un modèle, vous êtes limité à la modification des éléments que le modèle met à disposition. 
  • Une superposition ne nécessite aucune préparation du fichier d’origine. Vous pouvez remplacer n’importe quelle partie dans son intégralité.

Chart Helm HelloWorld

Étant donné que les charts Helm d’Artifactory sont assez avancés, nous allons recourir à un exemple très simple. Ici, le modèle autorise un argument pour le nom de la société.

$ cat templates/pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: helloworld
spec:
  restartPolicy: Never
  containers:
  - name: hello
    image: alpine
    env:
    command: ["/bin/sh","-c"]
    args: ["/bin/echo Hello! My company name is {{ .Values.companyName}}"]

 

Les valeurs pour les arguments du modèle se trouvent dans le fichier values.yaml.

$ cat values.yaml
companyName: ABC Company

 

Installons et voyons comment cela fonctionne.

$ Helm install helloworld .
NAME: helloworld
LAST DEPLOYED: Mon May 18 16:53:14 2020
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None

$ kubectl logs -f helloworld
Hello! My company name is ABC Company

 

Parfait ! Tout a bien fonctionné et nous l’avons expédié aux clients. Mais un client a une exigence unique : ajouter le nom de l’employé et le nom du département à la sortie pour ressembler à ceci: 

Je m’appelle John. Je travaille pour le département de la comptabilité. Le nom de notre entreprise est Société ABC.

D’accord, c'est très facile, ils pourraient dupliquer le chart Helm et modifier le modèle Helm comme suit :

    args: ["/bin/echo My name is {{ .Values.employeeName}}. I work for {{ .Values.employeeDepartment}} department. Our company name is {{.Values.companyName}}"]

 

Ensuite, ils peuvent ajouter de nouvelles valeurs dans le fichier values.yaml .

$ cat values.yaml
employeeName: Gary
employeeDepartment: Marketing
companyName: ABC Company

 

Mais, comme nous l’avons indiqué, leur duplication n'est plus synchronisée avec l’original. C’est là qu'intervient Kustomize.

Superposition avec Kustomize

Kustomize vous permet de superposer vos propres « kustomizations » dans des fichiers yaml. Dans notre exemple, le client peut « kustomizer » selon ses besoins sans créer une duplication privée et impossible à maintenir de charts.

Tout d’abord, le client doit créer un fichier kustomization.yaml .

patchesJson6902:
- target:
    version: v1
    kind: Pod
    name: helloworld
  patch: |-
    - op: replace
      path: /spec/containers/0/args
      value: ["/bin/echo My name is {{ .Values.employeeName}}. I work for {{ .Values.employeeDepartment}} department. Our company name is {{ .Values.companyName}}"]
resources:
- templates/pod.yaml

 

Maintenant, nous pouvons demander à kustomize d'appliquer notre superposition.

$ mkdir templates_new
$ kustomize build -o templates_new

$ cat templates_new/~g_v1_pod_helloworld.yaml
apiVersion: v1
kind: Pod
metadata:
  name: helloworld
spec:
  containers:
  - args:
    - /bin/echo My name is {{ .Values.employeeName}}. I work for {{ .Values.employeeDepartment}}
      department. Our company name is {{ .Values.companyName}}
    command:
    - /bin/sh
    - -c
    image: alpine
    name: hello
  restartPolicy: Never

 

Nous allons commencer par remplacer le modèle d’origine par notre nouveau modèle, puis l’installer avec Helm et vérifier.

$ mv templates templates_old

$ mv templates_new/ templates

$ Helm delete helloworld
release "helloworld" uninstalled

$ Helm install helloworld .
NAME: helloworld
LAST DEPLOYED: Tue May 19 14:27:18 2020
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None

$ kubectl logs -f helloworld
My name is Gary. I work for Marketing department. Our company name is ABC Company

 

Génial ! Cela répond aux exigences de notre client.

Modèle d’Abord, Superposition Ensuite

Dans l’exemple précédent, nous avons utilisé Kustomize pour modifier notre modèle Helm afin d’accepter de nouvelles valeurs, puis nous avons utilisé cette version avec helm install pour déployer l’application. 

Mais il existe des cas pour lesquels cette séquence n’est pas idéale. Au lieu de cela, vous pouvez souhaiter afficher d'abord le modèle de chart localement, puis appliquer votre superposition Kustomize lorsque vous déployez l’application.

Cette solution est la plus appropriée lorsque vous devez déployer la même application dans plusieurs environnements, mais avec des problèmes transversaux liés aux étiquettes, à la sécurité ou aux compteurs. Par exemple, vous pouvez avoir différentes combinaisons d’exigences pour chaque environnement :

Environnement étiquettes sécurité compteurs
dév Oui Non Non
test Oui Non Oui
production Oui Oui Oui

 

De la même façon, vous devrez peut-être régler les ports ou l’accès pour chacun de ces environnements. Dans de tels cas, il peut s'avérer plus flexible d’appliquer une superposition Kustomize différente à un même chart Helm affiché pour chaque environnement.

À cette fin, l’utilitaire de ligne de commande kubectl fournit l'option apply -k . Cette dernière applique Kustomize aux charts à l’aide des fichiers kustomization.yaml dans les répertoires.

Pour commencer, nous allons afficher le chart Helm localement à l’aide de la commande helm template. Cela génère un fichier YAML avec toutes les valeurs résolues, que nous capturons dans un fichier local.

$ mkdir templates_new
$ helm template . > templates_new/pod.yaml

$ $ cat templates_new/pod.yaml
---
# Source: helloworld/templates/~g_v1_pod_helloworld.yaml
apiVersion: v1
kind: Pod
metadata:
  name: helloworld
spec:
  containers:
  - args:
    - /bin/echo My name is Gary. I work for Marketing
      department. Our company name is ABC Company
    command:
    - /bin/sh
    - -c
    env: null
    image: alpine
    name: hello
  restartPolicy: Never

 

Créez un nouveau fichier de kustomisation pour ajouter des étiquettes à notre pod :

$ cat templates_new/kustomization.yaml
commonLabels:
  app: helloworld
resources:
- templates_new/pod.yaml

 

Maintenant, utilisons kubectl apply -k pour installer notre chart avec de nouvelles étiquettes :

$ helm delete helloworld

$ kubectl apply -k templates_new/.
pod/helloworld created

$ kubectl get pods
NAME         READY   STATUS      RESTARTS   AGE
helloworld   0/1     Completed   0          10s

$ kubectl describe pod helloworld
Name:         helloworld
Namespace:    default
Priority:     0
Node:         docker-desktop/192.168.65.3
Start Time:   Mon, 22 Jun 2020 16:22:11 -0700
Labels:       app=helloworld
Annotations:  Status:  Succeeded
...
...

 

C'est fait ! Nous sommes désormais en mesure de prendre un chart Helm de n'importe quel fournisseur et d'ajouter nos propres personnalisations, tout en continuant à accepter les mises à jour des charts en amont.

Approfondissez vos Connaissances

Les charts Helm de JFrog sont assez avancées, et nous avons souvent dû maintenir plusieurs versions pour notre usage interne. L’utilisation de Kustomize nous a aidés à éviter la modification manuelle des charts et à automatiser plus complètement nos processus CI/CD.

Vous voulez en savoir plus ? Regardez notre webinaire enregistré sur la façon de Booster Artifactory avec Kustomize & Helm. Nous sommes impatients de partager ce que nous avons appris et de vous aider à mieux gérer vos déploiements !