Kiel Kubernetes-podo ricevas IP-adreson?

Notu. transl.: Ĉi tiu artikolo, verkita de SRE-inĝeniero de LinkedIn, eniras en detalojn pri la interna magio en Kubernetes - pli precize, la interago de CRI, CNI kaj kube-apiserver - tio okazas kiam la sekva pod bezonas esti asignita IP-adreso.

Unu el la bazaj postuloj Kubernetes retomodelo estas ke ĉiu pod devas havi sian propran IP-adreson kaj iu ajn alia pod en la areto devas povi kontakti ĝin ĉe tiu adreso. Estas multaj retaj "provizantoj" (Flanelo, Calico, Kanalo, ktp.) kiuj helpas efektivigi ĉi tiun retan modelon.

Kiam mi unue komencis labori kun Kubernetes, ne estis tute klare al mi, kiel ĝuste podoj ricevas siajn IP-adresojn. Eĉ kun kompreno de kiel la individuaj komponantoj funkciis, estis malfacile imagi ilin laborante kune. Ekzemple, mi sciis por kio CNI-kromaĵoj estas, sed mi tute ne sciis, kiel ĝuste ili nomiĝas. Sekve, mi decidis skribi ĉi tiun artikolon por dividi scion pri la diversaj retaj komponantoj kaj kiel ili funkcias kune en Kubernetes-areo, kiu ebligas al ĉiu pod akiri sian propran unikan IP-adreson.

Estas malsamaj manieroj organizi reton en Kubernetes, same kiel ekzistas malsamaj rultempaj elektoj por ujoj. Ĉi tiu eldonaĵo uzos Fandalo organizi reton en areto, kaj kiel plenumebla medio - Containerd. Mi ankaŭ faras la supozon, ke vi scias kiel funkcias interkonektado inter ujoj, do mi simple tuŝos ĝin mallonge, nur por kunteksto.

Kelkaj bazaj konceptoj

Ujoj kaj la Reto: Mallonga Superrigardo

Estas multaj bonegaj publikaĵoj en la Interreto, kiuj klarigas kiel ujoj komunikas unu kun la alia tra la reto. Tial mi nur donos ĝeneralan superrigardon de la bazaj konceptoj kaj limigos min al unu aliro, kiu implikas krei Linuksan ponton kaj enkapsuligi pakaĵojn. Detaloj estas preterlasitaj, ĉar la temo pri kontenera reto mem meritas apartan artikolon. Ligiloj al iuj precipe komprenemaj kaj edukaj publikaĵoj estos provizitaj sube.

Ujoj sur unu gastiganto

Unu maniero organizi komunikadon per IP-adresoj inter ujoj kurantaj sur la sama gastiganto implikas krei Linuksan ponton. Por ĉi tiu celo, virtualaj aparatoj estas kreitaj en Kubernetes (kaj Docker) veth (virtuala etereto). Unu fino de la veth-aparato konektas al la retnomspaco de la ujo, la alia al Linukso ponto sur la gastiga reto.

Ĉiuj ujoj sur la sama gastiganto havas unu finon de la veth ligita al ponto tra kiu ili povas komuniki unu kun la alia per IP-adresoj. La Linukso-ponto ankaŭ havas IP-adreson kaj funkcias kiel enirejo por elira trafiko de la podoj destinitaj por aliaj nodoj.

Kiel Kubernetes-podo ricevas IP-adreson?

Ujoj sur malsamaj gastigantoj

Pakaĵeto estas unu metodo kiu permesas ujojn sur malsamaj nodoj komuniki kun unu la alian uzante IP-adresojn. Ĉe Flannel, teknologio respondecas pri ĉi tiu ŝanco. vxlan, kiu "pakigas" la originan pakaĵeton en UDP-pakaĵon kaj tiam sendas ĝin al sia celloko.

En Kubernetes-areto, Flannel kreas vxlan-aparaton kaj ĝisdatigas la vojtabelon sur ĉiu nodo laŭe. Ĉiu pakaĵeto destinita por ujo sur malsama gastiganto pasas tra la vxlan-aparato kaj estas enkapsuligita en UDP-pakaĵeto. Ĉe la celloko, la nestita pakaĵeto estas ĉerpita kaj plusendita al la dezirata balgo.

Kiel Kubernetes-podo ricevas IP-adreson?
Noto: Ĉi tio estas nur unu maniero organizi retan komunikadon inter ujoj.

Kio estas CRI?

CRI (Uja Rultempa Interfaco) estas kromaĵo kiu permesas al kubelet uzi malsamajn ujajn rultempajn mediojn. La CRI API estas konstruita en diversaj rultempoj, do uzantoj povas elekti la rultempon de sia elekto.

Kio estas CNI?

Projekto CNI estas a specifo organizi universalan retan solvon por Linukso-ujoj. Krome, ĝi inkluzivas kromaĵojn, respondeca pri diversaj funkcioj dum agordado de podreto. La CNI-kromaĵo estas plenumebla dosiero, kiu konformas al la specifo (ni diskutos kelkajn kromaĵojn sube).

Asigno de subretoj al nodoj por atribui IP-adresojn al podoj

Ĉar ĉiu pod en areto devas havi IP-adreson, estas grave certigi, ke ĉi tiu adreso estas unika. Tio estas atingita asignante al ĉiu nodo unikan subreton, de kiu la balgoj sur tiu nodo tiam estas asignitaj IP-adresoj.

Nodo IPAM-Regilo

Kiam nodeipam pasita kiel flaga parametro --controllers kube-controller-manager, ĝi asignas apartan subreton (podCIDR) al ĉiu nodo de la areto CIDR (t.e., la vico da IP-adresoj por la aretoreto). Ĉar ĉi tiuj podCIDR-oj ne interkovras, iĝas eble al ĉiu balgo esti asignita unika IP-adreso.

Kubernetes-nodo ricevas podCIDR kiam ĝi estas komence registrita kun la areto. Por ŝanĝi la podCIDR de nodoj, vi devas nuligi ilin kaj poste reregistri ilin, farante taŭgajn ŝanĝojn al la agordo de la kontrola tavolo de Kubernetes intere. Vi povas montri la podCIDR de nodo uzante la jenan komandon:

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

Kubelet, kontenera rultempo kaj CNI-kromaĵoj: kiel ĉio funkcias

Planado de pod per nodo implikas multajn preparajn paŝojn. En ĉi tiu sekcio, mi koncentriĝos nur pri tiuj, kiuj rekte rilatas al starigo de podreto.

Plani pod al certa nodo ekigas la sekvan ĉenon de eventoj:

Kiel Kubernetes-podo ricevas IP-adreson?

Helpo: Arkitekturo de Containerd CRI-aldonaĵoj.

Interago inter kontenera rultempo kaj CNI-kromaĵoj

Ĉiu retoprovizanto havas sian propran CNI-aldonaĵon. La rultempo de la ujo ruligas ĝin por agordi la reton por la pod kiam ĝi komenciĝas. En la kazo de containerd, la CNI-kromaĵo estas lanĉita de la kromaĵo Containerd CRI.

Krome, ĉiu provizanto havas sian propran agenton. Ĝi estas instalita sur ĉiuj Kubernetes-nodoj kaj respondecas pri la reto-agordo de podoj. Ĉi tiu agento estas aŭ inkluzivita kun la CNI-agordo aŭ sendepende kreas ĝin sur la nodo. La agordo helpas la CRI-aldonaĵon agordi kiun CNI-aldonaĵon voki.

La loko de la CNI-agordo povas esti personecigita; defaŭlte ĝi estas en /etc/cni/net.d/<config-file>. Administrantoj de clusteroj ankaŭ respondecas pri instalado de CNI-aldonaĵoj sur ĉiu clusternodo. Ilia loko ankaŭ estas agordebla; defaŭlta dosierujo - /opt/cni/bin.

Kiam vi uzas containerd, la vojoj por la aldonaĵagordo kaj binaroj povas esti agordita en la sekcio [plugins.«io.containerd.grpc.v1.cri».cni] в containerd-agorda dosiero.

Ĉar ni uzas Flannel kiel nian retprovizanton, ni parolu iomete pri agordo de ĝi:

  • Flanneld (la demono de Flannel) estas kutime instalita en areto kiel DaemonSet kun install-cni kiel init-ujo.
  • Install-cni kreas CNI-agorda dosiero (/etc/cni/net.d/10-flannel.conflist) sur ĉiu nodo.
  • Flanneld kreas vxlan-aparaton, prenas retajn metadatenojn de la API-servilo kaj kontrolas podajn ĝisdatigojn. Ĉar ili estas kreitaj, ĝi distribuas itinerojn al ĉiuj balgoj tra la areto.
  • Ĉi tiuj itineroj permesas al balgoj komuniki unu kun la alia per IP-adresoj.

Por pli detalaj informoj pri la laboro de Flannel, mi rekomendas uzi la ligilojn ĉe la fino de la artikolo.

Jen diagramo de la interago inter la kromaĵo Containerd CRI kaj la kromprogramoj de CNI:

Kiel Kubernetes-podo ricevas IP-adreson?

Kiel vi povas vidi supre, la kubelet vokas la kromprogramon Containerd CRI por krei la pod, kiu poste vokas la CNI-kromaĵon por agordi la reton de la pod. Farante tion, la CNI-kromaĵo de la retprovizanto vokas aliajn kernajn CNI-kromaĵojn por agordi diversajn aspektojn de la reto.

Interago inter CNI-kromaĵoj

Estas diversaj CNI-kromaĵoj, kies tasko estas helpi starigi retan komunikadon inter ujoj sur la gastiganto. Ĉi tiu artikolo diskutos tri el ili.

CNI kromaĵo Flanelo

Kiam vi uzas Flannel kiel retprovizanton, la Containerd CRI-komponento vokas CNI kromaĵo Flanelouzante la CNI-agordan dosieron /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
      }
    }
  ]
}

La Flannel CNI-kromaĵo funkcias kune kun Flanneld. Dum ekfunkciigo, Flanneld prenas podCIDR kaj aliajn ret-rilatajn detalojn de la API-servilo kaj konservas ilin en dosiero. /run/flannel/subnet.env.

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

La kromaĵo Flannel CNI uzas datumojn de /run/flannel/subnet.env por agordi kaj voki la CNI-pontan kromprogramon.

CNI kromaĵo Ponto

Ĉi tiu kromaĵo estas vokita kun la sekva agordo:

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

Kiam oni vokis la unuan fojon, ĝi kreas Linuksan ponton kun «name»: «cni0», kiu estas indikita en la agordo. Tiam veth paro estas kreita por ĉiu balgo. Unu fino de ĝi estas konektita al la retnomspaco de la ujo, la alia estas inkluzivita en la Linukso-ponto sur la gastiga reto. CNI kromaĵo Ponto ligas ĉiujn gastigajn ujojn al Linukso-ponto sur la gastiga reto.

Fininte agordi la veth-paron, la aldonaĵo Bridge nomas la gastiganto-loka IPAM CNI-aldonaĵo. La IPAM-aldonaĵospeco povas esti agordita en la CNI-agordo, kiun la CRI-kromaĵo uzas por nomi la Flannel CNI-aldonaĵon.

Gastiganto-lokaj IPAM CNI-aldonaĵoj

Ponto CNI vokas gastiganto-loka IPAM kromaĵo CNI kun la sekva agordo:

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

Gastiganto-loka IPAM kromaĵo (IP Avestaĵo Madministrado - administrado de IP-adresoj) resendas la IP-adreson por la ujo el la subreto kaj konservas la asignitan IP sur la gastiganto en la dosierujo specifita en la sekcio dataDir - /var/lib/cni/networks/<network-name=cni0>/<ip>. Ĉi tiu dosiero enhavas la ID de la ujo al kiu ĉi tiu IP-adreso estas asignita.

Kiam vi vokas la gastigan lokan IPAM-aldonaĵon, ĝi resendas la sekvajn datumojn:

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

Resumo

Kube-controller-manager asignas podCIDR al ĉiu nodo. La podoj de ĉiu nodo ricevas IP-adresojn de la adresspaco en la asignita podCIDR-intervalo. Ĉar la podCIDR de la nodoj ne interkovras, ĉiuj balgoj ricevas unikajn IP-adresojn.

La administranto de Kubernetes-grupo agordas kaj instalas la kubelet, ujran rultempon, retan provizanto-agenton, kaj kopias la CNI-kromaĵojn al ĉiu nodo. Dum ekfunkciigo, la reta provizanto generas CNI-agordon. Kiam pod estas planita al nodo, la kubelet vokas la CRI-aldonaĵon por krei ĝin. Poste, se containerd estas uzata, la kromaĵo Containerd CRI vokas la CNI-aldonaĵon specifitan en la CNI-agordo por agordi la reton de la pod. Kiel rezulto, la pod ricevas IP-adreson.

Mi bezonis iom da tempo por kompreni ĉiujn subtilecojn kaj nuancojn de ĉiuj ĉi tiuj interagoj. Mi esperas, ke ĉi tiu sperto helpos vin pli bone kompreni kiel funkcias Kubernetes. Se mi eraras pri io, bonvolu kontakti min ĉe Twitter aŭ ĉe la adreso [retpoŝte protektita]. Bonvolu kontakti se vi ŝatus diskuti aspektojn de ĉi tiu artikolo aŭ ion alian. Mi ŝatus babili kun vi!

referencoj

Ujoj kaj reto

Kiel funkcias Flanelo?

CRI kaj CNI

PS de tradukisto

Legu ankaŭ en nia blogo:

fonto: www.habr.com

Aldoni komenton