Obs. övers.: Den hĂ€r artikeln, skriven av en SRE-ingenjör frĂ„n LinkedIn, beskriver i detalj den "inre magin" i Kubernetes â nĂ€rmare bestĂ€mt interaktionen mellan CRI, CNI och kube-apiserver â och vad som sker nĂ€r en pod behöver tilldelas en IP-adress.
Ett av de grundlÀggande kraven Àr att varje pod mÄste ha sin egen IP-adress och alla andra poddar i klustret ska kunna kommunicera med den via denna adress. Det finns mÄnga nÀtverks "leverantörer" (Flannel, Calico, Canal, etc.) som hjÀlper till att implementera denna nÀtverksmodell.
NĂ€r jag först började arbeta med Kubernetes var jag inte helt klart över hur poddar fick sina IP-adresser. Ăven med förstĂ„else för hur de enskilda komponenterna fungerar var det svĂ„rt att förestĂ€lla sig deras samarbete. Jag visste till exempel varför CNI-plugins behövs, men jag hade ingen aning om hur de faktiskt anropas. DĂ€rför bestĂ€mde jag mig för att skriva denna artikel för att dela med mig av kunskap om de olika nĂ€tverkskomponenterna och deras samarbete i Kubernetes-klustret, vilket möjliggör att varje pod fĂ„r sin unika IP-adress.
Det finns olika sĂ€tt att organisera nĂ€tverkskommunikation i Kubernetes â liknande de olika typer av runtime för containrar. I denna publikation kommer jag att anvĂ€nda för att organisera nĂ€tverket i klustret, samt anvĂ€nda . Jag utgĂ„r ocksĂ„ frĂ„n att du vet hur nĂ€tverkskommunikationen mellan containrar fungerar, sĂ„ jag kommer endast att kort beröra det, uteslutande för kontextens skull.
NÄgra grundlÀggande begrepp
Containrar och nÀtverk: en kort översikt
Det finns flera utmÀrkta publikationer pÄ internet som förklarar hur containrar kommunicerar med varandra genom nÀtverket. DÀrför kommer jag att ge en allmÀn översikt av de grundlÀggande begreppen och begrÀnsa mig till en metod som innebÀr att skapa en Linux-brygga och kapsla in paket. Detaljer har uteslutits eftersom sjÀlva Àmnet för nÀtverksinteraktion mellan containrar förtjÀnar en egen artikel. LÀnkar till nÄgra sÀrskilt informativa och lÀrorika publikationer kommer att ges nedan.
Containrar pÄ samma vÀrd
Ett sÀtt att organisera IP-adresserad kommunikation mellan containrar som körs pÄ samma vÀrd Àr att skapa en Linux-bro. För detta skapas virtuella enheter i Kubernetes (och Docker) . Den ena Ànden av veth-enheten kopplas till containerns nÀtverksnamnrymd, den andra till i vÀrdets nÀtverk.
Alla containrar pÄ en vÀrd har en av Àndarna av veth kopplad till bron, genom vilken de kan kommunicera med varandra via IP-adresser. Linux-bron har ocksÄ en IP-adress och fungerar som en gateway för utgÄende (egress) trafik frÄn poddar som Àr avsedda för andra noder.

Containrar pÄ olika vÀrdar
Inkapsling av paket Àr ett sÀtt som gör att containrar pÄ olika noder kan kommunicera med varandra via IP-adresser. I Flannel ansvarar tekniken , som "paketerar" det ursprungliga paketet i ett UDP-paket och skickar det till destinationen.
I Kubernetes-klustret skapar Flannel en vxlan-enhet och kompletterar routingtabellen pÄ varje nod. Varje paket som Àr avsett för en container pÄ en annan vÀrd gÄr genom vxlan-enheten och inkapslas i ett UDP-paket. Vid destinationen extraheras det inkapslade paketet och vidarebefordras till den önskade podden.

Obs: Detta Àr bara ett av sÀtten att organisera nÀtverksinteraktion mellan containrar.
Vad Àr CRI?
Àr ett plugin som tillÄter kubelet att anvÀnda olika containerkörmiljöer. CRI-API Àr inbyggt i olika körmiljöer, sÄ anvÀndare kan vÀlja runtime efter eget val.
Vad Àr CNI?
representerar för att organisera en universell nÀtverkslösning för Linux-containrar. Dessutom inkluderar det , som ansvarar för olika funktioner vid instÀllning av podnÀtverk. CNI-plugin Àr en körbar fil som uppfyller specifikationen (vissa plugins diskuterar vi nedan).
Tilldelning av delnÀt till noder för att tilldela IP-adresser till poddar
Eftersom varje pod i klustret mÄste ha en IP-adress Àr det viktigt att se till att denna adress Àr unik. Detta uppnÄs genom att tilldela varje nod ett unikt delnÀt, frÄn vilket IP-adresser sedan tilldelas poddar pÄ den noden.
IPAM-kontrollern för noden
NÀr nodeipam överlÀmnas som en parameterflagga --controllers , tilldelar det varje nod ett separat delnÀt (podCIDR) frÄn klustrets CIDR (dvs. IP-adressomrÄden för klusternÀt). Eftersom dessa podCIDR:er inte överlappar varandra, blir det möjligt att tilldela varje pod en unik IP-adress.
En Kubernetes-nod fÄr sitt podCIDR nÀr den registreras första gÄngen i klustret. För att Àndra podCIDR pÄ noder mÄste de avregistreras och sedan registreras om, med motsvarande Àndringar gjorda i konfigurationen av Kubernetes styrskikt under mellanperioden. Du kan visa nodens podCIDR med hjÀlp av följande kommando:
$ kubectl get no -o json | jq '.spec.podCIDR'
10.244.0.0/24
Kubelet, container runtime-miljön och CNI-plugins: hur allt detta fungerar
SchemalÀggning av en pod pÄ en nod innebÀr att Ätskilliga förberedande ÄtgÀrder mÄste vidtas. I denna sektion kommer jag att fokusera endast pÄ de som direkt relaterar till konfigurationen av podens nÀtverk.
SchemalÀggning av en pod pÄ en viss nod utlöser följande kedja av hÀndelser:

HĂ€nvisning: .
Interaktionen mellan container runtime-miljö och CNI-plugins
Varje nĂ€tverksleverantör har sin egen CNI-plugin. Container-runtimen kör den för att konfigurera nĂ€tverket för podâen vid dess start. I fallet med containerd Ă€r det plugin .
Varje leverantör har sin egen agent. Den installeras pĂ„ alla Kubernetes-noder och ansvarar för nĂ€tverkskonfigurationen av podâar. Denna agent levereras antingen med CNI-konfigurationen eller skapar den autonomt pĂ„ noden. Konfigurationen hjĂ€lper CRI-plugin att veta vilken CNI-plugin som ska anropas.
Platsen för CNI-konfigurationen kan stÀllas in; som standard finns den i /etc/cni/net.d/<config-file>. Klustrets administratörer ansvarar ocksÄ för att installera CNI-plugins pÄ varje nod i klustret. Deras plats kan ocksÄ stÀllas in; standardkatalogen Àr /opt/cni/bin.
Vid anvÀndning av containerd kan sökvÀgarna för konfiguration och plugin-binarier anges i avsnittet [plugins."io.containerd.grpc.v1.cri".cni] pÄ .
Eftersom vi anvÀnder Flannel som nÀtverksleverantör, lÄt oss prata lite om dess konfiguration:
- Flanneld (Flannels demon) installeras vanligtvis i klustret som DaemonSet med
install-cnisom . Install-cniskapar (/etc/cni/net.d/10-flannel.conflist) pÄ varje nod.- Flanneld skapar en vxlan-enhet, hÀmtar nÀtverksmetadata frÄn API-servern och övervakar uppdateringar av poddar. I takt med att de skapas sprider den rutter för alla poddar över hela klustret.
- Dessa rutter gör det möjligt för poddar att kommunicera med varandra via IP-adresser.
För mer information om hur Flannel fungerar rekommenderar jag att anvÀnda lÀnkarna i slutet av artikeln.
HÀr Àr en översikt över interaktionen mellan Containerd CRI-plugin och CNI-plugins:

Som visas ovan anropar kubelet Containerd CRI-plugin för att skapa en pod, sedan anropar den CNI-plugin för att konfigurera poddets nÀtverk. Samtidigt anropar nÀtverksleverantörens CNI-plugin andra grundlÀggande CNI-plugins för att konfigurera olika aspekter av nÀtverket.
Interaktionen mellan CNI-plugins
Det finns olika CNI-plugins vars uppgift Àr att hjÀlpa till att stÀlla in nÀtverkskommunikation mellan containrar pÄ vÀrden. I denna artikel kommer vi att fokusera pÄ tre av dem.
CNI-plugin Flannel
Vid anvÀndning av Flannel som nÀtverksleverantör anropar Containerd CRI-komponenten , med hjÀlp av CNI-konfigurationsfilen /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
}
}
]
}
CNI-plugin Flannel fungerar tillsammans med Flanneld. Vid start hÀmtar Flanneld podCIDR och andra nÀtverksrelaterade detaljer frÄn API-servern och sparar dem i filen /run/flannel/subnet.env.
FLANNEL_NETWORK=10.244.0.0/16
FLANNEL_SUBNET=10.244.0.1/24
FLANNEL_MTU=1450
FLANNEL_IPMASQ=false
CNI-plugin Flannel anvÀnder data frÄn /run/flannel/subnet.env för att konfigurera och anropa CNI-bridge-plugin.
CNI-plugin Bridge
Denna plugin anropas med följande konfiguration:
{
"name": "cni0",
"type": "bridge",
"mtu": 1450,
"ipMasq": false,
"isGateway": true,
"ipam": {
"type": "host-local",
"subnet": "10.244.0.0/24"
}
}
Vid första anropet skapar den en Linux-bro med "name": "cni0", vilket anges i konfigurationen. Sedan skapas ett par veth för varje pod. Den ena Ànden kopplas till nÀtverksnamnrymden för containern, den andra gÄr in i Linux-bro nÀtverket pÄ vÀrden. kopplar samman alla vÀrdcontainrar till Linux-bro nÀtverket pÄ vÀrden.
NÀr instÀllningen av veth-paret Àr klar anropar Bridge-plugin den lokala (host-local) CNI-pluginen IPAM. Typen av IPAM-plugin kan konfigureras i CNI-konfigurationen som CRI-plugin anvÀnder för att anropa CNI-pluginen Flannel.
Lokala host-IPAM-plugins CNI
Bridge CNI anropar med följande konfiguration:
{
"name": "cni0",
"ipam": {
"type": "host-local",
"subnet": "10.244.0.0/24",
"dataDir": "/var/lib/cni/networks"
}
}
Host-local IPAM-plugin (IP Aadress Mmanagement â hantering av IP-adresser) returnerar en IP-adress för containern frĂ„n subnettet och sparar den allokerade IP-adressen pĂ„ vĂ€rden i den katalog som anges i avsnittet dataDir â /var/lib/cni/networks/<network-name=cni0>/<ip>. I den hĂ€r filen finns ID:t pĂ„ containern som tilldelades denna IP-adress.
Vid anrop av host-local IPAM-pluginet returneras följande data:
{
"ip4": {
"ip": "10.244.4.2",
"gateway": "10.244.4.3"
},
"dns": {}
}
Sammanfattning
Kube-controller-manager tilldelar varje nod en podCIDR. Pods pÄ varje nod fÄr IP-adresser frÄn adressrymden inom det tilldelade intervallet för podCIDR. Eftersom podCIDR:er för noderna inte överlappar, fÄr alla pods unika IP-adresser.
Kubernetes-klusteradministratören konfigurerar och installerar kubelet, container-runtime-miljö, nÀtverksleverantörens agent och kopierar CNI-plugins till varje nod. Vid start genererar nÀtverksleverantörens agent CNI-konfigurationen. NÀr en pod planeras pÄ en nod anropar kubelet CRI-pluginet för att skapa den. DÀrefter, om containerd anvÀnds, anropar Containerd CRI-pluginet det CNI-plugin som anges i CNI-konfigurationen för att stÀlla in nÀtverket för podden. Som ett resultat fÄr podden en IP-adress.
Det tog mig lite tid att förstÄ alla detaljer och nyanser av dessa interaktioner. Jag hoppas att den erfarenheten ocksÄ hjÀlper dig att bÀttre förstÄ hur Kubernetes fungerar. Om jag gör nÄgot fel, tveka inte att kontakta mig pÄ eller via . Tveka inte att höra av dig om du vill diskutera aspekter av denna artikel eller nÄgot annat. Jag ser fram emot att prata med dig!
LĂ€nkar
Containrar och nÀtverk
Hur Flannel fungerar
CRI och CNI
P.S. frÄn översÀttaren
LÀs Àven i vÄr blogg:
- «»;
- »Illustrerad guide till nÀtverksuppbyggnaden i Kubernetes«: , ;
- «».
KĂ€lla: habr.com
