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
| Mot | Ce que ça veut dire | Exemple |
|---|---|---|
| Service | un nom et une adresse stables devant des pods | |
| Sélecteur | les étiquettes qui désignent les pods du Service | app=rayon |
| Port du Service | le port où l’on appelle le Service | |
| Port cible | le port où écoute le programme du pod | |
| DNS du cluster | le service qui transforme un nom en adresse | |
| Point de terminaison | l’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
kubectl create namespace librairieAffiché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
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
kubectl rollout status deployment/rayon -n librairie --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.
Créer le Service du rayon
kubectl expose deployment rayon --port=8000 --target-port=9090 -n librairieAffiché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
| Étape | Qui | Port |
|---|---|---|
| Un programme appelle | Le nom rayon | 8000 |
| Le Service transmet | Un des deux pods choisis | 9090 |
| Le pod répond | La 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
kubectl get endpointslices -n librairie -l kubernetes.io/service-name=rayon -o jsonpath='{.items[0].endpoints[*].addresses[0]}' | wc -wAffiché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
kubectl run client -n librairie --rm -i --restart=Never --image=busybox:1.37.0 -- wget -qO- http://rayon:8000Affiché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
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
kubectl get endpointslices -n librairie -l kubernetes.io/service-name=rayon -o jsonpath='{.items[0].endpoints[*].addresses[0]}' | wc -wAffiché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
kubectl run client -n librairie --rm -i --restart=Never --image=busybox:1.37.0 -- wget -qO- -T 5 http://rayon:8000Affiché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
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
kubectl run client -n librairie --rm -i --restart=Never --image=busybox:1.37.0 -- cat /etc/resolv.confAffiché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
kubectl run client -n default --rm -i --restart=Never --image=busybox:1.37.0 -- wget -qO- -T 5 http://rayon:8000Affiché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 écrit | Depuis l’espace librairie | Depuis l’espace default |
|---|---|---|
| rayon | Marche | Échoue : bad address |
| rayon.librairie | Marche | Marche |
| rayon.librairie.svc.cluster.local | Marche | Marche |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Supprimer l’espace librairie
kubectl delete namespace librairieAffiché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.