Note de traduction.: Cet article, rĂ©digĂ© par un ingĂ©nieur SRE de LinkedIn, dĂ©taille la « magie interne » de Kubernetes â plus prĂ©cisĂ©ment, l'interaction entre CRI, CNI et kube-apiserver â ce qui se passe lorsqu'un pod doit se voir attribuer une adresse IP.
Une des exigences fondamentales est que chaque pod doit avoir sa propre adresse IP et que tout autre pod dans le cluster doit pouvoir communiquer avec lui via cette adresse. Il existe de nombreux « fournisseurs » réseau (Flannel, Calico, Canal, etc.) qui aident à réaliser ce modÚle réseau.
Lorsque j'ai commencĂ© Ă travailler avec Kubernetes, je ne comprenais pas trĂšs bien comment les pods obtenaient leurs adresses IP. MĂȘme en comprenant comment fonctionnent les diffĂ©rents composants, il Ă©tait difficile d'imaginer leur travail en synergie. Par exemple, je savais Ă quoi servaient les plugins CNI, mais je ne savais pas exactement comment ils Ă©taient appelĂ©s. J'ai donc dĂ©cidĂ© d'Ă©crire cet article pour partager mes connaissances sur les diffĂ©rents composants rĂ©seau et leur collaboration dans un cluster Kubernetes, qui permettent Ă chaque pod d'obtenir son adresse IP unique.
Il existe diffĂ©rentes façons d'organiser la communication rĂ©seau dans Kubernetes, tout comme il existe diffĂ©rentes options d'environnements d'exĂ©cution (runtime) pour les conteneurs. Dans cette publication, je vais utiliser pour organiser le rĂ©seau dans le cluster, et comme environnement d'exĂ©cution â . Je pars Ă©galement du principe que vous savez comment fonctionne la communication rĂ©seau entre les conteneurs, donc je vais en aborder briĂšvement les points essentiels, uniquement pour le contexte.
Quelques concepts de base
Conteneurs et réseau : un aperçu rapide
Il existe de nombreuses publications excellentes sur Internet expliquant comment les conteneurs se connectent entre eux via le réseau. Je vais donc donner un aperçu général des concepts de base et me limiter à une approche, impliquant la création d'un pont Linux et l'encapsulation des paquets. Les détails sont laissés de cÎté, car le sujet de la communication réseau des conteneurs mérite un article à part. Des liens vers quelques publications particuliÚrement enrichissantes et instructives seront fournis ci-dessous.
Conteneurs sur un mĂȘme hĂŽte
L'un des moyens d'organiser la communication par adresses IP entre des conteneurs fonctionnant sur le mĂȘme hĂŽte est de crĂ©er un pont Linux. Ă cette fin, des dispositifs virtuels sont créés dans Kubernetes (et Docker) . Une extrĂ©mitĂ© du dispositif veth est connectĂ©e Ă l'espace de noms rĂ©seau du conteneur, l'autre Ă un dans le rĂ©seau de l'hĂŽte.
Tous les conteneurs sur un mĂȘme hĂŽte ont une extrĂ©mitĂ© du veth connectĂ©e au pont, par lequel ils peuvent communiquer entre eux par adresses IP. Le pont Linux dispose Ă©galement d'une adresse IP et sert de passerelle pour le trafic sortant (egress) des pods vers d'autres nĆuds.

Conteneurs sur différents hÎtes
L'encapsulation de paquets est l'un des moyens permettant aux conteneurs sur diffĂ©rents nĆuds de communiquer par adresses IP. Dans Flannel, cette capacitĂ© est gĂ©rĂ©e par la technologie , qui « encapsule » le paquet d'origine dans un paquet UDP avant de l'envoyer Ă destination.
Dans un cluster Kubernetes, Flannel crĂ©e un dispositif vxlan et complĂšte la table de routage sur chacun des nĆuds en consĂ©quence. Chaque paquet destinĂ© Ă un conteneur sur un autre hĂŽte passe par le dispositif vxlan et est encapsulĂ© dans un paquet UDP. Ă la destination, le paquet imbriquĂ© est extrait et redirigĂ© vers le pod souhaitĂ©.

Remarque : C'est seulement l'un des moyens d'organiser l'interaction réseau entre des conteneurs.
Qu'est-ce que CRI ?
est un plugin permettant au kubelet d'utiliser différents environnements d'exécution de conteneurs. L'API CRI est intégrée à divers environnements d'exécution, permettant aux utilisateurs de choisir l'exécution selon leurs besoins.
Qu'est-ce que CNI ?
est un vise à fournir une solution réseau universelle pour les conteneurs Linux. De plus, il inclut , qui sont responsables de différentes fonctions lors de la configuration du réseau du pod. Un plugin CNI est un fichier exécutable conforme aux spécifications (certains plugins seront discutés ci-dessous).
Attribution de sous-rĂ©seaux aux nĆuds pour l'attribution d'adresses IP aux pods
Puisque chaque pod dans le cluster doit disposer d'une adresse IP, il est crucial de s'assurer que cette adresse soit unique. Cela est accompli en attribuant Ă chaque nĆud un sous-rĂ©seau unique Ă partir duquel des adresses IP seront ensuite attribuĂ©es aux pods sur ce nĆud.
ContrĂŽleur IPAM du nĆud
Lorsque nodeipam est passĂ© en tant que paramĂštre d'option --controllers , il attribue Ă chaque nĆud un sous-rĂ©seau distinct (podCIDR) Ă partir du CIDR du cluster (c'est-Ă -dire une plage d'adresses IP pour le rĂ©seau du cluster). Ătant donnĂ© que ces podCIDR ne se chevauchent pas, il devient possible d'attribuer une adresse IP unique Ă chaque pod.
Un podCIDR est attribuĂ© Ă un nĆud Kubernetes au moment de son enregistrement initial dans le cluster. Pour modifier le podCIDR des nĆuds, il est nĂ©cessaire de les dĂ©senregistrer, puis de les rĂ©enregistrer, en apportant les modifications nĂ©cessaires Ă la configuration de la couche de contrĂŽle Kubernetes. Vous pouvez afficher le podCIDR d'un nĆud avec la commande suivante :
$ kubectl get no -o json | jq '.spec.podCIDR'
10.244.0.0/24
Kubelet, environnement d'exécution des conteneurs et plugins CNI : comment tout cela fonctionne
La planification d'un pod sur un nĆud est liĂ©e Ă l'exĂ©cution de plusieurs actions prĂ©paratoires. Dans cette section, je vais me concentrer uniquement sur celles qui sont directement liĂ©es Ă la configuration du rĂ©seau du pod.
La planification d'un pod sur un nĆud dĂ©clenche la chaĂźne d'Ă©vĂ©nements suivante :

Aide : .
Interaction entre l'environnement d'exécution des conteneurs et les plugins CNI
Chaque fournisseur de réseau a son propre plugin CNI. L'environnement d'exécution des conteneurs le lance pour configurer le réseau pour le pod pendant son démarrage. Dans le cas de containerd, le plugin CNI est géré par le plugin .
Chaque fournisseur dispose Ă©galement de son propre agent. Il est installĂ© sur tous les nĆuds Kubernetes et est responsable de la configuration rĂ©seau des pods. Cet agent est soit fourni avec la configuration CNI, soit crĂ©e celle-ci lui-mĂȘme sur le nĆud. La configuration aide le plugin CRI Ă dĂ©terminer quel plugin CNI appeler.
L'emplacement de la configuration CNI peut ĂȘtre configurĂ© ; par dĂ©faut, elle se trouve dans /etc/cni/net.d/<config-file>. Les administrateurs de cluster sont Ă©galement responsables de l'installation des plugins CNI sur chaque nĆud du cluster. Leur emplacement est Ă©galement configurable ; le rĂ©pertoire par dĂ©faut est /opt/cni/bin.
Lors de l'utilisation de containerd, les chemins pour la configuration et les binaires du plugin peuvent ĂȘtre dĂ©finis dans la section [plugins."io.containerd.grpc.v1.cri".cni] dans .
Ătant donnĂ© que nous utilisons Flannel comme fournisseur de rĂ©seau, parlons un peu de sa configuration :
- Flanneld (le démon de Flannel) est généralement installé dans le cluster en tant que DaemonSet avec
install-cnicomme . Install-cnicrĂ©e (/etc/cni/net.d/10-flannel.conflist) sur chaque nĆud.- Flanneld crĂ©e un dispositif vxlan, extrait les mĂ©tadonnĂ©es rĂ©seau depuis l'API du serveur et suit les mises Ă jour des pods. Au fur et Ă mesure de leur crĂ©ation, il diffuse des routes pour tous les pods Ă travers le cluster.
- Ces routes permettent aux pods de communiquer entre eux via des adresses IP.
Pour plus d'informations sur le fonctionnement de Flannel, je recommande de consulter les liens Ă la fin de l'article.
Voici un schéma de l'interaction entre le plugin Containerd CRI et les plugins CNI :

Comme le montre l'exemple ci-dessus, kubelet appelle le plugin Containerd CRI pour créer un pod, et ce dernier appelle le plugin CNI pour configurer le réseau du pod. Le plugin CNI du fournisseur de réseau appelle d'autres plugins de base CNI pour configurer les différents aspects du réseau.
Interaction entre les plugins CNI
Il existe différents plugins CNI dont le but est d'aider à configurer l'interaction réseau entre les conteneurs sur l'hÎte. Cet article se concentrera sur trois d'entre eux.
Plugin CNI Flannel
Lors de l'utilisation de Flannel en tant que fournisseur de réseau, le composant Containerd CRI appelle , en utilisant le fichier de configuration CNI /etc/cni/net.d/10-flannel.conflist.
$ cat /etc/cni/net.d/10-flannel.conflist
{
"name": "cni0",
"plugins": [
{
"type": "flannel",
"delegate": {
"ipMasq": false,
"hairpinMode": true,
"isDefaultGateway": true
}
}
]
}
Le plugin CNI Flannel fonctionne en tandem avec Flanneld. Lors du démarrage, Flanneld extrait le podCIDR et d'autres détails de réseau liés depuis l'API du serveur et les enregistre dans un fichier /run/flannel/subnet.env.
FLANNEL_NETWORK=10.244.0.0/16
FLANNEL_SUBNET=10.244.0.1/24
FLANNEL_MTU=1450
FLANNEL_IPMASQ=false
Le plugin CNI Flannel utilise les données de /run/flannel/subnet.env pour configurer et appeler le plugin CNI pont (bridge).
Plugin CNI Bridge
Ce plugin est appelé avec la configuration suivante :
{
"name": "cni0",
"type": "bridge",
"mtu": 1450,
"ipMasq": false,
"isGateway": true,
"ipam": {
"type": "host-local",
"subnet": "10.244.0.0/24"
}
}
Lors de son premier appel, il crée un pont Linux avec "name": "cni0", ce qui est spécifié dans la configuration. Ensuite, pour chaque pod, une paire de veth est créée. Une extrémité est connectée à l'espace de noms réseau du conteneur, l'autre entre dans le pont Linux dans le réseau hÎte. connecte tous les conteneurs de l'hÎte au pont Linux dans le réseau hÎte.
AprĂšs avoir terminĂ© la configuration de la paire de veth, le plugin Bridge appelle le plugin IPAM local Ă l'hĂŽte (host-local) CNI. Le type de plugin IPAM peut ĂȘtre configurĂ© dans le fichier de configuration CNI que le plugin CRI utilise pour appeler le plugin CNI Flannel.
Les plugins IPAM CNI locaux pour l'hĂŽte
Bridge CNI appelle avec la configuration suivante :
{
"name": "cni0",
"ipam": {
"type": "host-local",
"subnet": "10.244.0.0/24",
"dataDir": "/var/lib/cni/networks"
}
}
Plugin IPAM local-hĂŽte (IP Aadresse Mgestion â gestion des adresses IP) renvoie une adresse IP pour le conteneur depuis le sous-rĂ©seau et conserve l'adresse IP attribuĂ©e sur l'hĂŽte dans le rĂ©pertoire spĂ©cifiĂ© dans la section dataDir â /var/lib/cni/networks/<network-name=cni0>/<ip>. Ce fichier contient l'ID du conteneur auquel cette adresse IP est attribuĂ©e.
Lorsqu'il est appelé, le plugin IPAM local-hÎte renvoie les données suivantes :
{
"ip4": {
"ip": "10.244.4.2",
"gateway": "10.244.4.3"
},
"dns": {}
}
Résumé
Le kube-controller-manager attribue un podCIDR Ă chaque nĆud. Les pods de chaque nĆud obtiennent des adresses IP Ă partir de l'espace d'adresses dans la plage de podCIDR attribuĂ©e. Comme les podCIDR des nĆuds ne se chevauchent pas, tous les pods reçoivent des adresses IP uniques.
L'administrateur du cluster Kubernetes configure et installe kubelet, l'environnement d'exĂ©cution des conteneurs, l'agent du fournisseur de rĂ©seau, puis copie les plugins CNI sur chaque nĆud. Lors du dĂ©marrage, l'agent fournisseur de rĂ©seau gĂ©nĂšre la configuration CNI. Lorsque le pod est planifiĂ© sur un nĆud, kubelet appelle le plugin CRI pour le crĂ©er. Ensuite, si containerd est utilisĂ©, le plugin Containerd CRI appelle le plugin CNI spĂ©cifiĂ© dans la configuration CNI pour configurer le rĂ©seau du pod. En consĂ©quence, le pod reçoit une adresse IP.
Il m'a fallu un certain temps pour comprendre toutes les subtilités et les nuances de ces interactions. J'espÚre que cette expérience vous aidera également à mieux comprendre comment Kubernetes fonctionne. Si je fais une erreur, n'hésitez pas à me contacter à ou à l'adresse . N'hésitez pas à me contacter si vous souhaitez discuter des aspects de cet article ou d'autre chose. Je serais ravi de converser avec vous !
Liens
Conteneurs et réseau
Comment Flannel fonctionne
CRI et CNI
P.S. de l'auteur
Lisez aussi dans notre blog :
- «»;
- « Guide illustré sur la mise en réseau dans Kubernetes » : , ;
- «».
Source : habr.com
