Déployer un chart Helm local

KubernetesBeginner
Pratiquer maintenant

Introduction

Les précédents laboratoires de déploiement utilisaient directement des manifestes Kubernetes bruts. Helm ajoute une couche de packaging autour de ces manifestes. Un chart Helm regroupe des modèles Kubernetes associés, expose des paramètres réutilisables dans values.yaml et installe les objets générés sous forme de release nommée.

Dans ce laboratoire, vous allez créer un petit chart local au lieu d'en télécharger un depuis un dépôt. Vous rédigerez les métadonnées du chart, les valeurs, le modèle de Deployment et le modèle de Service. Vous générerez le chart avant de l'installer, puis vous mettrez à jour la release en modifiant les valeurs. Cela permet de se concentrer sur la compétence CKAD clé : comprendre comment un chart local se transforme en objets Kubernetes ordinaires.

Préparer un espace de travail Helm

Dans cette étape, vous allez préparer un namespace et confirmer que les outils nécessaires au flux de travail d'un chart Helm local sont présents.

Commencez dans /home/labex/project. Ce laboratoire conserve le répertoire du chart, les manifestes générés et toutes les commandes dans cet espace de travail.

mkdir -p /home/labex/project
cd /home/labex/project

Vérifiez que l'API server de Kubernetes est accessible. Si la machine virtuelle vient de démarrer et que le nœud n'est pas encore prêt, attendez quelques secondes et relancez la commande.

kubectl get nodes --request-timeout=5s

La sortie attendue inclut :

NAME         STATUS   ROLES           AGE   VERSION
labex-v135   Ready    control-plane   ...   v1.35...

Attendez que le Pod réseau du cluster soit prêt. Le chart créera un Service, les Pods de l'application ont donc besoin du réseau du cluster pour que les tests de trafic soient pertinents.

kubectl wait --namespace kube-system --for=condition=Ready pod -l k8s-app=calico-node --timeout=120s

Sortie attendue :

pod/calico-node-... condition met

Créez un namespace nommé ckad-prep-helm et définissez-le comme namespace par défaut :

kubectl create namespace ckad-prep-helm
kubectl config set-context --current --namespace=ckad-prep-helm

Confirmez le namespace actuel et la version du client Helm. Helm 3 fonctionne directement avec Kubernetes en utilisant votre kubeconfig actuel ; il n'y a pas de composant Tiller côté serveur.

kubectl config view --minify --output 'jsonpath={..namespace}'; echo
helm version --short

La sortie attendue inclut :

ckad-prep-helm
v...

Créer et générer un chart local

Dans cette étape, vous allez créer un chart Helm local minimal et le générer avant d'installer quoi que ce soit.

Un répertoire de chart comporte quelques parties importantes. Chart.yaml décrit le chart lui-même. values.yaml contient les paramètres par défaut. Les fichiers sous templates/ sont des manifestes Kubernetes contenant des expressions de modèle telles que {{ .Values.replicaCount }}. Helm remplace ces expressions par des valeurs concrètes lors de la génération ou de l'installation du chart.

Créez le répertoire du chart :

mkdir -p local-web-chart/templates

Créez Chart.yaml. Le nom du chart n'est pas le même que le nom de la release ; le nom de la release est choisi ultérieurement lors de l'installation du chart.

cat > local-web-chart/Chart.yaml <<'EOF'
apiVersion: v2
name: local-web
description: A small local chart for CKAD deployment practice
type: application
version: 0.1.0
appVersion: "1.0"
EOF

Créez values.yaml. Ces valeurs par défaut contrôlent le nombre de Pods, l'image du conteneur, les ports du Service et le message servi par l'application.

cat > local-web-chart/values.yaml <<'EOF'
replicaCount: 2
image:
  repository: busybox
  tag: "1.36"
service:
  port: 80
  targetPort: 8080
message: helm-v1
EOF

Créez le modèle de Deployment. Le modèle utilise le nom de la release dans les noms d'objets et les labels, afin que le même chart puisse être installé sous différents noms de release.

cat > local-web-chart/templates/deployment.yaml <<'EOF'
apiVersion: apps/v1
kind: Deployment
metadata:
  name: {{ .Release.Name }}-web
  labels:
    app.kubernetes.io/name: {{ .Chart.Name }}
    app.kubernetes.io/instance: {{ .Release.Name }}
spec:
  replicas: {{ .Values.replicaCount }}
  selector:
    matchLabels:
      app.kubernetes.io/name: {{ .Chart.Name }}
      app.kubernetes.io/instance: {{ .Release.Name }}
  template:
    metadata:
      labels:
        app.kubernetes.io/name: {{ .Chart.Name }}
        app.kubernetes.io/instance: {{ .Release.Name }}
    spec:
      terminationGracePeriodSeconds: 0
      containers:
      - name: web
        image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
        imagePullPolicy: IfNotPresent
        command:
        - /bin/sh
        - -c
        - |
          mkdir -p /www
          echo {{ .Values.message | quote }} > /www/index.html
          httpd -f -p {{ .Values.service.targetPort }} -h /www
        ports:
        - containerPort: {{ .Values.service.targetPort }}
        readinessProbe:
          httpGet:
            path: /
            port: {{ .Values.service.targetPort }}
          initialDelaySeconds: 1
          periodSeconds: 2
EOF

Créez le modèle de Service. Notez que le sélecteur du Service utilise les mêmes labels que le modèle de Pod.

cat > local-web-chart/templates/service.yaml <<'EOF'
apiVersion: v1
kind: Service
metadata:
  name: {{ .Release.Name }}
  labels:
    app.kubernetes.io/name: {{ .Chart.Name }}
    app.kubernetes.io/instance: {{ .Release.Name }}
spec:
  selector:
    app.kubernetes.io/name: {{ .Chart.Name }}
    app.kubernetes.io/instance: {{ .Release.Name }}
  ports:
  - port: {{ .Values.service.port }}
    targetPort: {{ .Values.service.targetPort }}
EOF

Exécutez helm lint pour détecter les problèmes de structure du chart et de modèles :

helm lint ./local-web-chart

La sortie attendue inclut :

1 chart(s) linted, 0 chart(s) failed

Générez le chart localement. helm template affiche le YAML Kubernetes que Helm enverrait à l'API server, mais ne crée aucun objet.

helm template local-web ./local-web-chart | sed -n '1,120p'

La sortie attendue inclut un Service nommé local-web et un Deployment nommé local-web-web.

Installer le chart en tant que release

Dans cette étape, vous allez installer le chart local dans le namespace ckad-prep-helm.

L'installation d'un chart crée une release Helm. Le nom de la release est local-web dans ce laboratoire. Helm enregistre les métadonnées de la release et Kubernetes reçoit des objets ordinaires tels qu'un Deployment et un Service.

Installez le chart :

helm install local-web ./local-web-chart

La sortie attendue inclut :

NAME: local-web
STATUS: deployed

Attendez le déploiement créé par le chart :

kubectl rollout status deployment/local-web-web --timeout=120s

Sortie attendue :

deployment "local-web-web" successfully rolled out

Inspectez la release et les objets Kubernetes qu'elle a créés :

helm list
kubectl get deployment,service -l app.kubernetes.io/instance=local-web

La sortie attendue inclut :

local-web
deployment.apps/local-web-web
service/local-web

Créez un Pod client et envoyez une requête au Service. Cela confirme que le chart n'a pas seulement créé des objets, mais que l'application installée est réellement accessible.

kubectl run chart-client --image=busybox:1.36 --restart=Never --command -- sleep 3600
kubectl wait --for=condition=Ready pod/chart-client --timeout=120s
kubectl exec chart-client -- wget -qO- http://local-web

Sortie attendue :

helm-v1

Mettre à jour la release avec de nouvelles valeurs

Dans cette étape, vous allez mettre à jour la release existante en remplaçant les valeurs du chart.

Le chart contient déjà des modèles réutilisables. Vous n'avez pas besoin de modifier les fichiers de modèle pour changer le message ou le nombre de réplicas. helm upgrade génère à nouveau le même chart avec de nouvelles valeurs, met à jour les objets Kubernetes et enregistre une nouvelle révision de la release.

Mettez à jour la release pour qu'elle serve helm-v2 avec trois réplicas :

helm upgrade local-web ./local-web-chart --set message=helm-v2 --set replicaCount=3

La sortie attendue inclut :

Release "local-web" has been upgraded.
STATUS: deployed

Attendez le déploiement mis à jour :

kubectl rollout status deployment/local-web-web --timeout=120s

Sortie attendue :

deployment "local-web-web" successfully rolled out

Inspectez l'historique de la release et les valeurs actuellement stockées avec celle-ci :

helm history local-web
helm get values local-web

La sortie attendue inclut deux révisions et les valeurs remplacées :

REVISION
1
2
message: helm-v2
replicaCount: 3

Vérifiez le Deployment en cours d'exécution et la réponse de l'application :

kubectl get deployment local-web-web
kubectl exec chart-client -- wget -qO- http://local-web

La sortie attendue inclut :

3/3
helm-v2

Résumé

Vous avez créé un chart Helm local à partir de métadonnées, de valeurs par défaut et de modèles Kubernetes. Vous avez généré le chart avant de l'installer, vous l'avez installé en tant que release, testé le Service et mis à jour la release en remplaçant les valeurs. L'idée clé est que Helm permet de packager des déploiements d'applications répétables tout en produisant des objets Kubernetes ordinaires que vous pouvez inspecter avec kubectl.