Je, poda ya Kubernetes inapataje anwani ya IP?

Kumbuka. tafsiri.: Makala haya, yaliyoandikwa na mhandisi wa SRE kutoka LinkedIn, yanaeleza kwa kina kuhusu uchawi wa ndani katika Kubernetes - kwa usahihi zaidi, mwingiliano wa CRI, CNI na kube-apiserver - ambayo hutokea wakati pod inayofuata inahitaji kukabidhiwa anwani ya IP.

Moja ya mahitaji ya msingi Mfano wa mtandao wa Kubernetes ni kwamba kila ganda lazima liwe na anwani yake ya IP na ganda lingine lolote kwenye nguzo lazima liweze kuwasiliana nalo kwa anwani hiyo. Kuna "watoa huduma" wengi wa mtandao (Flannel, Calico, Canal, nk) ambayo husaidia kutekeleza mtindo huu wa mtandao.

Nilipoanza kufanya kazi na Kubernetes kwa mara ya kwanza, haikuwa wazi kabisa kwangu jinsi maganda yanavyopata anwani zao za IP. Hata kwa kuelewa jinsi vipengele vya mtu binafsi vilifanya kazi, ilikuwa vigumu kufikiria kufanya kazi pamoja. Kwa mfano, nilijua programu-jalizi za CNI zilikuwa za nini, lakini sikujua jinsi zilivyoitwa. Kwa hiyo, niliamua kuandika makala hii ili kushiriki ujuzi kuhusu vipengele mbalimbali vya mtandao na jinsi wanavyofanya kazi pamoja katika kundi la Kubernetes, ambayo inaruhusu kila pod kupata anwani yake ya kipekee ya IP.

Kuna njia tofauti za kupanga mitandao katika Kubernetes, kama vile kuna chaguo tofauti za wakati wa kutekeleza kwa vyombo. Chapisho hili litatumika Flannel kupanga mtandao katika nguzo, na kama mazingira yanayoweza kutekelezwa - Imewekwa kwenye vyombo. Pia ninafanya dhana kuwa unajua jinsi mitandao kati ya vyombo inavyofanya kazi, kwa hivyo nitaigusa kwa ufupi, kwa muktadha tu.

Baadhi ya dhana za kimsingi

Vyombo na Mtandao: Muhtasari mfupi

Kuna machapisho mengi bora kwenye Mtandao ambayo yanaelezea jinsi vyombo huwasiliana kupitia mtandao. Kwa hiyo, nitatoa tu muhtasari wa jumla wa dhana za msingi na kujizuia kwa njia moja, ambayo inahusisha kuunda daraja la Linux na vifurushi vya encapsulating. Maelezo yameachwa, kwa kuwa mada ya mtandao wa chombo yenyewe inastahili makala tofauti. Viungo vya baadhi ya machapisho yenye maarifa na elimu vitatolewa hapa chini.

Vyombo kwenye mwenyeji mmoja

Njia moja ya kupanga mawasiliano kupitia anwani za IP kati ya vyombo vinavyoendesha kwenye seva pangishi moja inahusisha kuunda daraja la Linux. Kwa kusudi hili, vifaa pepe vinaundwa katika Kubernetes (na Docker) veth (ethaneti halisi). Mwisho mmoja wa kifaa cha veth huunganishwa na nafasi ya jina ya mtandao wa chombo, na nyingine kwa Daraja la Linux kwenye mtandao wa mwenyeji.

Vyombo vyote kwenye seva pangishi moja vina mwisho mmoja wa veth iliyounganishwa kwenye daraja ambalo wanaweza kuwasiliana kupitia anwani za IP. Daraja la Linux pia lina anwani ya IP na hufanya kama lango la kuingia kwa trafiki kutoka kwa maganda yanayolengwa kwa nodi zingine.

Je, poda ya Kubernetes inapataje anwani ya IP?

Vyombo kwenye majeshi tofauti

Ufungaji wa pakiti ni njia moja ambayo inaruhusu vyombo kwenye nodi tofauti kuwasiliana kwa kutumia anwani za IP. Katika Flannel, teknolojia inawajibika kwa fursa hii. vxlan, ambayo "hupakia" pakiti asili kwenye pakiti ya UDP na kisha kuituma kwenye lengwa lake.

Katika kundi la Kubernetes, Flannel huunda kifaa cha vxlan na kusasisha jedwali la njia kwenye kila nodi ipasavyo. Kila pakiti inayotumwa kwa kontena kwenye seva pangishi tofauti hupitia kifaa cha vxlan na kuingizwa kwenye pakiti ya UDP. Kwenye lengwa, kifurushi kilichowekwa kiota hutolewa na kutumwa kwa ganda linalohitajika.

Je, poda ya Kubernetes inapataje anwani ya IP?
Kumbuka: Hii ni njia moja tu ya kupanga mawasiliano ya mtandao kati ya vyombo.

CRI ni nini?

CRI (Kiolesura cha Muda wa Kuendesha Kontena) ni programu-jalizi inayoruhusu kubelet kutumia mazingira tofauti ya wakati wa kutumia kontena. API ya CRI imeundwa katika nyakati tofauti za kukimbia, kwa hivyo watumiaji wanaweza kuchagua wakati wa kukimbia wanaopenda.

CNI ni nini?

Mradi wa CNI ni vipimo kupanga suluhisho la mtandao zima kwa vyombo vya Linux. Kwa kuongeza, inajumuisha programu-jalizi, inawajibika kwa vitendaji mbalimbali wakati wa kusanidi mtandao wa pod. Programu-jalizi ya CNI ni faili inayoweza kutekelezwa ambayo inatii vipimo (tutajadili baadhi ya programu-jalizi hapa chini).

Ugawaji wa subnets kwa nodi za kugawa anwani za IP kwa maganda

Kwa kuwa kila ganda kwenye nguzo lazima liwe na anwani ya IP, ni muhimu kuhakikisha kuwa anwani hii ni ya kipekee. Hii inafanikiwa kwa kugawa kila nodi subnet ya kipekee, ambayo maganda kwenye nodi hiyo hupewa anwani za IP.

Kidhibiti cha IPAM cha nodi

Wakati nodeipam imepitishwa kama kigezo cha bendera --controllers kube-controller-meneja, inatenga subnet tofauti (podCIDR) kwa kila nodi kutoka kwa nguzo ya CIDR (yaani, anuwai ya anwani za IP za mtandao wa nguzo). Kwa kuwa podCIDR hizi haziingiliani, inakuwa rahisi kwa kila ganda kutengewa anwani ya kipekee ya IP.

Nodi ya Kubernetes imepewa podCIDR wakati imesajiliwa mwanzoni na nguzo. Ili kubadilisha podCIDR ya nodi, unahitaji kuzifuta usajili na kisha kuzisajili upya, ukifanya mabadiliko yanayofaa kwenye usanidi wa safu ya udhibiti wa Kubernetes katikati. Unaweza kuonyesha podCIDR ya nodi kwa kutumia amri ifuatayo:

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

Kubelet, wakati wa kukimbia wa chombo na programu-jalizi za CNI: jinsi yote inavyofanya kazi

Kupanga ganda kwa nodi inahusisha hatua nyingi za maandalizi. Katika sehemu hii, nitazingatia tu wale ambao wanahusiana moja kwa moja na kuanzisha mtandao wa pod.

Kupanga ganda kwa nodi fulani husababisha mlolongo wa matukio yafuatayo:

Je, poda ya Kubernetes inapataje anwani ya IP?

Msaada: Usanifu wa programu jalizi za Containerd CRI.

Mwingiliano kati ya muda wa matumizi ya kontena na programu jalizi za CNI

Kila mtoa huduma wa mtandao ana programu-jalizi yake ya CNI. Muda wa kukimbia wa kontena huiendesha ili kusanidi mtandao wa ganda inapoanza. Katika kesi ya kontena, programu-jalizi ya CNI inazinduliwa na programu-jalizi CRI iliyojumuishwa.

Aidha, kila mtoaji ana wakala wake. Imewekwa kwenye nodi zote za Kubernetes na inawajibika kwa usanidi wa mtandao wa maganda. Wakala huyu amejumuishwa na usanidi wa CNI au anaiunda kwa kujitegemea kwenye nodi. Usanidi husaidia programu-jalizi ya CRI kuweka programu-jalizi ya CNI kupiga simu.

Eneo la usanidi wa CNI linaweza kubinafsishwa; kwa chaguo-msingi iko ndani /etc/cni/net.d/<config-file>. Wasimamizi wa nguzo pia wanawajibika kusakinisha programu-jalizi za CNI kwenye kila nodi ya nguzo. Eneo lao pia linaweza kubinafsishwa; saraka chaguo-msingi - /opt/cni/bin.

Wakati wa kutumia kontena, njia za usanidi wa programu-jalizi na jozi zinaweza kuwekwa kwenye sehemu [plugins.Β«io.containerd.grpc.v1.criΒ».cni] Π² faili ya usanidi iliyojumuishwa.

Kwa kuwa tunatumia Flannel kama mtoaji wetu wa mtandao, hebu tuzungumze kidogo kuhusu kuisanidi:

  • Flanneld (daemon ya Flannel) kawaida huwekwa kwenye nguzo kama DaemonSet iliyo na install-cni kama chombo cha init.
  • Install-cni huunda Faili ya usanidi wa CNI (/etc/cni/net.d/10-flannel.conflist) kwenye kila nodi.
  • Flanneld huunda kifaa cha vxlan, hurejesha metadata ya mtandao kutoka kwa seva ya API, na kufuatilia masasisho ya pod. Zinapoundwa, husambaza njia kwa maganda yote kwenye nguzo.
  • Njia hizi huruhusu maganda kuwasiliana kupitia anwani za IP.

Kwa habari zaidi juu ya kazi ya Flannel, napendekeza kutumia viungo mwishoni mwa kifungu.

Hapa kuna mchoro wa mwingiliano kati ya programu-jalizi ya CRI Iliyojumuishwa na programu-jalizi za CNI:

Je, poda ya Kubernetes inapataje anwani ya IP?

Kama unavyoona hapo juu, kubelet huita programu-jalizi ya Containerd CRI kuunda ganda, ambalo huita programu-jalizi ya CNI kusanidi mtandao wa pod. Kwa kufanya hivyo, programu-jalizi ya CNI ya mtoa huduma wa mtandao huita programu-jalizi nyingine za msingi za CNI ili kusanidi vipengele mbalimbali vya mtandao.

Mwingiliano kati ya programu-jalizi za CNI

Kuna programu jalizi mbalimbali za CNI ambazo kazi yake ni kusaidia kusanidi mawasiliano ya mtandao kati ya vyombo kwenye seva pangishi. Makala hii itazungumzia tatu kati yao.

CNI programu-jalizi Flannel

Unapotumia Flannel kama mtoa huduma wa mtandao, sehemu ya Containerd CRI hupiga simu CNI programu-jalizi Flannelkwa kutumia faili ya usanidi ya 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
      }
    }
  ]
}

Programu-jalizi ya Flannel CNI inafanya kazi kwa kushirikiana na Flanneld. Wakati wa kuanza, Flanneld hupata podCIDR na maelezo mengine yanayohusiana na mtandao kutoka kwa seva ya API na kuyahifadhi kwenye faili. /run/flannel/subnet.env.

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

Programu-jalizi ya Flannel CNI hutumia data kutoka /run/flannel/subnet.env kusanidi na kupiga programu-jalizi ya daraja la CNI.

Daraja la programu-jalizi la CNI

Programu-jalizi hii inaitwa na usanidi ufuatao:

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

Inapoitwa kwa mara ya kwanza, inaunda daraja la Linux na Β«nameΒ»: Β«cni0Β», ambayo imeonyeshwa kwenye usanidi. Kisha jozi ya veth huundwa kwa kila pod. Ncha yake moja imeunganishwa kwenye nafasi ya jina ya mtandao wa chombo, nyingine imejumuishwa kwenye daraja la Linux kwenye mtandao wa seva pangishi. Daraja la programu-jalizi la CNI huunganisha vyombo vyote vya seva pangishi kwenye daraja la Linux kwenye mtandao wa seva pangishi.

Baada ya kumaliza kusanidi jozi ya veth, programu-jalizi ya Bridge huita programu-jalizi ya IPAM CNI ya karibu nawe. Aina ya programu-jalizi ya IPAM inaweza kusanidiwa katika usanidi wa CNI ambao programu-jalizi ya CRI hutumia kuita programu-jalizi ya Flannel CNI.

Programu jalizi za IPAM CNI za eneo lako

Simu za Bridge CNI programu-jalizi ya ndani ya IPAM ya CNI na usanidi ufuatao:

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

Programu-jalizi ya IPAM ya eneo lako (IP Address Musimamizi - usimamizi wa anwani ya IP) inarejesha anwani ya IP ya kontena kutoka kwa subnet na kuhifadhi IP iliyotengwa kwenye seva pangishi kwenye saraka iliyoainishwa katika sehemu hiyo. dataDir - /var/lib/cni/networks/<network-name=cni0>/<ip>. Faili hii ina kitambulisho cha chombo ambacho anwani hii ya IP imekabidhiwa.

Wakati wa kupiga simu kwenye programu-jalizi ya IPAM ya eneo lako, hurejesha data ifuatayo:

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

Muhtasari

Kube-controller-manager inapeana podCIDR kwa kila nodi. Maganda ya kila nodi hupokea anwani za IP kutoka kwa nafasi ya anwani katika masafa ya podCIDR yaliyotengwa. Kwa kuwa podCIDR za nodi haziingiliani, ganda zote hupokea anwani za kipekee za IP.

Msimamizi wa nguzo ya Kubernetes husanidi na kusakinisha kubelet, muda wa matumizi ya kontena, wakala wa mtoa huduma wa mtandao, na kunakili programu-jalizi za CNI kwa kila nodi. Wakati wa kuanzisha, wakala wa mtoa huduma hutengeneza usanidi wa CNI. Wakati ganda limepangwa kwa nodi, kubelet huita programu-jalizi ya CRI ili kuiunda. Ifuatayo, ikiwa imejumuishwa inatumiwa, programu-jalizi ya CRI Iliyojumuishwa huita programu-jalizi ya CNI iliyobainishwa kwenye usanidi wa CNI ili kusanidi mtandao wa pod. Kama matokeo, ganda hupokea anwani ya IP.

Ilinichukua muda kuelewa hila na nuances zote za mwingiliano huu wote. Natumai uzoefu huu utakusaidia kuelewa vyema jinsi Kubernetes inavyofanya kazi. Ikiwa nina makosa kuhusu chochote, tafadhali wasiliana nami kwa Twitter au kwa anwani [barua pepe inalindwa]. Jisikie huru kuwasiliana ikiwa ungependa kujadili vipengele vya makala hii au kitu kingine chochote. Ningependa kuzungumza na wewe!

marejeo

Vyombo na mtandao

Flannel inafanyaje kazi?

CRI na CNI

PS kutoka kwa mtafsiri

Soma pia kwenye blogi yetu:

Chanzo: mapenzi.com

Kuongeza maoni