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

Service Kubernetes et DNS du cluster

Après cette leçon: Je peux donner un nom à des pods avec un Service et le joindre depuis un autre pod.

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

Donner un nom stable à des pods

Un Service Kubernetes donne un nom et une adresse qui ne changent pas à un groupe de pods. Le DNS du cluster permet ensuite de les joindre par ce nom, depuis n’importe quel autre pod.

Dans une librairie en ligne, le programme de paiement doit appeler le catalogue. Les pods du catalogue sont remplacés, et leurs adresses changent. Le paiement n’a pas à le savoir : il appelle « catalogue ».

À la fin de cette leçon

Remarque

Je peux donner un nom à des pods avec un Service et le joindre depuis un autre pod.

Mots-clés

MotCe que ça veut direExemple
Serviceun nom et une adresse stables devant des pods
Sélecteurles étiquettes qui désignent les pods du Serviceapp=rayon
Port du Servicele port où l’on appelle le Service
Port ciblele port où écoute le programme du pod
DNS du clusterle service qui transforme un nom en adresse
Point de terminaisonl’adresse d’un pod derrière le Service

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

Pourquoi les pods ont besoin d’un Service

Chaque pod reçoit sa propre adresse. Quand un Deployment remplace un pod, la nouvelle copie reçoit une autre adresse. Un programme qui aurait noté l’ancienne adresse ne trouverait plus rien.

Un Service règle cela. Il a une adresse fixe et un nom, et il envoie chaque appel vers l’un des pods qui portent les bonnes étiquettes. Les quatre Runs suivants préparent un petit site : un espace, deux pods qui servent une page, et un Service.

Créer l’espace librairie

Commande
kubectl create namespace librairie

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.

Lancer deux pods qui servent une page

Commande
kubectl create deployment rayon --image=busybox:1.37.0 --replicas=2 -n librairie -- sh -c 'mkdir -p /w; echo "Rayon polars" > /w/index.html; exec httpd -f -p 9090 -h /w'

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 deux pods

Commande
kubectl rollout status deployment/rayon -n librairie --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.

Créer le Service du rayon

Commande
kubectl expose deployment rayon --port=8000 --target-port=9090 -n librairie

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.

Le port du Service et le port cible

Le premier Run affiche namespace/librairie created, le dernier service/rayon exposed. Les pods servent leur page sur le port 9090 : c’est le port cible. Le Service, lui, répond sur le port 8000 : c’est le port du Service, celui que les autres programmes appellent.

Le Service reçoit un appel sur 8000 et le transmet au port 9090 d’un pod.

Exemple travaillé : de l’appel au pod

ÉtapeQuiPort
Un programme appelleLe nom rayon8000
Le Service transmetUn des deux pods choisis9090
Le pod répondLa page « Rayon polars »9090

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

Le sélecteur désigne les pods du Service

Le sélecteur est la liste d’étiquettes qui dit quels pods sont derrière le Service. Ici : app=rayon. Chaque pod choisi donne un point de terminaison, et le Service ne transmet qu’à eux.

Les deux Runs suivants comptent ces points de terminaison : deux. Ils appellent ensuite le Service depuis un pod client éphémère, qui affiche la page Rayon polars et se supprime.

Compter les points de terminaison

Commande
kubectl get endpointslices -n librairie -l kubernetes.io/service-name=rayon -o jsonpath='{.items[0].endpoints[*].addresses[0]}' | wc -w

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.

Appeler le Service par son nom

Commande
kubectl run client -n librairie --rm -i --restart=Never --image=busybox:1.37.0 -- wget -qO- http://rayon:8000

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.

Casser le sélecteur pour voir

Les quatre Runs suivants cassent le Service exprès, puis le réparent. Le premier met une étiquette qui n’existe sur aucun pod : il affiche service/rayon patched. Le deuxième compte alors zéro point de terminaison.

Le troisième appelle le Service : le nom est trouvé, mais personne ne répond, et le message finit par Connection refused. Le dernier remet la bonne étiquette.

Changer le sélecteur pour une étiquette inconnue

Commande
kubectl patch service rayon -n librairie -p '{"spec":{"selector":{"app":"inconnu"}}}'

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.

Compter de nouveau les points de terminaison

Commande
kubectl get endpointslices -n librairie -l kubernetes.io/service-name=rayon -o jsonpath='{.items[0].endpoints[*].addresses[0]}' | wc -w

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.

Appeler un Service sans pod

Commande
kubectl run client -n librairie --rm -i --restart=Never --image=busybox:1.37.0 -- wget -qO- -T 5 http://rayon:8000

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.

Remettre le bon sélecteur

Commande
kubectl patch service rayon -n librairie -p '{"spec":{"selector":{"app":"rayon"}}}'

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.

Erreur fréquente

Attention

Beaucoup pensent qu’un Service qui existe suffit pour qu’il marche. Si son sélecteur ne correspond à aucun pod, il n’a aucun point de terminaison, et chaque appel est refusé. Quand un Service ne répond pas, comparez d’abord son sélecteur aux étiquettes des pods.

Le DNS du cluster trouve l’adresse

Le cluster a son propre DNS : un petit service qui connaît le nom de chaque Service. Le nom complet est service.espace.svc.cluster.local, ici rayon.librairie.svc.cluster.local.

Un pod peut écrire un nom plus court, grâce à la ligne search de son fichier /etc/resolv.conf. Le Run suivant l’affiche : elle commence par l’espace du pod lui-même.

Lire la recherche DNS d’un pod

Commande
kubectl run client -n librairie --rm -i --restart=Never --image=busybox:1.37.0 -- cat /etc/resolv.conf

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.

Appeler le nom court depuis un autre espace

Commande
kubectl run client -n default --rm -i --restart=Never --image=busybox:1.37.0 -- wget -qO- -T 5 http://rayon:8000

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é : quel nom depuis quel espace

Nom écritDepuis l’espace librairieDepuis l’espace default
rayonMarcheÉchoue : bad address
rayon.librairieMarcheMarche
rayon.librairie.svc.cluster.localMarcheMarche

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

Supprimer l’espace librairie

Commande
kubectl delete namespace librairie

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.