Le matĂ©riel, dont nous publions la traduction aujourd'hui, est consacrĂ© aux caractĂ©ristiques de l'interaction rĂ©seau des foyers Kubernetes. Il est destinĂ© Ă ceux qui ont dĂ©jĂ une certaine expĂ©rience avec Kubernetes. Si vous n'ĂȘtes pas trĂšs familier avec Kubernetes, alors cela vaut probablement la peine de lire ce tutoriel Kubernetes avant de lire ce matĂ©riel, oĂč travailler avec cette plate-forme est envisagĂ© pour les dĂ©butants.

Pods
Qu'est-ce que sous (pod) Kubernetes? Sub est une entitĂ© qui se compose d'un ou plusieurs conteneurs hĂ©bergĂ©s sur le mĂȘme hĂŽte et configurĂ©s pour partager des ressources de pile rĂ©seau et d'autres ressources comme des volumes. Les pods sont les blocs de construction de base qui composent les applications qui s'exĂ©cutent sur la plate-forme Kubernetes. Les pods partagent une pile rĂ©seau. En pratique, cela signifie que tous les conteneurs qui composent le foyer peuvent communiquer entre eux via l'
localhost
. S'il y a un conteneur dans l'Ăątre qui exĂ©cute nginx, Ă l'Ă©coute sur le port 80 et un autre conteneur qui exĂ©cute scrapyd, ce conteneur peut accĂ©der au premier conteneur Ă
http://localhost:80
. Ăa n'a pas l'air si difficile. Demandons-nous maintenant comment cela fonctionne rĂ©ellement. Jetons un coup d'Ćil Ă une situation typique lorsque le conteneur Docker est lancĂ© sur la machine locale.
Conteneur Docker exécuté sur une machine localeSi vous regardez ce schéma de haut en bas, il s'avÚre qu'il existe une interface réseau physique
eth0
. Le pont
docker0
est
docker0
et l'interface réseau virtuelle
docker0
est
veth0
au pont. Notez que les
veth0
docker0
et
veth0
sont sur le mĂȘme rĂ©seau, dans cet exemple, c'est
172.17.0.0/24
. Sur ce réseau, l'interface
docker0
attribuer l'adresse IP
172.17.0.1
, cette interface est la
passerelle par défaut pour l'interface
veth0
, à laquelle est attribuée l'adresse
172.17.0.2
. En raison des particularités de la configuration des espaces de noms réseau lors du démarrage du conteneur, les processus à l'intérieur du conteneur ne voient que l'interface
veth0
et interagissent avec le monde extérieur via les interfaces
docker0
et
eth0
. Exécutez maintenant le deuxiÚme conteneur.
Deux conteneurs Docker exécutés sur la machine localeComme vous pouvez le voir dans le diagramme ci-dessus, la nouvelle interface réseau virtuelle
veth1
est affectĂ©e au deuxiĂšme conteneur, qui est connectĂ© au mĂȘme pont que le premier conteneur - Ă
docker0
. Il s'agit d'une description assez concise de ce qui se passe rĂ©ellement. De plus, il convient de noter que la connexion entre le conteneur et le pont est Ă©tablie grĂące Ă une paire d'interfaces Ethernet virtuelles connectĂ©es, dont l'une se trouve dans l'espace de noms du conteneur et l'autre dans l'espace de noms du rĂ©seau racine. Des dĂ©tails Ă ce sujet peuvent ĂȘtre trouvĂ©s
ici .
Tout cela est bien, mais il ne décrit pas encore ce que nous, comme appliqué aux pods Kubernetes, appelons «pile réseau partagée». Heureusement, les espaces de noms sont trÚs flexibles. Docker peut lancer un conteneur et au lieu de créer une nouvelle interface réseau virtuelle pour lui, faites-le utiliser l'interface existante avec d'autres conteneurs. Avec cette approche, nous devrons changer le schéma ci-dessus comme indiqué ci-dessous.
Les conteneurs utilisent une interface réseau communeMaintenant, le deuxiÚme conteneur interagit avec l'interface
veth0
déjà existante, et non avec sa propre interface
veth1
, comme c'Ă©tait le cas dans l'exemple prĂ©cĂ©dent. L'utilisation d'un tel schĂ©ma entraĂźne plusieurs consĂ©quences. Pour commencer, nous pouvons maintenant dire que les deux conteneurs sont visibles extĂ©rieurement Ă la mĂȘme adresse -
172.17.0.2
, et à l'intérieur de chacun d'eux peuvent accéder aux ports sur
localhost
ouvert par un autre conteneur. De plus, cela signifie que ces conteneurs ne peuvent pas ouvrir les mĂȘmes ports. Il s'agit bien sĂ»r d'une limitation, mais elle ne diffĂšre pas d'une limitation similaire dans la situation oĂč plusieurs processus ouvrent des ports sur le mĂȘme hĂŽte. Avec cette approche, un ensemble de processus obtient tous les avantages associĂ©s Ă l'exĂ©cution de ces processus dans des conteneurs, tels qu'une mauvaise connectivitĂ© et une mauvaise isolation, mais en mĂȘme temps, les processus peuvent organiser la collaboration dans le plus simple des environnements rĂ©seau existants.
Kubernetes met en Ćuvre ce modĂšle en crĂ©ant un conteneur spĂ©cial pour chaque foyer dont le seul but est de fournir une interface rĂ©seau pour d'autres conteneurs de foyer. Si vous vous connectez au nĆud du cluster Kubernetes auquel un sous-programme spĂ©cifique est affectĂ© par
ssh
et exécutez la
docker ps
, vous verrez au moins un conteneur s'exécuter avec la commande
pause
. Cette commande suspend le processus en cours jusqu'Ă ce qu'un signal
SIGTERM
arrive. De tels conteneurs ne font absolument rien, ils sont dans un Ă©tat "endormi" et attendent ce signal. Bien que les conteneurs «suspendus» ne fassent rien, ils sont, pour ainsi dire, le «cĆur» du foyer, fournissant Ă d'autres conteneurs une interface rĂ©seau virtuelle qu'ils peuvent utiliser pour interagir entre eux ou avec le monde extĂ©rieur. En consĂ©quence, il s'avĂšre que dans un environnement hypothĂ©tique ressemblant Ă ci-dessous, notre schĂ©ma prĂ©cĂ©dent ressemblerait Ă celui illustrĂ© ci-dessous.
Conteneurs hypothétiquesRéseau de foyer
Un sous, plein de conteneurs, est la pierre angulaire d'un certain systĂšme, mais jusqu'Ă prĂ©sent pas ce systĂšme lui-mĂȘme. L'architecture Kubernetes repose sur l'exigence selon laquelle les pods doivent pouvoir interagir avec d'autres pods, qu'ils s'exĂ©cutent sur le mĂȘme ordinateur ou sur des machines diffĂ©rentes. Afin d'apprendre comment tout cela fonctionne, nous devons aller Ă un niveau d'abstraction plus Ă©levĂ© et parler du fonctionnement des nĆuds dans le cluster Kubernetes. Ici, nous aborderons le sujet du routage et des itinĂ©raires rĂ©seau. Ce sujet est souvent Ă©vitĂ© dans des documents comme celui-ci, car il est trop complexe. Il n'est pas facile de trouver un guide comprĂ©hensible et pas trop long pour le routage IP, mais si vous voulez regarder un bref aperçu de ce problĂšme, vous pouvez jeter un Ćil Ă
ce matériel.
Le cluster Kubernetes comprend un ou plusieurs nĆuds. Un nĆud est un systĂšme hĂŽte, physique ou virtuel, qui contient divers outils logiciels et leurs dĂ©pendances (principalement Docker), ainsi que plusieurs composants systĂšme Kubernetes. Le nĆud est connectĂ© au rĂ©seau, ce qui lui permet d'Ă©changer des donnĂ©es avec d'autres nĆuds du cluster. Voici Ă quoi pourrait ressembler un cluster Ă deux nĆuds simple.
Un cluster simple Ă deux nĆudsSi le cluster en question s'exĂ©cute dans un environnement cloud comme GCP ou AWS, ce schĂ©ma transmet assez prĂ©cisĂ©ment l'essence de l'architecture de rĂ©seau par dĂ©faut pour les projets individuels. Ă des fins de dĂ©monstration, le rĂ©seau privĂ©
10.100.0.0/24
utilisé dans cet exemple. Par conséquent, l'adresse
10.100.0.1
attribuée au
10.100.0.1
et les adresses
10.100.0.2
et
10.100.0.3
deux nĆuds. En utilisant cette architecture, chacun des nĆuds peut interagir avec l'autre en utilisant son interface rĂ©seau
eth0
. Rappelons maintenant que under, exĂ©cutĂ© sur l'hĂŽte, n'est pas sur ce rĂ©seau privĂ©. Il est connectĂ© au pont dans un rĂ©seau complĂštement diffĂ©rent. Il s'agit d'un rĂ©seau virtuel qui n'existe que dans un nĆud spĂ©cifique. Afin de le rendre plus clair, redessinons le schĂ©ma prĂ©cĂ©dent, en y ajoutant ce que nous avons appelĂ© un foyer hypothĂ©tique ci-dessus.
Pods et nĆudsL'hĂŽte situĂ© Ă gauche de ce diagramme a une interface
eht0
avec l'adresse
10.100.0.2
, la passerelle par défaut pour laquelle est le routeur avec l'adresse
10.100.0.1
. Le pont
docker0
avec l'adresse
172.17.0.1
connecté à cette interface, et à lui, via l'interface virtuelle
veth0
avec l'adresse
172.17.0.2
, est connecté ce que nous appelons ici le foyer. L'interface
veth0
Ă©tĂ© créée dans un conteneur suspendu. Il est visible dans les trois conteneurs via une pile rĂ©seau partagĂ©e. Ătant donnĂ© que les rĂšgles de routage locales sont configurĂ©es lors de la crĂ©ation du pont, tout paquet arrivant Ă
eth0
et ayant l'adresse de destination
172.17.0.2
sera redirigé vers le pont, qui le transmettra à l'interface virtuelle
veth0
. Bien que tout cela semble assez décent. S'il est connu que l'hÎte dont nous discutons a l'adresse
172.17.0.2
, nous pouvons ajouter une rÚgle aux paramÚtres du routeur qui décrit que la prochaine transition pour cette adresse est
10.100.0.2
, aprĂšs quoi les paquets Ă partir de lĂ devraient ĂȘtre redirigĂ©s vers
veth0
. Excellent. Voyons maintenant un autre hĂŽte.
L'hÎte montré dans le diagramme de droite a une interface physique
eth0
avec l'adresse
10.100.0.3
. Il utilise la mĂȘme passerelle par dĂ©faut -
10.100.0.1
, et, encore une fois, il est connecté au pont
docker0
avec l'adresse
172.17.0.1
. On a le sentiment que tout ne va pas si bien. Cette adresse peut en effet diffĂ©rer de celle utilisĂ©e sur l'hĂŽte situĂ© Ă gauche. Les adresses des ponts ici sont identiques pour illustrer le pire scĂ©nario possible, qui, par exemple, peut se produire si vous venez d'installer Docker et de le laisser fonctionner comme vous le souhaitez. Mais mĂȘme si les rĂ©seaux en question sont diffĂ©rents, notre exemple met en Ă©vidence un problĂšme plus profond, Ă savoir que les nĆuds ne savent gĂ©nĂ©ralement rien des adresses privĂ©es attribuĂ©es aux ponts situĂ©s sur d'autres nĆuds. Et nous devons le savoir - pour pouvoir envoyer des paquets Ă ces ponts et ĂȘtre sĂ»r qu'ils arriveront lĂ oĂč ils en ont besoin. Ăvidemment, ici nous avons besoin d'une sorte d'entitĂ©, ce qui nous permet d'assurer la configuration correcte des adresses dans diffĂ©rents nĆuds.
La plate-forme Kubernetes nous donne une solution en deux Ă©tapes Ă ce problĂšme. Tout d'abord, cette plate-forme attribue un espace d'adressage commun aux ponts dans chaque nĆud, puis attribue aux ponts les adresses dans cet espace en fonction du nĆud dans lequel se trouve le pont. DeuxiĂšmement, Kubernetes ajoute des rĂšgles de routage Ă la passerelle situĂ©e, dans notre cas, Ă
10.100.0.1
. Ces rÚgles définissent les rÚgles de routage des paquets destinés à chacun des ponts. C'est-à -dire qu'ils décrivent à travers quelle interface physique
eth0
peut ĂȘtre mise en contact avec chacun des ponts. Cette combinaison d'interfaces de rĂ©seau virtuel, de ponts et de rĂšgles de routage est communĂ©ment appelĂ©e
rĂ©seau de superposition . En parlant de Kubernetes, j'appelle gĂ©nĂ©ralement ce rĂ©seau un «rĂ©seau de foyer», car il s'agit d'un rĂ©seau de superposition qui permet aux pods situĂ©s Ă diffĂ©rents nĆuds de communiquer entre eux. Voici Ă quoi ressemblera le diagramme prĂ©cĂ©dent une fois que les mĂ©canismes Kubernetes seront opĂ©rationnels.
Réseau de foyerIl attire immédiatement l'attention sur le fait que les noms de pont sont passés de
docker0
Ă
cbr0
. Kubernetes n'utilise pas de ponts Docker standard. Ce que nous avons appelé
cbr
est une abrĂ©viation de «pont personnalisé», c'est-Ă -dire que nous parlons de ponts spĂ©ciaux. Je ne suis pas prĂȘt Ă donner une liste complĂšte des diffĂ©rences entre le lancement de conteneurs Docker dans des pods et leur exĂ©cution sur des ordinateurs ordinaires, mais ce dont nous parlons ici est l'une des diffĂ©rences similaires importantes. De plus, vous devez faire attention au fait que l'espace d'adressage attribuĂ© aux ponts dans cet exemple est
10.0.0.0/14
. Cette adresse est extraite de l'un de nos clusters intermédiaires, qui sont déployés sur la plate-forme Google Cloud, ce qui précÚde est donc un exemple trÚs réel d'un réseau de foyers. Votre cluster peut se voir attribuer une plage d'adresses complÚtement différente. Malheureusement, pour le moment, il n'y a aucun moyen d'obtenir des informations sur ces adresses à l'aide de l'utilitaire
kubectl
, mais, par exemple, si vous utilisez GCP, vous pouvez exécuter une commande comme les
gcloud container clusters describe <cluster>
et regardez la propriété
clusterIpv4Cidr
.
En gĂ©nĂ©ral, on peut noter que vous n'avez gĂ©nĂ©ralement pas Ă penser au fonctionnement du rĂ©seau de foyers. Lorsqu'un sous-Ă©change de donnĂ©es avec un autre foyer, cela se produit le plus souvent via les services Kubernetes. C'est un peu un proxy dĂ©fini par logiciel. Mais les adresses rĂ©seau des foyers apparaissent dans les journaux. Dans certaines situations, en particulier pendant le dĂ©bogage, vous devrez peut-ĂȘtre dĂ©finir explicitement des rĂšgles de routage dans les rĂ©seaux de foyers. Par exemple, le trafic quittant Kubernetes liĂ© Ă une adresse dans la plage 10.0.0.0/8 n'est pas traitĂ© par dĂ©faut Ă l'aide de NAT. Par consĂ©quent, si vous interagissez avec des services situĂ©s sur un autre rĂ©seau privĂ© qui a la mĂȘme plage d'adresses, vous devrez peut-ĂȘtre configurer des rĂšgles de routage qui vous permettront d'organiser la livraison correcte des paquets.
Résumé
Aujourd'hui, nous avons parlĂ© des modules Kubernetes et des fonctionnalitĂ©s de leur mise en rĂ©seau. Nous espĂ©rons que ce matĂ©riel vous aidera Ă prendre les bonnes mesures pour mettre en Ćuvre des scĂ©narios d'interaction de foyer complexes sur les rĂ©seaux Kubernetes.
Chers lecteurs! Cet article est le
premier d'une série de réseaux Kubernetes.
La deuxiÚme partie de ce cycle a déjà été
traduite . Nous réfléchissons à l'opportunité de traduire la
troisiĂšme partie. Nous vous demandons de commenter cela dans les commentaires.
