Créer et installer un chart Helm

Effectué

Les charts Helm simplifient le déploiement des applications sur n’importe quel cluster Kubernetes. Utilisez Helm pour modéliser les informations de déploiement de votre application sous la forme d’un chart Helm, que vous utiliserez ensuite pour déployer votre application.

Supposons que votre équipe de développement a déjà déployé le site web d’animalerie de votre entreprise sur votre cluster AKS. L’équipe crée trois fichiers pour déployer le site web :

  • Un manifeste de déploiement qui décrit comment installer et exécuter l’application sur le cluster,
  • Un manifeste de service qui décrit comment exposer le site web sur le cluster et
  • Un manifeste d’entrée qui décrit comment le trafic en provenance de l’extérieur du cluster est routé vers l’application web.

L’équipe déploie ces fichiers dans chacun des trois environnements dans le cadre du cycle de vie de développement des logiciels. Chacun des trois fichiers est mis à jour avec des variables et des valeurs propres à l’environnement. Étant donné que chaque fichier est codé en dur, la maintenance de ces fichiers est sujette aux erreurs.

Comment Helm traite les charts ?

Le client Helm implémente un moteur de modèle basé sur le langage Go, qui analyse tous les fichiers disponibles dans les dossiers d’un chart. Le moteur de modèle crée des fichiers manifeste Kubernetes en combinant les modèles du dossier templates/ du chart avec les valeurs des fichiers Chart.yaml et values.yaml.

A diagram shows a process parsing a Helm template file and values file to create and deploy an application to a Kubernetes cluster using manifest files.

Une fois les fichiers manifeste disponibles, le client peut installer, mettre à niveau ou supprimer l’application définie dans les fichiers manifeste générés.

Comment définir un fichier Chart.yaml

Chart.yaml fait partie des fichiers obligatoires dans la définition d’un chart Helm et fournit des informations sur le chart. Le contenu du fichier est constitué de trois champs obligatoires et de plusieurs champs facultatifs.

Les trois champs obligatoires sont :

  • apiVersion : Version de l’API de chart à utiliser. Vous affectez v2 à la version pour les charts qui utilisent Helm 3.
  • name : Nom du chart.
  • version : Numéro de version du chart qui utilise le versioning sémantique 2.0.0 et suit la notation de numéro de version suivante : MAJOR.MINOR.PATCH.

L’exemple suivant montre le contenu d’un fichier Chart.yaml de base :

apiVersion: v2
name: webapp
description: A Helm chart for Kubernetes

# A chart can be either an 'application' or a 'library' chart.
#
# Application charts are a collection of templates that can be packaged into versioned archives
# to be deployed.
#
# Library charts provide useful utilities or functions for the chart developer. They're included as
# a dependency of application charts to inject those utilities and functions into the rendering
# pipeline. Library charts do not define any templates and therefore, cannot be deployed.
type: application

# This is the chart version. This version number should be incremented each time you make changes
# to the chart and its templates, including the app version.
version: 0.1.0

# This is the version number of the application being deployed. This version number should be
# incremented each time you make changes to the application.
appVersion: 1.0.0

Notez l’utilisation du champ type dans l’exemple de fichier. Vous pouvez créer des charts pour installer des applications ou des bibliothèques. Le type de chart par défaut est application. Il peut être défini sur library pour spécifier que le chart va installer une bibliothèque.

De nombreux champs facultatifs sont disponibles pour personnaliser le processus de déploiement du chart. Par exemple, vous pouvez utiliser le champ dependencies afin de spécifier d’autres exigences pour le chart, comme une application web qui dépend d’une base de données.

Remarque

La description détaillée de tous les champs facultatifs n’entre pas dans le cadre de ce module. Toutefois, vous trouverez un lien vers la documentation Helm dans la section récapitulative du module.

Comment définir un modèle de chart

Un modèle de chart Helm est un fichier qui décrit différents fichiers manifeste de type de déploiement. Les modèles de chart sont écrits dans le langage de modèle Go et fournissent des fonctions de modèle pour automatiser la création de fichiers manifeste d’objet Kubernetes.

Les fichiers de modèle sont stockés dans le dossier templates/ d’un chart. Le moteur de modèle traite ces fichiers pour créer le manifeste d’objet final.

Par exemple, supposons que votre équipe de développement utilise le fichier manifeste de déploiement suivant pour déployer le composant d’animalerie de la solution :

apiVersion: apps/v1
kind: Deployment
metadata:
  name: store-front
spec:
  replicas: {{ .Values.replicaCount }}
  selector:
    matchLabels:
      app: store-front
  template:
    metadata:
      labels:
        app: store-front
    spec:
      nodeSelector:
        "kubernetes.io/os": linux
      containers:
      - name: store-front
        image: {{ .Values.storeFront.image.repository }}:{{ .Values.storeFront.image.tag }}
        ports:
        - containerPort: 8080
          name: store-front
        env: 
        - name: VUE_APP_ORDER_SERVICE_URL
          value: "http://order-service:3000/"
        - name: VUE_APP_PRODUCT_SERVICE_URL
          value: "http://product-service:3002/"
        resources:
          requests:
            cpu: 1m
            memory: 200Mi
          limits:
            cpu: 1000m
            memory: 512Mi
        startupProbe:
          httpGet:
            path: /health
            port: 8080
          failureThreshold: 3
          initialDelaySeconds: 5
          periodSeconds: 5
        readinessProbe:
          httpGet:
            path: /health
            port: 8080
          failureThreshold: 3
          initialDelaySeconds: 3
          periodSeconds: 3
        livenessProbe:
          httpGet:
            path: /health
            port: 8080
          failureThreshold: 5
          initialDelaySeconds: 3
          periodSeconds: 3
---
apiVersion: v1
kind: Service
metadata:
  name: store-front
spec:
  type: {{ .Values.storeFront.serviceType }}
  ports:
  - port: 80
    targetPort: 8080
  selector:
    app: store-front

Notez que l’emplacement de l’image conteneur est codé en dur à l’aide de la syntaxe {{.Values.<property>}}. Avec cette syntaxe, vous pouvez créer des espaces réservés pour chaque valeur personnalisée.

Créer des charts Helm manuellement est un processus fastidieux. Un moyen simple de créer un chart Helm est d’utiliser la commande helm create. Vous personnalisez ensuite les fichiers générés automatiquement en fonction des exigences de votre application.

Comment définir un fichier values.yaml

Vous utilisez des valeurs de chart pour personnaliser la configuration d’un chart Helm. Les valeurs d’un chart peuvent être prédéfinies, ou fournies par l’utilisateur au moment du déploiement du chart.

Une valeur prédéfinie est une valeur sensible à la casse qui est prédéfinie dans le contexte d’un chart Helm et qui ne peut pas être changée par l’utilisateur. Par exemple, vous pouvez utiliser Release.Name pour référencer le nom de la version, ou Release.IsInstall pour déterminer si l’opération en cours est une installation.

Vous pouvez également utiliser des valeurs prédéfinies pour extraire des données du contenu de Chart.yaml. Par exemple, si vous souhaitez vérifier la version du chart, vous référencez Chart.Version. Gardez à l’esprit que vous pouvez uniquement référencer des champs connus. Vous pouvez considérer les valeurs prédéfinies comme des constantes à utiliser dans les modèles que vous créez.

La syntaxe pour inclure des noms de valeurs dans un fichier de modèle implique de mettre chaque nom de valeur entre accolades doubles, comme ceci : {{.Release.Name}}. Comme vous le constatez, il y a un point devant le nom de la valeur. Dans cette syntaxe, le point est traité comme un opérateur de recherche et indique l’étendue actuelle de la variable.

Par exemple, l’extrait de code YAML suivant contient un dictionnaire défini dans un fichier de valeurs :

object:
  key: value

Pour accéder à la valeur dans un modèle, utilisez la syntaxe suivante :

{{ .Values.object.key }}

Une valeur fournie vous permet de traiter des valeurs arbitraires dans le modèle de chart. Le fichier values.yaml définit ces valeurs.

Dans l’exemple, l’équipe de développement prévoit les trois valeurs configurables suivantes :

apiVersion: apps/v1
kind: Deployment
metadata:
  name: store-front
spec:
  replicas: {{ .Values.replicaCount }}
  ...
      containers:
      - name: store-front
        image: {{ .Values.storeFront.image.repository }}:{{ .Values.storeFront.image.tag }}
        ports:
  ...
---
apiVersion: v1
kind: Service
metadata:
  name: store-front
spec:
  type: {{ .Values.storeFront.serviceType }}
  ...

Voici un exemple du fichier values.yaml :

...
replicaCount: 1
...
storeFront:
  image:
    repository: "ghcr.io/azure-samples/aks-store-demo/store-front"
    tag: "latest"
  serviceType: LoadBalancer
...

Une fois que le moteur de modèles a appliqué les valeurs, le résultat final ressemble à cet exemple :

apiVersion: apps/v1
kind: Deployment
metadata:
  name: store-front
spec:
  replicas: 1
  ...
      containers:
      - name: store-front
        image: ghcr.io/azure-samples/aks-store-demo/store-front:latest
        ports:
---
apiVersion: v1
kind: Service
metadata:
  name: store-front
spec:
  type: LoadBalancer
  ...

Comment utiliser un référentiel Helm

Un référentiel Helm est un serveur HTTP dédié qui stocke des informations sur les charts Helm. Vous configurez les référentiels Helm avec le client Helm pour que celui-ci installe des charts à partir d’un référentiel à l’aide de la commande helm repo add.

Par exemple, vous pouvez ajouter le référentiel Helm de la Place de marché Azure à votre client Helm local en exécutant la commande suivante :

helm repo add azure-marketplace https://marketplace.azurecr.io/helm/v1/repo

Les informations sur les charts disponibles dans un référentiel sont mises en cache sur l’hôte client. Vous devez régulièrement mettre à jour le cache pour extraire les dernières informations du référentiel en utilisant la commande helm repo update.

La commande helm search repo permet de rechercher des charts dans tous les référentiels Helm ajoutés localement. Vous pouvez exécuter la commande helm search repo seule pour retourner une liste de tous les charts Helm connus dans chaque référentiel ajouté. Les résultats indiquent le nom et la version de chaque chart, ainsi que la version de l’application déployée par le chart, comme illustré dans l’exemple de sortie suivant :

NAME                               CHART VERSION   APP VERSION   DESCRIPTION
azure-marketplace/airflow          11.0.8          2.1.4         Apache Airflow is a platform to programmaticall...
azure-marketplace/apache           8.8.3           2.4.50        Chart for Apache HTTP Server
azure-marketplace/aspnet-core      1.3.18          3.1.19        ASP.NET Core is an open-source framework create...
azure-marketplace/bitnami-common   0.0.7           0.0.7         Chart with custom tempaltes used in Bitnami cha...
azure-marketplace/cassandra        8.0.5           4.0.1         Apache Cassandra is a free and open-source dist...

Vous pouvez rechercher un chart spécifique en ajoutant un terme de recherche à la commande helm search repo. Par exemple, si vous recherchez un chart basé sur ASP.NET, vous pouvez utiliser la commande suivante :

helm search repo aspnet

Dans cet exemple, le client local a deux référentiels inscrits et retourne un résultat pour chacun d’eux, comme illustré dans l’exemple de sortie suivant :

NAME                            CHART VERSION   APP VERSION   DESCRIPTION                                       
azure-marketplace/aspnet-core   1.3.18          3.1.19        ASP.NET Core is an open-source framework create...
bitnami/aspnet-core             1.3.18          3.1.19        ASP.NET Core is an open-source framework create...

Comment tester un chart Helm

Helm fournit une option qui permet de générer les fichiers manifestes créés par le moteur de modèles à partir du chart. Cette fonctionnalité vous permet de tester le chart avant le déploiement d’une version, en combinant deux paramètres supplémentaires : --dry-run et debug. Le paramètre --dry-run s’assure que l’installation est simulée et le paramètre --debug active la sortie détaillée.

helm install --debug --dry-run my-release ./chart-name

La commande affiche des informations sur les valeurs utilisées et tous les fichiers générés. Vous devrez peut-être faire défiler la sortie générée pour la voir dans sa totalité.

Comment installer un chart Helm

Vous utilisez la commande helm install pour installer un chart. Vous pouvez installer un chart Helm à partir de l’un des emplacements suivants :

  • Dossiers de chart
  • Charts compressés dans une archive tar .tgz
  • Des référentiels Helm

Toutefois, les paramètres requis varient en fonction de l’emplacement du chart. Dans tous les cas, avec la commande install, vous devez spécifier le nom du chart à installer et un nom pour la version que l’installation crée.

Vous pouvez installer un chart local à l’aide d’un dossier de fichiers de charts décompressés ou d’une archive tar .tgz compressée. Pour installer un chart, la commande helm référence le système de fichiers local pour l’emplacement du chart. Voici un exemple de la commande install qui déploiera une version d’un chart non compressé :

helm install my-release ./chart-name

Dans l’exemple précédent, le paramètre my-release est le nom de la version et le paramètre ./chart-name est le nom du package de chart décompressé.

Un chart compressé est installé en référençant le nom de fichier du chart compressé. L’exemple suivant montre la syntaxe pour la même application qui est maintenant compressée dans une archive tar :

helm install my-release ./chart-name.tgz

Quand vous installez un chart à partir d’un référentiel Helm, vous utilisez une référence du chart comme nom du chart. La référence du chart comporte deux paramètres, à savoir le nom du référentiel et le nom du chart, comme illustré dans l’exemple suivant :

helm install my-release repository-name/chart-name

Dans l’exemple, le paramètre repository-name/chart-name contient la référence du référentiel, repository-name, et le nom du chart, chart-name.