Réseaux Kubernetes: Pods

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 locale

Si 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 locale

Comme 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 commune

Maintenant, 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étiques

Ré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Ɠuds

Si 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Ɠuds

L'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 foyer

Il 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.

Source: https://habr.com/ru/post/fr441576/


All Articles