Plus facile à lire avec un fond crème, une teinte, plus de contraste ou un texte plus grand ? Choisissez vos couleurs et votre texte, une fois pour toutes les pages.

Leçon gratuite

Une application complète sur Kubernetes

Après cette leçon: Je peux faire tourner une petite application avec un Deployment, un Service et une ConfigMap ensemble.

Leçon de 60 min14 commandesLab Kubernetes : un cluster k3s à un nœud pour chaque élève, sur une VM Ubuntu privée

Trois objets pour une application

Une application Kubernetes réunit au moins trois objets. Un Deployment garde les pods, un Service les nomme et une ConfigMap porte les réglages. Savoir les assembler, c’est savoir ce que veut dire « déployer une application ».

Prenez le stand de fruits d’un marché en ligne : le fruit du jour et son prix se changent chaque matin, sans toucher au programme.

À la fin de cette leçon

Remarque

Je peux faire tourner une petite application avec un Deployment, un Service et une ConfigMap ensemble.

Mots-clés

MotCe que ça veut direExemple
Applicationplusieurs objets qui travaillent ensemble
Objetune chose que Kubernetes gèreService
Manifesteun fichier qui décrit des objetsfruits.yaml
Dépendanceun objet qui ne marche que si un autre existe
Rolloutle remplacement des anciens pods par de nouveaux

Les cellules que les étudiants remplissent restent vides dans cet aperçu.

Chaque objet fait une seule chose

Dans l’application, la ConfigMap etal garde le fruit et le prix. Le Deployment fruits lance deux pods qui lisent ces réglages et servent une page. Le Service fruits donne un nom à ces deux pods.

Les six Runs suivants créent les trois objets, dans cet ordre : la ConfigMap d’abord, puisque le Deployment en dépend.

Créer l’espace marche

Commande
kubectl create namespace marche

Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.

Créer la ConfigMap etal

Commande
kubectl create configmap etal -n marche --from-literal=FRUIT=pommes --from-literal=PRIX=3

Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.

Créer le Deployment fruits

Commande
kubectl create deployment fruits --image=busybox:1.37.0 --replicas=2 -n marche -- sh -c 'mkdir -p /w; echo "$FRUIT à $PRIX euros le kilo, servi par $HOSTNAME" > /w/index.html; trap "exit 0" TERM; httpd -f -p 9090 -h /w & wait'

Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.

Brancher la ConfigMap sur le Deployment

Commande
kubectl set env deployment/fruits -n marche --from=configmap/etal

Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.

Créer le Service fruits

Commande
kubectl expose deployment fruits --port=8000 --target-port=9090 -n marche

Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.

Attendre que les deux pods soient prêts

Commande
kubectl rollout status deployment/fruits -n marche --timeout=90s

Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.

Lister les objets de l’espace

Commande
kubectl get deployment,service,configmap -n marche -o name

Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.

Quatre objets, dont un inattendu

La liste montre deployment.apps/fruits, service/fruits et configmap/etal. Elle montre aussi configmap/kube-root-ca.crt : Kubernetes la crée dans tout espace de noms.

Le set env a changé le modèle de pod, donc le Deployment a remplacé ses pods : le rollout attend la fin de ce remplacement. Le sélecteur du Service est app=fruits, l’étiquette que kubectl create deployment a posée sur les pods.

Lire la page par le nom du Service

Commande
kubectl run client -n marche --rm -i --restart=Never --image=busybox:1.37.0 -- sh -c 'wget -qO- http://fruits:8000 | cut -d, -f1'

Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.

Changer le stand sans toucher au programme

Le Run précédent affiche pommes à 3 euros le kilo : le nom du pod, après la virgule, est coupé, car il change à chaque fois.

Pour passer aux poires à 4 euros, on change la ConfigMap, puis on remplace les pods : un pod ne relit ses réglages qu’à son démarrage. Les quatre Runs suivants font ce changement et relisent la page. Juste après un remplacement, le premier appel peut échouer avec No route to host : relancez-le quelques secondes plus tard.

Changer le fruit et le prix

Commande
kubectl patch configmap etal -n marche -p '{"data":{"FRUIT":"poires","PRIX":"4"}}'

Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.

Remplacer les pods

Commande
kubectl rollout restart deployment/fruits -n marche

Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.

Attendre les nouveaux pods

Commande
kubectl rollout status deployment/fruits -n marche --timeout=90s

Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.

Relire la page

Commande
kubectl run client -n marche --rm -i --restart=Never --image=busybox:1.37.0 -- sh -c 'wget -qO- http://fruits:8000 | cut -d, -f1'

Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.

Un manifeste décrit les mêmes objets

Dans un vrai projet, on écrit un manifeste : un fichier YAML qui décrit les objets. La commande kubectl apply -f le met en place. Les deux blocs suivants sont des exemples de lecture, pas des Runs : ce sont les trois objets de la leçon, écrits en fichier.

Les mots en commun sont les liens entre les objets.

Le Deployment, écrit en fichier

Code: bash
apiVersion: apps/v1
kind: Deployment
metadata:
  name: fruits
spec:
  replicas: 2
  selector:
    matchLabels:
      app: fruits
  template:
    metadata:
      labels:
        app: fruits
    spec:
      containers:
        - name: fruits
          image: busybox:1.37.0
          ports:
            - containerPort: 9090
          env:
            - name: FRUIT
              valueFrom:
                configMapKeyRef:
                  name: etal
                  key: FRUIT

Le Service et la ConfigMap, écrits en fichier

Code: bash
apiVersion: v1
kind: Service
metadata:
  name: fruits
spec:
  selector:
    app: fruits
  ports:
    - port: 8000
      targetPort: 9090
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: etal
data:
  FRUIT: pommes
  PRIX: "3"

Faire refuser un manifeste incohérent

Commande
echo '{"apiVersion":"apps/v1","kind":"Deployment","metadata":{"name":"verifie"},"spec":{"selector":{"matchLabels":{"app":"autre"}},"template":{"metadata":{"labels":{"app":"fruits"}},"spec":{"containers":[{"name":"c","image":"busybox:1.37.0"}]}}}}' | kubectl apply -n marche --dry-run=server -f -

Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.

Exemple travaillé : les liens à vérifier

LienDoit être égal àSinon
selector.matchLabels du DeploymentLes étiquettes du modèle de podKubernetes refuse le Deployment
Le sélecteur du ServiceLes mêmes étiquettesLe Service n’a aucun point de terminaison
targetPort du ServiceLe containerPort du conteneurLe Service transmet à un port où personne n’écoute
Le nom dans configMapKeyRefLe nom de la ConfigMapLe pod ne reçoit pas le réglage
La clé dans configMapKeyRefUne clé de dataLe pod ne reçoit pas le réglage

Les cellules que les étudiants remplissent restent vides dans cet aperçu.

Erreur fréquente

Attention

Beaucoup pensent qu’une application qui ne marche pas a un objet en panne. Souvent, chaque objet va bien : c’est un lien entre deux objets qui est faux, un nom, une étiquette ou un port qui ne correspondent pas. Comparez les deux bouts du lien.

Supprimer l’espace marche

Commande
kubectl delete namespace marche

Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.

À propos de ce labo et de sa source: Lab Kubernetes : un cluster k3s à un nœud pour chaque élève, sur une VM Ubuntu privée

Vous enseignez à une classe ? Proposez ce module à vos étudiants avec un guide de l'enseignant, des devoirs corrigés et un laboratoire pour chaque étudiant.