Hur en pod i Kubernetes fÄr en IP-adress

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 för det nÀtverksmodell Kubernetes À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 Flannel för att organisera nĂ€tverket i klustret, samt anvĂ€nda Containerd. 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) veth (virtuell ethernet). Den ena Ànden av veth-enheten kopplas till containerns nÀtverksnamnrymd, den andra till Linux-bro 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.

Hur en pod i Kubernetes fÄr en IP-adress

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

Hur en pod i Kubernetes fÄr en IP-adress
Obs: Detta Àr bara ett av sÀtten att organisera nÀtverksinteraktion mellan containrar.

Vad Àr CRI?

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

CNI-projektet representerar specifikationen för att organisera en universell nÀtverkslösning för Linux-containrar. Dessutom inkluderar det plugins, 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 kube-controller-manager, 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:

Hur en pod i Kubernetes fÄr en IP-adress

HÀnvisning: Arkitekturen för CRI-plugins i Containerd.

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

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Ä containerds konfigurationsfil.

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-cni som init-container.
  • Install-cni skapar CNI-konfigurationsfilen (/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:

Hur en pod i Kubernetes fÄr en IP-adress

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 CNI-plugin Flannel, 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. CNI-plugin Bridge 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 host-local IPAM-plugin CNI 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Ä Twitter eller via hello@ronaknathani.com. 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:

KĂ€lla: habr.com

Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar đŸ”„ Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster