Calico tīkla izveidei Kubernetes: ievads un neliela pieredze
Raksta mÄrÄ·is ir iepazÄ«stinÄt lasÄ«tÄju ar tÄ«kla veidoÅ”anas un tÄ«kla politiku pÄrvaldÄ«bas pamatiem Kubernetes, kÄ arÄ« ar treÅ”Äs puses Calico spraudni, kas paplaÅ”ina standarta iespÄjas. Pa ceļam konfigurÄcijas vienkÄrŔība un dažas funkcijas tiks demonstrÄtas, izmantojot reÄlus piemÄrus no mÅ«su darbÄ«bas pieredzes.
Å Ä« raksta kontekstÄ ir svarÄ«gi atzÄ«mÄt, ka pats K8s nav atbildÄ«gs par tÄ«kla savienojamÄ«bu starp konteineriem un mezgliem: Å”im nolÅ«kam CNI spraudÅi (Container Networking Interface). VairÄk par Å”o koncepciju mÄs viÅi man arÄ« teica.
PiemÄram, visizplatÄ«tÄkais no Å”iem spraudÅiem ir Flaneļa ā nodroÅ”ina pilnu tÄ«kla savienojumu starp visiem klastera mezgliem, paceļot tiltus katrÄ mezglÄ, pieŔķirot tam apakÅ”tÄ«klu. TomÄr pilnÄ«ga un neregulÄta pieejamÄ«ba ne vienmÄr ir izdevÄ«ga. Lai nodroÅ”inÄtu zinÄmu minimÄlu izolÄciju klasterÄ«, ir jÄiejaucas ugunsmÅ«ra konfigurÄcijÄ. VispÄrÄ«gÄ gadÄ«jumÄ tas tiek pakļauts viena un tÄ paÅ”a CNI kontrolei, tÄpÄc jebkura treÅ”Äs puses iejaukÅ”anÄs iptables var tikt interpretÄta nepareizi vai vispÄr ignorÄta.
Un tiek nodroÅ”inÄta āno kastesā tÄ«kla politikas pÄrvaldÄ«bas organizÄÅ”anai Kubernetes klasterÄ« NetworkPolicy API. Å is resurss, kas ir sadalÄ«ts atlasÄ«tajÄs nosaukumvietÄs, var saturÄt noteikumus, lai atŔķirtu vienas lietojumprogrammas piekļuvi citai. Tas arÄ« ļauj konfigurÄt pieejamÄ«bu starp noteiktiem podiem, vidÄm (nosaukumvietÄm) vai IP adreÅ”u blokiem:
Å is nav primitÄ«vÄkais piemÄrs oficiÄlÄ dokumentÄcija var vienreiz un uz visiem atturÄt vÄlmi izprast tÄ«kla politikas darbÄ«bas loÄ£iku. TomÄr mÄs joprojÄm mÄÄ£inÄsim izprast trafika plÅ«smu apstrÄdes pamatprincipus un metodes, izmantojot tÄ«kla politikas...
LoÄ£iski, ka ir 2 trafika veidi: ienÄkoÅ”Ä (Ingress) un izejoÅ”Ä no tÄ (Egress).
Faktiski politika ir sadalÄ«ta Å”ajÄs 2 kategorijÄs, pamatojoties uz kustÄ«bas virzienu.
NÄkamais nepiecieÅ”amais atribÅ«ts ir selektors; tas, uz kuru attiecas noteikums. Tas var bÅ«t aplikums (vai aplikumu grupa) vai vide (t.i., nosaukumvieta). SvarÄ«ga detaļa: abiem Å”o objektu veidiem ir jÄbÅ«t etiÄ·etei (etiÄ·ete Kubernetes terminoloÄ£ijÄ) - ar tiem politiÄ·i operÄ.
Papildus ierobežotam skaitam atlasÄ«tÄju, ko apvieno kÄda veida etiÄ·ete, dažÄdÄs variÄcijÄs ir iespÄjams rakstÄ«t noteikumus, piemÄram, āAtļaut/liegt visu/visiemā. Å im nolÅ«kam tiek izmantotas formas konstrukcijas:
Atgriežoties pie CNI spraudÅa izvÄles klasterim, ir vÄrts to atzÄ«mÄt ne katrs tÄ«kla spraudnis atbalsta NetworkPolicy. PiemÄram, jau pieminÄtais Flanel neprot konfigurÄt tÄ«kla politikas, kuras tas teikts tieÅ”i oficiÄlajÄ repozitorijÄ. Tur ir minÄta arÄ« alternatÄ«va - Open Source projekts Calico, kas ievÄrojami paplaÅ”ina Kubernetes API standarta komplektu tÄ«kla politiku ziÅÄ.
IepazÄ«Å”anÄs ar Calico: teorija
Calico spraudni var izmantot integrÄcijÄ ar Flannel (apakÅ”projekts KanÄls) vai neatkarÄ«gi, aptverot gan tÄ«kla savienojamÄ«bas, gan pieejamÄ«bas pÄrvaldÄ«bas iespÄjas.
KÄdas iespÄjas sniedz K8s ākastesā risinÄjuma un API komplekta izmantoÅ”ana no Calico?
LÅ«k, kas ir iebÅ«vÄts NetworkPolicy:
politiķus ierobežo vide;
politikas tiek piemÄrotas pÄkstÄ«m, kas marÄ·Ätas ar etiÄ·etÄm;
noteikumus var piemÄrot podiem, vidÄm vai apakÅ”tÄ«kliem;
noteikumi var saturÄt protokolus, nosauktas vai simboliskas portu specifikÄcijas.
LÅ«k, kÄ Calico paplaÅ”ina Ŕīs funkcijas:
politikas var tikt piemÄrotas jebkuram objektam: podam, konteineram, virtuÄlajai maŔīnai vai interfeisam;
noteikumi var ietvert konkrÄtu darbÄ«bu (aizliegumu, atļauju, reÄ£istrÄÅ”anu);
noteikumu mÄrÄ·is vai avots var bÅ«t ports, portu diapazons, protokoli, HTTP vai ICMP atribÅ«ti, IP vai apakÅ”tÄ«kls (4. vai 6. paaudze), jebkuri atlasÄ«tÄji (mezgli, saimnieki, vides);
TurklÄt jÅ«s varat regulÄt trafika pÄreju, izmantojot DNAT iestatÄ«jumus un trafika pÄradresÄcijas politikas.
PirmÄs saistÄ«bas GitHub Calico repozitorijÄ datÄtas ar 2016. gada jÅ«liju, un gadu vÄlÄk projekts ieÅÄma vadoÅ”Äs pozÄ«cijas Kubernetes tÄ«kla savienojamÄ«bas organizÄÅ”anÄ ā par to liecina, piemÄram, aptaujas rezultÄti, diriÄ£Äja The New Stack:
Daudzi lieli pÄrvaldÄ«ti risinÄjumi ar K8, piemÄram Amazon EX, Azure AKS, Google GKE un citi sÄka ieteikt to lietoÅ”anai.
RunÄjot par veiktspÄju, Å”eit viss ir lieliski. PÄrbaudot savu produktu, Calico izstrÄdes komanda demonstrÄja astronomisku veiktspÄju, darbinot vairÄk nekÄ 50000 500 konteineru 20 fiziskos mezglos ar izveides Ätrumu XNUMX konteineri sekundÄ. Ar mÄrogoÅ”anu netika konstatÄtas nekÄdas problÄmas. TÄdi rezultÄti tika paziÅoti jau pie pirmÄs versijas izziÅoÅ”anas. NeatkarÄ«gi pÄtÄ«jumi, kas koncentrÄjas uz caurlaidspÄju un resursu patÄriÅu, arÄ« apstiprina, ka Calico veiktspÄja ir gandrÄ«z tikpat laba kÄ Flannel. PiemÄram:
Projekts attÄ«stÄs ļoti Ätri, tas atbalsta darbu populÄros risinÄjumos, kas tiek pÄrvaldÄ«ti K8s, OpenShift, OpenStack, ir iespÄjams izmantot Calico, izvietojot klasteru, izmantojot sitiens, ir atsauces uz Service Mesh tÄ«klu izveidi (Å”eit ir piemÄrs lieto kopÄ ar Istio).
TrenÄjies ar Calico
Parasti vaniļas Kubernetes izmantoÅ”anas gadÄ«jumÄ CNI instalÄÅ”ana ir saistÄ«ta ar faila izmantoÅ”anu calico.yaml, lejupielÄdÄts no oficiÄlÄs vietnes, izmantojot kubectl apply -f.
KÄ likums, paÅ”reizÄjÄ spraudÅa versija ir saderÄ«ga ar jaunÄkajÄm 2-3 Kubernetes versijÄm: darbÄ«ba vecÄkÄs versijÄs netiek pÄrbaudÄ«ta un netiek garantÄta. SaskaÅÄ ar izstrÄdÄtÄju teikto, Calico darbojas uz Linux kodoliem virs 3.10, kuros darbojas CentOS 7, Ubuntu 16 vai Debian 8, papildus iptables vai IPVS.
IzolÄcija vidÄ
VispÄrÄ«gai izpratnei apskatÄ«sim vienkÄrÅ”u gadÄ«jumu, lai saprastu, kÄ tÄ«kla politikas Calico apzÄ«mÄjumÄ atŔķiras no standarta un kÄ kÄrtulu izveides pieeja vienkÄrÅ”o to lasÄmÄ«bu un konfigurÄcijas elastÄ«bu:
KlasterÄ« ir izvietotas 2 tÄ«mekļa lietojumprogrammas: Node.js un PHP, no kurÄm viena izmanto Redis. Lai bloÄ·Ätu piekļuvi Redis no PHP, vienlaikus saglabÄjot savienojumu ar Node.js, vienkÄrÅ”i piemÄrojiet Å”o politiku:
BÅ«tÄ«bÄ mÄs atļÄvÄm ienÄkoÅ”o trafiku uz Redis portu no Node.js. Un viÅi skaidri neko citu neaizliedza. TiklÄ«dz parÄdÄs NetworkPolicy, visi tajÄ minÄtie atlasÄ«tÄji tiek izolÄti, ja vien nav norÄdÄ«ts citÄdi. TomÄr izolÄcijas noteikumi neattiecas uz citiem objektiem, kas nav ietverti atlasÄ«tÄjÄ.
PiemÄrÄ izmanto apiVersion Kubernetes ir izÅemts no kastes, taÄu nekas neliedz to izmantot tÄda paÅ”a nosaukuma resurss no Calico piegÄdes. Sintakse ir detalizÄtÄka, tÄpÄc jums bÅ«s jÄpÄrraksta noteikums iepriekÅ”minÄtajam gadÄ«jumam Å”ÄdÄ formÄ:
IepriekÅ” minÄtÄs konstrukcijas visas trafika atļauÅ”anai vai aizliegÅ”anai, izmantojot parasto NetworkPolicy API, satur konstrukcijas ar iekavÄm, kuras ir grÅ«ti saprast un atcerÄties. Calico gadÄ«jumÄ, lai mainÄ«tu ugunsmÅ«ra noteikuma loÄ£iku uz pretÄjo, vienkÄrÅ”i mainiet action: Allow par action: Deny.
IzolÄcija no vides
Tagad iedomÄjieties situÄciju, kad lietojumprogramma Ä£enerÄ biznesa rÄdÄ«tÄjus apkopoÅ”anai programmÄ Prometheus un turpmÄkai analÄ«zei, izmantojot Grafana. AugÅ”upielÄde var saturÄt sensitÄ«vus datus, kas pÄc noklusÄjuma atkal ir publiski skatÄmi. PaslÄpsim Å”os datus no ziÅkÄrÄ«go acÄ«m:
Prometheus, kÄ likums, tiek ievietots atseviÅ”Ä·Ä pakalpojumu vidÄ - piemÄrÄ tÄ bÅ«s Å”Äda nosaukumvieta:
Lauks metadata.labels izrÄdÄ«jÄs, ka tÄ nav nejauŔība. KÄ iepriekÅ” minÄts, namespaceSelector (kÄ arÄ« podSelector) darbojas ar etiÄ·etÄm. TÄpÄc, lai ļautu iegÅ«t metriku no visiem konkrÄta porta apgabaliem, jums bÅ«s jÄpievieno sava veida etiÄ·ete (vai jÄÅem no esoÅ”ajÄm) un pÄc tam jÄpiemÄro konfigurÄcija, piemÄram:
Parasti, pievienojot Å”Äda veida politikas Ä«paÅ”Äm vajadzÄ«bÄm, varat aizsargÄt pret ļaunprÄtÄ«gu vai nejauÅ”u iejaukÅ”anos klastera lietojumprogrammu darbÄ«bÄ.
PÄc Calico veidotÄju domÄm, labÄkÄ prakse ir pieeja āBloÄ·Äjiet visu un skaidri atveriet to, kas jums nepiecieÅ”amsā, kas dokumentÄta oficiÄlÄ dokumentÄcija (citi izmanto lÄ«dzÄ«gu pieeju - jo Ä«paÅ”i, in jau pieminÄtais raksts).
Papildu Calico objektu izmantoŔana
AtgÄdinÄÅ”u, ka, izmantojot paplaÅ”inÄto Calico API komplektu, varat regulÄt mezglu pieejamÄ«bu, ne tikai podi. NÄkamajÄ piemÄrÄ, izmantojot GlobalNetworkPolicy iespÄja nodot ICMP pieprasÄ«jumus klasterÄ« ir aizvÄrta (piemÄram, ping no apoka uz mezglu, starp podiem vai no mezgla uz IP pod):
IepriekÅ” minÄtajÄ gadÄ«jumÄ klasteru mezgli joprojÄm var āsasniegtā viens otru, izmantojot ICMP. Un Å”is jautÄjums tiek atrisinÄts ar lÄ«dzekļiem GlobalNetworkPolicy, attiecas uz entÄ«tiju HostEndpoint:
Visbeidzot, es sniegÅ”u ļoti reÄlu piemÄru Calico funkciju izmantoÅ”anai gandrÄ«z klastera mijiedarbÄ«bas gadÄ«jumÄ, kad nepietiek ar standarta politiku kopu. Lai piekļūtu tÄ«mekļa lietojumprogrammai, klienti izmanto VPN tuneli, un Ŕī piekļuve tiek stingri kontrolÄta un ierobežota ar noteiktu pakalpojumu sarakstu, kas atļauts izmantot:
Klienti savienojas ar VPN, izmantojot standarta UDP portu 1194, un, kad ir izveidots savienojums, tie saÅem marÅ”rutus uz podziÅu un pakalpojumu klasteru apakÅ”tÄ«kliem. Visi apakÅ”tÄ«kli tiek virzÄ«ti, lai restartÄÅ”anas un adreÅ”u maiÅas laikÄ nezaudÄtu pakalpojumus.
KonfigurÄcijas ports ir standarta, kas uzliek dažas nianses lietojumprogrammas konfigurÄÅ”anas un pÄrsÅ«tÄ«Å”anas uz Kubernetes klasteru procesÄ. PiemÄram, tajÄ paÅ”Ä AWS LoadBalancer for UDP parÄdÄ«jÄs burtiski pagÄjuÅ”Ä gada beigÄs ierobežotÄ reÄ£ionu sarakstÄ, un NodePort nevar izmantot, jo tas tiek pÄrsÅ«tÄ«ts visos klastera mezglos un nav iespÄjams mÄrogot servera gadÄ«jumu skaitu kļūdu tolerances nolÅ«kos. TurklÄt jums bÅ«s jÄmaina noklusÄjuma portu diapazons...
IespÄjamo risinÄjumu meklÄÅ”anas rezultÄtÄ tika izvÄlÄts sekojoÅ”ais:
Pods ar VPN ir ieplÄnots katram mezglam hostNetwork, tas ir, uz faktisko IP.
Pakalpojums tiek izlikts Ärpus caur ClusterIP. MezglÄ ir fiziski uzstÄdÄ«ts ports, kuram var piekļūt no Ärpuses ar nelielÄm atrunÄm (reÄlas IP adreses nosacÄ«ta klÄtbÅ«tne).
MÅ«su stÄsta ietvaros nav iespÄjams noteikt mezglu, uz kura pÄksts roze. Es tikai teikÅ”u, ka jÅ«s varat cieÅ”i āpiespraustā pakalpojumu mezglam vai uzrakstÄ«t nelielu blakusvÄÄ£a pakalpojumu, kas uzraudzÄ«s paÅ”reizÄjo VPN pakalpojuma IP adresi un rediÄ£Äs klientiem reÄ£istrÄtos DNS ierakstus - kuram ir pietiekami daudz iztÄles.
No marÅ”rutÄÅ”anas viedokļa mÄs varam unikÄli identificÄt VPN klientu pÄc tÄ IP adreses, ko izsniedzis VPN serveris. TÄlÄk ir sniegts primitÄ«vs piemÄrs Å”Äda klienta piekļuves pakalpojumiem ierobežoÅ”anai, kas parÄdÄ«ts iepriekÅ” minÄtajÄ Redis:
Å eit ir stingri aizliegts pieslÄgties portam 6379, bet tajÄ paÅ”Ä laikÄ tiek saglabÄta DNS pakalpojuma darbÄ«ba, kuras darbÄ«ba diezgan bieži cieÅ”, izstrÄdÄjot noteikumus. TÄ kÄ, kÄ minÄts iepriekÅ”, kad tiek parÄdÄ«ts atlasÄ«tÄjs, tam tiek piemÄrota noklusÄjuma aizlieguma politika, ja vien nav norÄdÄ«ts citÄdi.
RezultÄti
TÄdÄjÄdi, izmantojot Calico uzlaboto API, varat elastÄ«gi konfigurÄt un dinamiski mainÄ«t marÅ”rutÄÅ”anu klasterÄ« un ap to. KopumÄ tÄ lietoÅ”ana var izskatÄ«ties pÄc zvirbuļu Å”auÅ”anas ar lielgabalu, un L3 tÄ«kla ievieÅ”ana ar BGP un IP-IP tuneļiem vienkÄrÅ”Ä Kubernetes instalÄcijÄ plakanÄ tÄ«klÄ izskatÄs zvÄrÄ«gi... TomÄr citÄdi rÄ«ks izskatÄs diezgan dzÄ«votspÄjÄ«gs un noderÄ«gs. .
Klastera izolÄÅ”ana, lai tÄ atbilstu droŔības prasÄ«bÄm, ne vienmÄr var bÅ«t iespÄjama, un Å”eit palÄ«gÄ nÄk Calico (vai lÄ«dzÄ«gs risinÄjums). Å ajÄ rakstÄ sniegtie piemÄri (ar nelielÄm izmaiÅÄm) tiek izmantoti vairÄkÄs mÅ«su klientu instalÄcijÄs AWS.