Wéi e Kubernetes Pod eng IP Adress kritt

Note. iwwersat.: Dësen Artikel, geschriwwen vun engem SRE-Ingenieur vu LinkedIn, geet am Detail iwwer déi bannenzeg Magie zu Kubernetes - méi präzis, d'Interaktioun vu CRI, CNI a kube-apiserver - dat geschitt wann de nächste Pod eng IP Adress zougewisen muss ginn.

Ee vun de Basis Ufuerderunge Kubernetes Netzwierkmodell ass datt all Pod seng eege IP Adress muss hunn an all aner Pod am Cluster muss et op där Adress kontaktéiere kënnen. Et gi vill Reseau "Provider" (Flannel, Calico, Canal, etc.), déi hëllefen dëst Netzmodell ëmzesetzen.

Wéi ech ugefaang hunn mat Kubernetes ze schaffen, war et mir net ganz kloer wéi genau Pods hir IP Adresse kréien. Och mat engem Verständnis wéi déi eenzel Komponenten funktionnéieren, war et schwéier ze virstellen datt se zesumme schaffen. Zum Beispill wousst ech wat CNI Plugins waren, awer ech hat keng Ahnung wéi genau se genannt goufen. Dofir hunn ech décidéiert dësen Artikel ze schreiwen fir Wëssen iwwer déi verschidde Netzwierkkomponenten ze deelen a wéi se zesumme schaffen an engem Kubernetes Cluster, wat all Pod erlaabt seng eege eenzegaarteg IP Adress ze kréien.

Et gi verschidde Weeër fir Netzwierker a Kubernetes ze organiséieren, sou wéi et verschidde Runtime-Optioune fir Container sinn. Dës Publikatioun wäert benotzen Flannel en Netzwierk an engem Cluster z'organiséieren, an als ausführbar Ëmfeld - Containerd. Ech maachen och d'Annahme datt Dir wësst wéi d'Vernetzung tëscht Container funktionnéiert, also wäert ech et just kuerz beréieren, just fir de Kontext.

E puer grondleeënd Konzepter

Container an d'Netzwierk: E kuerzen Iwwerbléck

Et gi vill exzellent Publikatiounen um Internet déi erkläre wéi Container mateneen iwwer dem Netz kommunizéieren. Dofir ginn ech nëmmen en allgemengen Iwwerbléck iwwer d'Basiskonzepter a beschränke mech op eng Approche, déi d'Schafe vun enger Linux Bréck an d'Encapsuléierung vun Packagen involvéiert. Detailer ginn ausgeliwwert, well d'Thema vum Containernetz selwer en separaten Artikel verdéngt. Linken op e puer besonnesch Asiicht an pädagogesch Publikatioune ginn hei drënner geliwwert.

Container op engem Host

Ee Wee fir d'Kommunikatioun iwwer IP Adressen tëscht Container, déi um selwechte Host lafen, ze organiséieren ass eng Linux Bréck ze kreéieren. Fir dësen Zweck ginn virtuell Apparater a Kubernetes (an Docker) erstallt. veth (virtuell Ethernet). Een Enn vun der veth Apparat verbënnt dem Container Reseau Nummraum, déi aner ze Linux Bréck am Hostnetz.

All Behälter op der selwechter Provider hunn een Enn vun der veth zu enger Bréck verbonne duerch déi se mat all aner via IP Adressen kommunizéieren kann. D'Linux Bréck huet och eng IP Adress an handelt als Paart fir Ausgangsverkéier vun de Pods, déi fir aner Noden bestëmmt sinn.

Wéi e Kubernetes Pod eng IP Adress kritt

Container op verschiddene Hosten

Packet Encapsulation ass eng Method déi Container op verschiddene Noden erlaabt mateneen mat IP Adressen ze kommunizéieren. Bei Flannel ass d'Technologie verantwortlech fir dës Geleeënheet. vxlan, deen den urspréngleche Paket an en UDP Paket "packt" an dann op seng Destinatioun schéckt.

An engem Kubernetes-Cluster erstellt Flannel e vxlan-Apparat an aktualiséiert d'Routetabell op all Node entspriechend. All Paket, dee fir e Container op engem anere Host bestëmmt ass, passéiert duerch de vxlan-Apparat a gëtt an engem UDP-Paket akapselt. Op der Destinatioun gëtt de nestéierte Paket extrahéiert an op de gewënschten Pod weidergeleet.

Wéi e Kubernetes Pod eng IP Adress kritt
Notiz: Dëst ass just ee Wee fir Netzwierkkommunikatioun tëscht Container ze organiséieren.

Wat ass CRI?

CRI (Container Runtime Interface) ass e Plugin deen Kubelet erlaabt verschidde Container Runtime Ëmfeld ze benotzen. D'CRI API ass a verschidde Runtimes agebaut, sou datt d'Benotzer d'Runtime vun hirer Wiel wielen.

Wat ass CNI?

Projet CNI ass e Spezifizéierung eng universell Netzwierkléisung fir Linux Container ze organiséieren. Zousätzlech enthält et Plugins, verantwortlech fir verschidde Funktiounen beim Astelle vun engem Pod-Netz. De CNI Plugin ass eng ausführbar Datei déi mat der Spezifizéierung entsprécht (mir diskutéieren e puer Plugins hei ënnen).

Allocatioun vun Subnets un Noden fir d'IP Adressen un Pods ze ginn

Well all Pod an engem Cluster eng IP Adress muss hunn, ass et wichteg ze garantéieren datt dës Adress eenzegaarteg ass. Dëst gëtt erreecht andeems all Node en eenzegaartegt Subnet ass, aus deem d'Pods op deem Node dann IP Adressen zougewisen ginn.

Node IPAM Controller

Wéini nodeipam als Fändelparameter passéiert --controllers kube-controller-manager, et allokéiert e separaten Subnet (podCIDR) un all Node vum Cluster CIDR (dh d'Gamme vun IP Adressen fir de Clusternetz). Well dës PodCIDRs net iwwerlappen, gëtt et méiglech fir all Pod eng eenzegaarteg IP Adress ze ginn.

E Kubernetes Node gëtt e PodCIDR zougewisen wann et am Ufank mam Cluster registréiert ass. Fir de PodCIDR vun Noden z'änneren, musst Dir se deregistréieren an se dann nei registréieren, a passend Ännerungen un der Kubernetes Kontrollschichtkonfiguratioun tëscht. Dir kënnt de PodCIDR vun engem Node mat dem folgenden Kommando weisen:

$ kubectl get no <nodeName> -o json | jq '.spec.podCIDR'
10.244.0.0/24

Kubelet, Container Runtime an CNI Plugins: wéi et alles funktionnéiert

E Pod pro Node ze plangen implizéiert vill Virbereedungsschrëtt. An dëser Rubrik konzentréieren ech mech nëmmen op déi, déi direkt mat der Opstellung vun engem Pod-Netz verbonne sinn.

D'Planung vun engem Pod op e bestëmmten Node léist déi folgend Kette vun Eventer aus:

Wéi e Kubernetes Pod eng IP Adress kritt

Hëllef: Architektur vu Containerd CRI Plugins.

Interaktioun tëscht Container Runtime an CNI Plugins

All Netzwierk Provider huet säin eegene CNI Plugin. D'Runtime vum Container leeft et fir d'Netzwierk fir de Pod ze konfiguréieren wéi et ufänkt. Am Fall vu Containerd gëtt den CNI Plugin vum Plugin gestart Containerd CRI.

Ausserdeem huet all Provider säin eegene Agent. Et ass op all Kubernetes Noden installéiert an ass verantwortlech fir d'Netzkonfiguratioun vu Pods. Dësen Agent ass entweder mat der CNI Config abegraff oder erstellt se onofhängeg um Node. D'Config hëlleft dem CRI Plugin ze setzen wéi en CNI Plugin fir ze ruffen.

De Standort vun der CNI Configuratioun kann personaliséiert ginn; par défaut ass et an /etc/cni/net.d/<config-file>. Cluster Administrateuren sinn och verantwortlech fir d'Installatioun vun CNI Plugins op all Cluster Node. Hir Plaz ass och personaliséierbar; Standardverzeechnes - /opt/cni/bin.

Wann Dir Containerd benotzt, kënnen d'Weeër fir d'Pluginkonfiguratioun a Binären an der Sektioun gesat ginn [plugins.«io.containerd.grpc.v1.cri».cni] в containerd Konfiguratiounsdatei.

Well mir Flannel als eisen Netzwierkprovider benotzen, schwätze mer e bëssen iwwer d'Opstellung:

  • Flanneld (Flannel's Daemon) gëtt normalerweis an engem Cluster als DaemonSet installéiert mat install-cni wéi init Container.
  • Install-cni kreéiert CNI Configuratiounsdatei (/etc/cni/net.d/10-flannel.conflist) op all Node.
  • Flanneld erstellt e vxlan-Apparat, recuperéiert Netzwierkmetadaten vum API-Server, a kontrolléiert Podupdates. Wéi se erstallt ginn, verdeelt se Strecken un all Pods am ganze Cluster.
  • Dës Strecken erlaben Pods mateneen iwwer IP Adressen ze kommunizéieren.

Fir méi detailléiert Informatiounen iwwer d'Aarbecht vu Flannel, ech recommandéieren d'Linken um Enn vum Artikel ze benotzen.

Hei ass en Diagramm vun der Interaktioun tëscht dem Containerd CRI Plugin an den CNI Plugins:

Wéi e Kubernetes Pod eng IP Adress kritt

Wéi Dir uewen gesitt, rifft de Kubelet de Containerd CRI Plugin fir de Pod ze kreéieren, deen dann den CNI Plugin nennt fir de Pod säi Netz ze konfiguréieren. Dobäi rifft den CNI-Plugin vum Netzwierkprovider aner Kär-CNI-Plugins fir verschidden Aspekter vum Netz ze konfiguréieren.

Interaktioun tëscht CNI Plugins

Et gi verschidde CNI Plugins deenen hir Aarbecht ass et ze hëllefen d'Netzkommunikatioun tëscht Container um Host opzestellen. Dësen Artikel wäert dräi vun hinnen diskutéieren.

CNI Plugin Flanell

Wann Dir Flannel als Netzwierkprovider benotzt, rifft de Containerd CRI Komponent CNI Plugin Flanellmat der CNI Konfiguratiounsdatei /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
      }
    }
  ]
}

De Flannel CNI Plugin funktionnéiert a Verbindung mat Flannel. Wärend dem Startup kritt de Flanneld podCIDR an aner Netzwierkbezunnen Detailer vum API Server a späichert se an eng Datei /run/flannel/subnet.env.

FLANNEL_NETWORK=10.244.0.0/16 
FLANNEL_SUBNET=10.244.0.1/24
FLANNEL_MTU=1450 
FLANNEL_IPMASQ=false

De Flannel CNI Plugin benotzt Daten aus /run/flannel/subnet.env den CNI Bréck Plugin ze konfiguréieren an ze ruffen.

CNI Plugin Bréck

Dëse Plugin gëtt mat der folgender Konfiguratioun genannt:

{
  "name": "cni0",
  "type": "bridge",
  "mtu": 1450,
  "ipMasq": false,
  "isGateway": true,
  "ipam": {
    "type": "host-local",
    "subnet": "10.244.0.0/24"
  }
}

Wann fir d'éischte Kéier genannt, et schaaft eng Linux Bréck mat «name»: «cni0», déi an der Configuratioun uginn ass. Da gëtt e Veth Pair fir all Pod erstallt. Een Enn dovun ass mat dem Container säi Netznummraum verbonnen, deen aneren ass an der Linux Bréck am Hostnetz abegraff. CNI Plugin Bréck verbënnt all Hostbehälter mat enger Linux Bréck am Hostnetz.

Nodeems de Veth Pair fäerdeg ass, rifft de Bridge Plugin den Host-lokalen IPAM CNI Plugin. Den IPAM Plugin Typ kann an der CNI Config konfiguréiert ginn, déi de CRI Plugin benotzt fir de Flannel CNI Plugin ze nennen.

Host-lokal IPAM CNI Plugins

Bréck CNI rifft Host-lokal IPAM Plugin CNI mat der folgender Konfiguratioun:

{
  "name": "cni0",
  "ipam": {
    "type": "host-local",
    "subnet": "10.244.0.0/24",
    "dataDir": "/var/lib/cni/networks"
  }
}

Host-lokal IPAM Plugin (IP AKleedung Management - IP Adress Gestioun) gëtt d'IP Adress fir de Container vum Subnet zréck a späichert déi zougewisen IP um Host am Verzeichnis, deen an der Sektioun spezifizéiert ass dataDir - /var/lib/cni/networks/<network-name=cni0>/<ip>. Dëse Fichier enthält d'ID vum Container un deem dës IP Adress zougewisen ass.

Wann Dir den Host-lokalen IPAM Plugin rufft, gëtt et déi folgend Donnéeën zréck:

{
  "ip4": {
    "ip": "10.244.4.2",
    "gateway": "10.244.4.3"
  },
  "dns": {}
}

Summary

Kube-Controller-Manager gëtt e PodCIDR un all Node zou. D'Pods vun all Node kréien IP Adressen aus dem Adressraum an der zougewisener PodCIDR Gamme. Zënter datt d'Node PodCIDRs net iwwerlappen, kréien all Pods eenzegaarteg IP Adressen.

De Kubernetes Cluster Administrateur konfiguréiert an installéiert de Kubelet, Container Runtime, Netzwierk Provider Agent, a kopéiert d'CNI Plugins op all Node. Wärend dem Startup generéiert den Netzwierkprovider Agent eng CNI-Konfiguratioun. Wann e Pod zu engem Node geplangt ass, rifft de Kubelet den CRI Plugin fir et ze kreéieren. Als nächst, wann Containerd benotzt gëtt, rifft de Containerd CRI Plugin den CNI Plugin deen an der CNI Config spezifizéiert ass fir de Pod säi Netz ze konfiguréieren. Als Resultat kritt de Pod eng IP Adress.

Et huet mech e bëssen Zäit gedauert fir all d'Subtletien an d'Nuancen vun all dësen Interaktiounen ze verstoen. Ech hoffen dës Erfahrung hëlleft Iech besser ze verstoen wéi Kubernetes funktionnéiert. Wann ech iwwer eppes falsch, weg Kontakt mech op Twitter oder op der Adress [Email geschützt]. Fillt Iech gratis z'erreechen wann Dir Aspekter vun dësem Artikel wëllt diskutéieren oder soss eppes. Ech géif gären mat Iech chatten!

Referenze

Container an Netzwierk

Wéi funktionnéiert Flanell?

CRI an CNI

PS vum Iwwersetzer

Liest och op eisem Blog:

Source: will.com

Setzt e Commentaire