Cumu un pod Kubernetes uttene un indirizzu IP?

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.

Cumu un pod Kubernetes uttene un indirizzu IP?

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.

Cumu un pod Kubernetes uttene un indirizzu IP?
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 --controllers kube-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:

Cumu un pod Kubernetes uttene un indirizzu IP?

Aiutu: Architettura di i plugins Containerd CRI.

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.
  • Install-cni crea File di cunfigurazione CNI (/etc/cni/net.d/10-flannel.conflist) nantu à ogni nodu.
  • 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:

Cumu un pod Kubernetes uttene un indirizzu IP?

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.

$ cat /etc/cni/net.d/10-flannel.conflist
{
  "name": "cni0",
  "plugins": [
    {
      "type": "flannel",
      "delegate": {
         "ipMasq": false,
        "hairpinMode": true,
        "isDefaultGateway": true
      }
    }
  ]
}

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.

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

U plugin Flannel CNI usa dati da /run/flannel/subnet.env per cunfigurà è chjamà u plugin di ponte CNI.

CNI plugin Bridge

Stu plugin hè chjamatu cù a cunfigurazione seguente:

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

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.

Plugins CNI IPAM locale host

Bridge CNI chjama plugin IPAM locale CNI cù a seguente cunfigurazione:

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

Plugin IPAM locale host (IP Aindirizzu 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:

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

Resumen

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!

referenze

Containers è rete

Cumu funziona Flannel?

CRI et CNI

PS da u traduttore

Leghjite puru nant'à u nostru blog:

Source: www.habr.com

Add a comment