DevOps

Schéma réseau Kubernetes : pods, services, ingress et gateways

Le plus difficile dans Kubernetes, ce n'est pas le YAML ; c'est de garder en tête le modèle mental de la façon dont une requête atteint réellement un conteneur. Un schéma réseau Kubernetes, qui montre ces objets, rend tout limpide. Voici comment dessiner celui qui compte.

Si Kubernetes donne du fil à retordre, ce n'est pas parce que le YAML est difficile à taper. C'est parce qu'il existe une chaîne invisible d'objets entre « une requête arrive » et « un conteneur la traite », et que rien de tout cela ne se trouve au même endroit. Un Pod exécute le code, mais on ne dirige jamais le trafic vers un Pod. Un Service lui donne un nom stable, mais un Service ne termine pas le TLS. Un Ingress ou une Gateway gère le monde extérieur, mais transmet à un Service, qui sélectionne des Pods, qui peuvent bouger à tout moment. Ratez un maillon et plus rien ne fonctionne, et le message d'erreur indique rarement lequel.

Un diagramme de cette chaîne vaut plus que n'importe quelle relecture des manifestes. Construisons le modèle mental objet par objet, puis dessinons-le.

Pods : là où le code s'exécute réellement

Un Pod est un ou plusieurs conteneurs planifiés ensemble et partageant une identité réseau. C'est l'unité qui exécute votre processus. Le fait essentiel pour un diagramme : les Pods sont du bétail, pas des animaux de compagnie. Ils sont créés et détruits en permanence, leurs IP changent, et vous ne devriez jamais dépendre de l'un d'eux en particulier. C'est précisément pour cela que tout ce qui se trouve au-dessus existe : offrir quelque chose de stable vers quoi pointer.

Services : un nom stable devant des Pods qui bougent

Un Service est une adresse virtuelle stable et une règle de répartition de charge. Il utilise un sélecteur de labels pour trouver les Pods qui le servent, et répartit le trafic entre ceux qui existent à cet instant. Quand un Pod meurt et qu'un nouveau démarre, le Service se met à jour discrètement ; les appelants ne remarquent rien. Dans votre diagramme, le Service est la boîte à laquelle les autres éléments se connectent, avec une répartition implicite vers un ensemble changeant de Pods derrière lui.

dehors client Ingress /Gateway Service Pod Pod Pod …
La chaîne de la requête : du client à l'Ingress ou à la Gateway, puis à un Service, qui répartit vers les Pods existant à cet instant.

Ingress Kubernetes et Gateway : la porte vers l'extérieur

Un Service seul ne vous expose pas au monde de manière utile. C'est le rôle d'un Ingress ou, dans le modèle plus récent, d'une Gateway. Cette couche gère le routage par hôte et par chemin, la terminaison TLS et les règles qui disent « les requêtes pour cet hôte et ce chemin vont à ce Service ». La Gateway API généralise l'ancien Ingress avec une séparation plus nette des responsabilités (qui possède la gateway et qui possède les routes), mais la forme dans un diagramme reste la même : c'est la boîte en bordure que tout ce qui vient de l'extérieur atteint en premier, et qui transmet aux Services selon des règles.

Dessinez la chaîne une fois et les erreurs commencent à s'expliquer d'elles-mêmes : un sélecteur cassé, une route manquante, un Service qui ne pointe vers rien.

Pourquoi la dessiner vaut mieux que la relire

Quand quelque chose est injoignable, le diagramme devient une checklist. La règle d'Ingress pointe-t-elle vers le bon Service ? Le sélecteur du Service correspond-il aux labels des Pods ? Y a-t-il seulement des Pods ? Chaque maillon de l'image est un point qui peut être faux, et les voir disposés transforme un vague « ça ne marche pas » en un précis « le sélecteur ne correspond pas ». C'est la différence entre déboguer et deviner.

Laissez les manifestes le dessiner

Vous n'avez pas à placer ces boîtes à la main. Vos manifestes encodent déjà toute la chaîne : l'Ingress nomme son Service, le Service porte son sélecteur, le Deployment appose les labels sur ses Pods. Collez le YAML et les relations sont dessinées pour vous, regroupées par namespace, pour que l'image corresponde au cluster et non à vos suppositions à son sujet.

Astuce. Générez le diagramme à partir des mêmes manifestes que vous appliquez, et régénérez-le après chaque modification. Une image issue de la source de vérité est la seule qui reste fiable dans un système qui se replanifie en permanence.

Puis annotez pour les humains

Une fois les objets sur le canevas, faites en sorte que l'image enseigne. Colorez la bordure externe, regroupez par namespace, indiquez où le TLS est terminé et notez quel Service est sous charge. Un nouvel ingénieur devrait pouvoir suivre du doigt une requête depuis internet jusqu'à un conteneur, sans ouvrir un seul fichier YAML. C'est ce diagramme-là qui vaut la peine d'être conservé.

Collez vos manifestes, voyez les pods, services, ingress et gateways se connecter, et gardez enfin en tête tout le chemin de la requête d'un seul coup.

Voyez comment votre cluster est réellement connecté

Collez vos manifestes Kubernetes et obtenez un diagramme du chemin des requêtes, regroupé par namespace et prêt à être annoté.

Ouvrir LetDraw, gratuit