Hvernig fær Kubernetes pod IP tölu?

Athugið. þýð.: Þessi grein, skrifuð af SRE verkfræðingi frá LinkedIn, fer ítarlega um innri töfra Kubernetes - nánar tiltekið, samspil CRI, CNI og kube-apiserver - sem gerist þegar úthluta þarf IP-tölu næsta pod.

Ein af grunnkröfunum Kubernetes net líkan er að hver pod verður að hafa sína eigin IP tölu og allir aðrir pod í klasanum verða að geta haft samband við hann á því heimilisfangi. Það eru margir „netveitendur“ (Flannel, Calico, Canal, osfrv.) sem hjálpa til við að innleiða þetta netlíkan.

Þegar ég byrjaði að vinna með Kubernetes var mér ekki alveg ljóst hvernig fræbelgur fá IP tölur sínar. Jafnvel með skilningi á því hvernig einstakir þættir virkuðu, var erfitt að ímynda sér að þeir myndu vinna saman. Til dæmis vissi ég hvað CNI viðbætur voru fyrir, en ég hafði ekki hugmynd um hvernig nákvæmlega þau hétu. Þess vegna ákvað ég að skrifa þessa grein til að miðla þekkingu um hina ýmsu nethluti og hvernig þeir vinna saman í Kubernetes þyrping, sem gerir hverjum pod kleift að fá sína eigin IP tölu.

Það eru mismunandi leiðir til að skipuleggja netkerfi í Kubernetes, rétt eins og það eru mismunandi keyrslutímavalkostir fyrir gáma. Þetta rit mun nota Flannel að skipuleggja net í klasa og sem keyranlegt umhverfi - Containerd. Ég er líka að gera ráð fyrir því að þú vitir hvernig netkerfi á milli gáma virkar, svo ég snerti það aðeins í stuttu máli, bara fyrir samhengi.

Nokkur grunnhugtök

Gámar og netið: Stutt yfirlit

Það eru fullt af frábærum ritum á netinu sem útskýra hvernig gámar hafa samskipti sín á milli í gegnum netið. Þess vegna mun ég aðeins gefa almennt yfirlit yfir grunnhugtökin og takmarka mig við eina nálgun, sem felur í sér að búa til Linux brú og hjúpa pakka. Upplýsingar er sleppt þar sem efni gámanetsins sjálft á skilið sérstaka grein. Tenglar á sum sérstaklega innsýn og fræðandi rit verða veitt hér að neðan.

Gámar á einum hýsil

Ein leið til að skipuleggja samskipti í gegnum IP-tölur milli gáma sem keyra á sama hýsli felur í sér að búa til Linux brú. Í þessu skyni eru sýndartæki búin til í Kubernetes (og Docker) veth (raunverulegt ethernet). Annar endi veth tækisins tengist nafnrými gámsins netkerfis, hinn við Linux brú á hýsilnetinu.

Allir gámar á sama hýsil eru með annan endann á veth tengdum við brú þar sem þeir geta átt samskipti sín á milli í gegnum IP tölur. Linux brúin hefur einnig IP tölu og virkar sem gátt fyrir útgönguumferð frá belgjum sem eru ætluð öðrum hnútum.

Hvernig fær Kubernetes pod IP tölu?

Gámar á mismunandi vélum

Pakkahjúpun er ein aðferð sem gerir ílátum á mismunandi hnútum kleift að eiga samskipti sín á milli með IP-tölum. Hjá Flannel ber tæknin ábyrgð á þessu tækifæri. vxlan, sem „pakkar“ upprunalega pakkanum í UDP pakka og sendir hann síðan á áfangastað.

Í Kubernetes klasa býr Flannel til vxlan tæki og uppfærir leiðartöfluna á hverjum hnút í samræmi við það. Hver pakki sem ætlaður er í gám á öðrum hýsil fer í gegnum vxlan tækið og er hjúpað í UDP pakka. Á áfangastaðnum er hreiður pakkinn dreginn út og hann sendur á viðkomandi belg.

Hvernig fær Kubernetes pod IP tölu?
Athugið: Þetta er bara ein leið til að skipuleggja netsamskipti milli gáma.

Hvað er CRI?

CRI (Container Runtime Interface) er viðbót sem gerir kubelet kleift að nota mismunandi keyrslutímaumhverfi í gáma. CRI API er innbyggt í ýmsa keyrslutíma, þannig að notendur geta valið keyrslutíma að eigin vali.

Hvað er CNI?

Verkefni CNI er a forskrift að skipuleggja alhliða netlausn fyrir Linux gáma. Að auki felur það í sér viðbætur, ábyrgur fyrir ýmsum aðgerðum þegar þú setur upp pod net. CNI viðbótin er keyranleg skrá sem er í samræmi við forskriftina (við munum ræða nokkur viðbætur hér að neðan).

Úthlutun undirneta til hnúta til að úthluta IP-tölum á belg

Þar sem hver fræbelgur í klasa verður að hafa IP tölu er mikilvægt að tryggja að þetta heimilisfang sé einstakt. Þetta er náð með því að úthluta hverjum hnút einstakt undirnet, þaðan sem belgjum á þeim hnút er síðan úthlutað IP tölum.

Node IPAM stjórnandi

Þegar nodeipam samþykkt sem fánabreytu --controllers kúbe-stjórnandi-stjórnandi, það úthlutar sérstakt undirneti (podCIDR) á hvern hnút úr klasa CIDR (þ.e. svið IP vistfanga fyrir klasanetið). Þar sem þessi podCIDR skarast ekki, verður mögulegt fyrir hverja fræbelg að fá úthlutað einstöku IP tölu.

Kubernetes hnút er úthlutað podCIDR þegar hann er upphaflega skráður hjá þyrpingunni. Til að breyta podCIDR hnúta þarftu að afskrá þá og síðan endurskrá þá og gera viðeigandi breytingar á Kubernetes stjórnlagsstillingunum á milli. Þú getur sýnt podCIDR hnúts með því að nota eftirfarandi skipun:

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

Kubelet, keyrslutími gáma og CNI viðbætur: hvernig þetta virkar allt

Að skipuleggja fræbelg fyrir hvern hnút felur í sér mörg undirbúningsskref. Í þessum hluta mun ég einbeita mér aðeins að þeim sem tengjast beint uppsetningu pod-nets.

Að skipuleggja belg á ákveðinn hnút kallar á eftirfarandi atburðarás:

Hvernig fær Kubernetes pod IP tölu?

Hjálp: Arkitektúr Containerd CRI viðbætur.

Samspil milli keyrslutíma gáma og CNI viðbætur

Hver netveita hefur sitt eigið CNI viðbót. Keyrslutími gámsins keyrir hann til að stilla netið fyrir podinn þegar hann ræsist. Ef um er að ræða containerd er CNI viðbótin ræst af viðbótinni Containerd CRI.

Þar að auki hefur hver veitandi sinn umboðsmann. Það er sett upp á öllum Kubernetes hnútum og er ábyrgt fyrir netstillingu fræbelgs. Þessi umboðsmaður er annað hvort innifalinn í CNI stillingunni eða býr hana til sjálfstætt á hnútnum. Stillingin hjálpar CRI viðbótinni að stilla hvaða CNI viðbót á að hringja í.

Hægt er að aðlaga staðsetningu CNI stillingar; sjálfgefið er það í /etc/cni/net.d/<config-file>. Klasastjórnendur bera einnig ábyrgð á að setja upp CNI viðbætur á hverjum klasahnút. Staðsetning þeirra er einnig sérhannaðar; sjálfgefin skrá - /opt/cni/bin.

Þegar containerd er notað er hægt að stilla slóðir fyrir stillingar viðbótarinnar og tvíliða í hlutanum [plugins.«io.containerd.grpc.v1.cri».cni] в containerd stillingarskrá.

Þar sem við erum að nota Flannel sem netveitu okkar, skulum við tala aðeins um uppsetningu þess:

  • Flanneld (Flannel's demon) er venjulega settur upp í klasa sem DaemonSet með install-cni sem init ílát.
  • Install-cni skapar CNI stillingarskrá (/etc/cni/net.d/10-flannel.conflist) á hverjum hnút.
  • Flanneld býr til vxlan tæki, sækir net lýsigögn frá API þjóninum og fylgist með uppfærslum á pod. Þegar þeir eru búnir til dreifir það leiðum til allra fræbelgja um allan klasann.
  • Þessar leiðir leyfa belgjum að hafa samskipti sín á milli í gegnum IP tölur.

Fyrir ítarlegri upplýsingar um starf Flannel mæli ég með því að nota tenglana í lok greinarinnar.

Hér er skýringarmynd af samspili Containerd CRI viðbótarinnar og CNI viðbótanna:

Hvernig fær Kubernetes pod IP tölu?

Eins og þú sérð hér að ofan, kallar kubelet Containerd CRI viðbótina til að búa til fræbelginn, sem hringir síðan í CNI viðbótina til að stilla net belgsins. Með því að gera það kallar CNI viðbót netveitunnar til annarra kjarna CNI viðbætur til að stilla ýmsa þætti netsins.

Samskipti milli CNI viðbætur

Það eru ýmsar CNI viðbætur sem hafa það hlutverk að hjálpa til við að setja upp netsamskipti á milli gáma á hýsingaraðilanum. Þessi grein mun fjalla um þrjá þeirra.

CNI tappi Flanell

Þegar Flannel er notað sem netveita hringir Containerd CRI hluti CNI tappi Flanellmeð því að nota CNI stillingarskrána /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
      }
    }
  ]
}

Flannel CNI viðbótin virkar í tengslum við Flanneld. Við ræsingu sækir Flanneld podCIDR og aðrar nettengdar upplýsingar frá API þjóninum og vistar þær í skrá /run/flannel/subnet.env.

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

Flannel CNI viðbótin notar gögn frá /run/flannel/subnet.env til að stilla og hringja í CNI brú viðbótina.

CNI viðbót Bridge

Þessi viðbót er kölluð með eftirfarandi uppsetningu:

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

Þegar hringt er í fyrsta skipti, býr það til Linux brú með «name»: «cni0», sem er tilgreint í stillingunni. Þá er búið til veth par fyrir hvern belg. Annar endi þess er tengdur við nafnrými gámsins, hinn er innifalinn í Linux brúnni á hýsilnetinu. CNI viðbót Bridge tengir alla hýsilgáma við Linux brú á hýsilnetinu.

Eftir að hafa lokið við að setja upp veth parið, kallar Bridge viðbótin á hýsingarstaðbundna IPAM CNI viðbótina. Hægt er að stilla IPAM viðbótina í CNI stillingunni sem CRI viðbótin notar til að kalla Flannel CNI viðbótina.

Host-staðbundin IPAM CNI viðbætur

Bridge CNI kallar hýsingarstaðbundið IPAM viðbót CNI með eftirfarandi uppsetningu:

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

Host-staðbundið IPAM viðbót (IP Address Management - stjórnun IP tölu) skilar IP tölu fyrir ílátið frá undirnetinu og geymir úthlutað IP á hýsilinn í möppunni sem tilgreind er í hlutanum dataDir - /var/lib/cni/networks/<network-name=cni0>/<ip>. Þessi skrá inniheldur auðkenni ílátsins sem þessu IP-tölu er úthlutað.

Þegar hringt er í hýsingarstaðbundið IPAM viðbótina skilar það eftirfarandi gögnum:

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

Yfirlit

Kube-controller-manager úthlutar podCIDR á hvern hnút. Flokkar hvers hnúts fá IP-tölur frá vistfangarýminu á úthlutaða podCIDR sviðinu. Þar sem podCIDR hnútanna skarast ekki, fá allir belg einstakar IP tölur.

Kerfisstjóri Kubernetes klasa stillir og setur upp kubelet, gámakeyrslutíma, umboðsmann netveitunnar og afritar CNI viðbæturnar á hvern hnút. Við ræsingu býr umboðsmaður netveitunnar til CNI stillingu. Þegar fræbelgur er áætlaður í hnút kallar kubelet CRI viðbótina til að búa það til. Næst, ef containerd er notað, kallar Containerd CRI viðbótin CNI viðbótina sem tilgreind er í CNI stillingunni til að stilla net belgsins. Fyrir vikið fær podinn IP tölu.

Það tók mig nokkurn tíma að skilja alla fínleika og blæbrigði allra þessara samskipta. Ég vona að þessi reynsla muni hjálpa þér að skilja betur hvernig Kubernetes virkar. Ef ég hef rangt fyrir mér um eitthvað, vinsamlegast hafðu samband við mig á twitter eða á heimilisfanginu [netvarið]. Ekki hika við að hafa samband ef þú vilt ræða þætti þessarar greinar eða eitthvað annað. Mér þætti gaman að spjalla við þig!

tilvísanir

Gámar og net

Hvernig virkar Flannel?

CRI og CNI

PS frá þýðanda

Lestu líka á blogginu okkar:

Heimild: www.habr.com

Bæta við athugasemd