Comment un pod dans Kubernetes obtient une adresse IP

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 du modÚle réseau de Kubernetes 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 Flannel pour organiser le rĂ©seau dans le cluster, et comme environnement d'exĂ©cution — Containerd. 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) veth (ethernet virtuel). Une extrĂ©mitĂ© du dispositif veth est connectĂ©e Ă  l'espace de noms rĂ©seau du conteneur, l'autre Ă  un pont Linux 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.

Comment un pod dans Kubernetes obtient une adresse IP

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 vxlan, 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Ă©.

Comment un pod dans Kubernetes obtient une adresse IP
Remarque : C'est seulement l'un des moyens d'organiser l'interaction réseau entre des conteneurs.

Qu'est-ce que CRI ?

CRI (Container Runtime Interface) 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 ?

Le projet CNI est un la spécification vise à fournir une solution réseau universelle pour les conteneurs Linux. De plus, il inclut plugins, 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 du kube-controller-manager., 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 :

Comment un pod dans Kubernetes obtient une adresse IP

Aide : Architecture des plugins CRI de Containerd.

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 Containerd CRI.

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 du fichier de configuration de containerd.

É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-cni comme init-container.
  • Install-cni crĂ©e un fichier de configuration CNI (/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 :

Comment un pod dans Kubernetes obtient une adresse IP

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 Plugin CNI Flannel, 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. Plugin CNI Bridge 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 le plugin IPAM CNI local Ă  l'hĂŽte 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 à Twitter ou à l'adresse hello@ronaknathani.com. 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 :

Source : habr.com

Acheter un hĂ©bergement fiable pour les sites avec protection DDoS, serveurs VPS VDS đŸ”„ Acheter un hĂ©bergement fiable pour les sites avec protection DDoS, serveurs VPS VDS | ProHoster