Nota. transl.: Questu articulu, scrittu da un ingegnere SRE da LinkedIn, entra in dettagliu nantu à a magia interna in Kubernetes - più precisamente, l'interazzione di CRI, CNI è kube-apiserver - chì succede quandu u prossimu pod deve esse assignatu un indirizzu IP.
Unu di i bisogni basi U mudellu di rete Kubernetes hè chì ogni pod deve avè u so propiu indirizzu IP è qualsiasi altru pod in u cluster deve esse capace di cuntattà à quellu indirizzu. Ci hè parechje "prestatori" di rete (Flannel, Calico, Canal, etc.) chì aiutanu à implementà stu mudellu di rete.
Quandu aghju cuminciatu à travaglià cù Kubernetes, ùn era micca sanu chjaru per mè cumu esattamente i pods uttenenu i so indirizzi IP. Ancu cun una cunniscenza di cumu funzionavanu i cumpunenti individuali, era difficiule d'imaginà chì travaglianu inseme. Per esempiu, sapia ciò chì i plugins CNI eranu per, ma ùn aghju micca idea di cumu si chjamanu esattamente. Per quessa, aghju decisu di scrive stu articulu per sparte a cunniscenza di i diversi cumpunenti di a rete è cumu si travaglianu inseme in un cluster Kubernetes, chì permette à ogni pod di ottene u so propiu indirizzu IP unicu.
Ci hè diverse manere di urganizà a rete in Kubernetes, cum'è ci sò diverse opzioni di runtime per i cuntenituri. Sta publicazione aduprà Flannel per urganizà una reta in un cluster, è cum'è un ambiente eseguibile - Containerd. Aghju fattu ancu l'assunzione chì sapete cumu funziona a rete trà i cuntenituri, cusì vi tocca à pocu, solu per u cuntestu.
Certi cuncetti basi
Containers è a Rete: Una Breve Panoramica
Ci sò parechje publicazioni eccellenti in Internet chì spieganu cumu i cuntenituri cumunicanu cù l'altri nantu à a reta. Dunque, daraghju solu una visione generale di i cuncetti basi è limità à un approcciu, chì implica a creazione di un ponte Linux è l'incapsulazione di pacchetti. I dettagli sò omessi, postu chì u tema di a rete di containeru stessu meriteghja un articulu separatu. I ligami à alcune publicazioni particularmente perspicace è educative seranu furnite quì sottu.
Contenituri nantu à un host
Una manera di urganizà a cumunicazione via l'indirizzi IP trà i cuntenituri in u stessu òspite implica a creazione di un ponte Linux. Per questu scopu, i dispositi virtuali sò creati in Kubernetes (è Docker) veth (ethernet virtuale). Una estremità di u veth device cunnetta à u spaziu di nomi di rete di u containeru, l'altru à ponte Linux nantu à a reta d'ospiti.
Tutti i cuntenituri nantu à u stessu òspite anu una estremità di u veth cunnessu à un ponte per mezu di quale ponu cumunicà cù l'altri via l'indirizzi IP. U ponte Linux hà ancu un indirizzu IP è agisce cum'è una porta per u trafficu di egressu da i pods destinati à altri nodi.
Contenituri nantu à diversi ospiti
L'incapsulazione di pacchetti hè un metudu chì permette à i cuntenituri nantu à i diversi nodi di cumunicà cù l'altri utilizendu indirizzi IP. À Flannel, a tecnulugia hè rispunsevule per questa opportunità. vxlan, chì "imballate" u pacchettu uriginale in un pacchettu UDP è poi u manda à u so destinazione.
In un cluster Kubernetes, Flannel crea un dispositivu vxlan è aghjurnà a tabella di rotta nantu à ogni node in cunseguenza. Ogni pacchettu destinatu à un cuntainer in un host differente passa per u dispusitivu vxlan è hè incapsulatu in un pacchettu UDP. À a destinazione, u pacchettu nidificatu hè estrattu è trasmessu à u pod desideratu.
Nota: Questu hè solu un modu per urganizà a cumunicazione in rete trà i cuntenituri.
Cosa hè CRI?
CRI (Container Runtime Interface) hè un plugin chì permette à Kubelet di utilizà diverse ambienti di runtime di container. L'API CRI hè integrata in diversi runtimes, cusì l'utilizatori ponu sceglie u runtime di a so scelta.
Chì ghjè u CNI ?
Prughjettu CNI hè una specificazione per urganizà una soluzione di rete universale per i cuntenituri Linux. Inoltre, include plugins, rispunsevuli di diverse funzioni quandu stabilisce una reta di pod. U plugin CNI hè un schedariu eseguibile chì cunforme cù a specificazione (discuteremu alcuni plugins quì sottu).
Allocazione di subnets à i nodi per assignà indirizzi IP à pods
Siccomu ogni pod in un cluster deve avè un indirizzu IP, hè impurtante per assicurà chì questu indirizzu hè unicu. Questu hè ottenutu assignendu à ogni node una subnet unica, da quale i pods nantu à quellu node sò poi assignati indirizzi IP.
Node IPAM Controller
Quandu nodeipam passatu cum'è un paràmetru di bandiera --controllerskube-controller-manager, attribuisce una subnet separata (podCIDR) à ogni node da u cluster CIDR (vale à dì, a gamma di indirizzi IP per a reta di cluster). Siccomu questi podCIDR ùn si sovrapponenu, diventa pussibule per ogni pod per esse attribuitu un indirizzu IP unicu.
Un node Kubernetes hè assignatu un podCIDR quandu hè inizialmente registratu cù u cluster. Per cambià u podCIDR di i nodi, avete bisognu di annullà l'annullamentu è poi riregistrà, facendu cambiamenti appropritati à a cunfigurazione di a capa di cuntrollu di Kubernetes trà. Pudete vede u podCIDR di un node cù u cumandimu seguente:
$ kubectl get no <nodeName> -o json | jq '.spec.podCIDR'
10.244.0.0/24
Kubelet, runtime di containeru è plugins CNI: cumu tuttu funziona
A pianificazione di un pod per node implica assai passi preparatori. In questa sezione, mi focalizeraghju solu nantu à quelli chì sò direttamente ligati à a creazione di una reta di pod.
A pianificazione di un pod à un certu nodu attiva a catena di avvenimenti chì segue:
Interazione trà u runtime di u containeru è i plugins CNI
Ogni fornitore di rete hà u so propiu plugin CNI. U runtime di u cuntainer l'executa per cunfigurà a reta per u pod cum'è principia. In u casu di containerd, u plugin CNI hè lanciatu da u plugin Containerd CRI.
Inoltre, ogni fornitore hà u so propiu agente. Hè stallatu nantu à tutti i nodi Kubernetes è hè rispunsevule per a cunfigurazione di a rete di pods. Questu agentu hè inclusu cù a cunfigurazione CNI o crea indipindente nantu à u node. A cunfigurazione aiuta à u plugin CRI stabilisce quale plugin CNI chjamà.
U locu di a cunfigurazione CNI pò esse persunalizatu; per difettu hè in /etc/cni/net.d/<config-file>. L'amministratori di cluster sò ancu rispunsevuli di installà plugins CNI in ogni node di cluster. U so locu hè ancu customizable; cartulare predeterminatu - /opt/cni/bin.
Quandu si usa containerd, i percorsi per a cunfigurazione di u plugin è i binari ponu esse stabiliti in a sezione [plugins.«io.containerd.grpc.v1.cri».cni] в u schedariu di cunfigurazione containerd.
Siccomu utilizemu Flannel cum'è u nostru fornitore di rete, parlemu un pocu di a cunfigurazione:
Flanneld (u daemon di Flannel) hè generalmente installatu in un cluster cum'è DaemonSet cù install-cni cum'è init container.
Flanneld crea un dispositivu vxlan, recupera metadata di a rete da u servitore API, è monitorizza l'aghjurnamenti di pod. Cumu sò creati, distribuisce rotte à tutti i podi in tuttu u cluster.
Queste rotte permettenu à i pods di cumunicà cù l'altri via l'indirizzi IP.
Per infurmazione più dettagliata nantu à u travagliu di Flannel, ricumandemu di utilizà i ligami à a fine di l'articulu.
Eccu un diagramma di l'interazzione trà u plugin Containerd CRI è i plugins CNI:
Comu pudete vede sopra, u kubelet chjama u plugin Containerd CRI per creà u pod, chì poi chjama u plugin CNI per cunfigurà a reta di u pod. In questu, u plugin CNI di u fornitore di a rete chjama altri plugins CNI core per cunfigurà diversi aspetti di a reta.
Interazione trà i plugins CNI
Ci sò parechji plugins CNI chì u travagliu hè di aiutà à stabilisce a cumunicazione di a rete trà i cuntenituri nantu à l'ospiti. Questu articulu discuterà trè di elli.
CNI plugin Flannel
Quandu si usa Flannel cum'è un fornitore di rete, u cumpunente Containerd CRI chjama CNI plugin Flannelutilizendu u schedariu di cunfigurazione CNI /etc/cni/net.d/10-flannel.conflist.
U plugin Flannel CNI travaglia in cunghjunzione cù Flanneld. Durante l'iniziu, Flanneld recupera podCIDR è altri dettagli di rete da u servitore API è li salva in un schedariu /run/flannel/subnet.env.
Quandu hè chjamatu per a prima volta, crea un ponte Linux cù «name»: «cni0», chì hè indicatu in a cunfigurazione. Allora un veth pair hè creatu per ogni pod. Una estremità hè cunnessa à u spaziu di nomi di a rete di u containeru, l'altru hè inclusu in u ponte Linux in a reta di l'ospiti. CNI plugin Bridge cunnetta tutti i cuntenituri d'ospiti à un ponte Linux in a reta di l'ospiti.
Dopu avè finitu di stallà u paru veth, u plugin Bridge chjama u plugin IPAM CNI host-local. U tipu di plugin IPAM pò esse cunfiguratu in a cunfigurazione CNI chì u plugin CRI usa per chjamà u plugin Flannel CNI.
Plugin IPAM locale host (IPAindirizzu Mgestione - gestione di l'indirizzu IP) torna l'indirizzu IP per u cuntinuu da a subnet è guarda l'IP assignata nantu à l'ospitu in u cartulare specificatu in a sezione dataDir - /var/lib/cni/networks/<network-name=cni0>/<ip>. Stu schedariu cuntene l'ID di u cuntinuu à quale l'indirizzu IP hè assignatu.
Quandu chjamà u plugin IPAM host-local, torna i seguenti dati:
Kube-controller-manager assigna un podCIDR à ogni node. I pods di ogni nodu ricevenu l'indirizzi IP da u spaziu di l'indirizzu in a gamma podCIDR assignata. Siccomu i podCIDR di i nodi ùn si sovrapponenu micca, tutti i pods ricevenu indirizzi IP unichi.
L'amministratore di u cluster Kubernetes cunfigura è stalla u kubelet, u runtime di u containeru, l'agente di u fornitore di rete, è copia i plugins CNI à ogni nodu. Durante l'iniziu, l'agente di u fornitore di rete genera una cunfigurazione CNI. Quandu un pod hè programatu à un node, u kubelet chjama u plugin CRI per creà. Dopu, se u containerd hè utilizatu, u plugin Containerd CRI chjama u plugin CNI specificatu in a cunfigurazione CNI per cunfigurà a reta di u pod. In u risultatu, u pod riceve un indirizzu IP.
Mi pigliò un pocu di tempu per capisce tutte e suttilità è sfumature di tutte queste interazzione. Spergu chì sta sperienza vi aiuterà à capisce megliu cumu funziona Kubernetes. Se mi sbagliu in qualcosa, per piacè cuntattatemi à Twitter o à l'indirizzu [email prutettu]. Sentite liberu di ghjunghje se vulete discutiri aspetti di questu articulu o qualsiasi altra cosa. Mi piacerebbe parlà cun voi!