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
| Mot | Ce que ça veut dire | Exemple |
|---|---|---|
| Application | plusieurs objets qui travaillent ensemble | |
| Objet | une chose que Kubernetes gère | Service |
| Manifeste | un fichier qui décrit des objets | fruits.yaml |
| Dépendance | un objet qui ne marche que si un autre existe | |
| Rollout | le 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
kubectl create namespace marcheAffiché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
kubectl create configmap etal -n marche --from-literal=FRUIT=pommes --from-literal=PRIX=3Affiché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
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
kubectl set env deployment/fruits -n marche --from=configmap/etalAffiché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
kubectl expose deployment fruits --port=8000 --target-port=9090 -n marcheAffiché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
kubectl rollout status deployment/fruits -n marche --timeout=90sAffiché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
kubectl get deployment,service,configmap -n marche -o nameAffiché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
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
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
kubectl rollout restart deployment/fruits -n marcheAffiché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
kubectl rollout status deployment/fruits -n marche --timeout=90sAffiché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
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
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
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
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
| Lien | Doit être égal à | Sinon |
|---|---|---|
| selector.matchLabels du Deployment | Les étiquettes du modèle de pod | Kubernetes refuse le Deployment |
| Le sélecteur du Service | Les mêmes étiquettes | Le Service n’a aucun point de terminaison |
| targetPort du Service | Le containerPort du conteneur | Le Service transmet à un port où personne n’écoute |
| Le nom dans configMapKeyRef | Le nom de la ConfigMap | Le pod ne reçoit pas le réglage |
| La clé dans configMapKeyRef | Une clé de data | Le 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
kubectl delete namespace marcheAffiché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.