RÄ«ki lietojumprogrammu izstrÄdÄtÄjiem, kas darbojas Kubernetes
MÅ«sdienÄ«ga pieeja darbÄ«bai atrisina daudzas aktuÄlas biznesa problÄmas. Konteineri un orÄ·estranti atvieglo jebkuras sarežģītÄ«bas projektu mÄrogoÅ”anu, vienkÄrÅ”o jaunu versiju izlaiÅ”anu, padara tÄs uzticamÄkas, taÄu tajÄ paÅ”Ä laikÄ tie rada papildu problÄmas izstrÄdÄtÄjiem. ProgrammÄtÄjam, pirmkÄrt, rÅ«p viÅa kods: arhitektÅ«ra, kvalitÄte, veiktspÄja, elegance - nevis tas, kÄ tas darbosies Kubernetes un kÄ to pÄrbaudÄ«t un atkļūdot pÄc pat minimÄlu izmaiÅu veikÅ”anas. LÄ«dz ar to arÄ« gluži likumsakarÄ«gi, ka aktÄ«vi tiek izstrÄdÄti rÄ«ki priekÅ” Kubernetes, kas palÄ«dz atrisinÄt pat āarhaiskÄkoā izstrÄdÄtÄju problÄmas un ļauj koncentrÄties uz galveno.
Å ajÄ pÄrskatÄ ir sniegta Ä«sa informÄcija par dažiem rÄ«kiem, kas atvieglo programmÄtÄja dzÄ«vi, kura kods darbojas Kubernetes klastera podāax.
VienkÄrÅ”i palÄ«gi
Kubectl-debug
ApakÅ”ÄjÄ lÄ«nija: pievienojiet konteineru Pod un skatiet, kas tajÄ notiek.
Å is kubectl spraudnis ļauj izveidot papildu konteineru interesÄjoÅ”Äs paketes iekÅ”pusÄ, kas kopÄ«gos procesa nosaukumvietu ar citiem konteineriem. TajÄ varat atkļūdot podziÅa darbÄ«bu: pÄrbaudÄ«t tÄ«klu, klausÄ«ties tÄ«kla trafiku, veikt interesÄjoÅ”o procesu utt.
Varat arÄ« pÄrslÄgties uz procesa konteineru, palaižot chroot /proc/PID/root - tas var bÅ«t ļoti Ärti, ja nepiecieÅ”ams iegÅ«t saknes apvalku konteinerÄ, kuram tas ir iestatÄ«ts manifestÄ securityContext.runAs.
Å is rÄ«ks ir vienkÄrÅ”s un efektÄ«vs, tÄpÄc tas var bÅ«t noderÄ«gs ikvienam izstrÄdÄtÄjam. MÄs par to vairÄk rakstÄ«jÄm atseviŔķs raksts.
Tele klÄtbÅ«tne
ApakÅ”ÄjÄ lÄ«nija: pÄrsÅ«tiet lietojumprogrammu uz datoru. IzstrÄdÄjiet un atkļūdojiet lokÄli.
Å Ä«s pievienojumprogrammas ideja ir palaist konteineru ar lietojumprogrammu vietÄjÄ lietotÄja datorÄ un starpniekserveri visu trafiku no kopas uz to un atpakaļ. Å Ä« pieeja ļauj izstrÄdÄt lokÄli, vienkÄrÅ”i rediÄ£Äjot failus savÄ iecienÄ«tÄkajÄ IDE: rezultÄti bÅ«s pieejami nekavÄjoties.
LokÄlÄs darbÄ«bas priekÅ”rocÄ«bas ir Ärta rediÄ£ÄÅ”ana un tÅ«lÄ«tÄji rezultÄti, iespÄja atkļūdot lietojumprogrammu parastajÄ veidÄ. NegatÄ«vie ir tas, ka tas ir prasÄ«gs savienojuma Ätrumam, kas ir Ä«paÅ”i pamanÄms, ja jums ir jÄstrÄdÄ ar lietojumprogrammu ar diezgan augstu RPS un trafiku. TurklÄt Telepresence ir problÄmas ar skaļuma stiprinÄjumiem operÄtÄjsistÄmÄ Windows, kas var bÅ«t izŔķiroÅ”s ierobežojums izstrÄdÄtÄjiem, kas pieraduÅ”i pie Ŕīs OS.
MÄs jau esam dalÄ«juÅ”ies pieredzÄ par Telepresence lietoÅ”anu Å”eit.
Ksync
ApakÅ”ÄjÄ lÄ«nija: gandrÄ«z tÅ«lÄ«tÄja koda sinhronizÄcija ar konteineru klasterÄ«.
LietderÄ«ba ļauj sinhronizÄt lokÄlÄ direktorija saturu ar klasterÄ« palaist konteinera direktoriju. Å Äds rÄ«ks ir lieliski piemÄrots izstrÄdÄtÄjiem skriptu programmÄÅ”anas valodÄs, kuru galvenÄ problÄma ir koda piegÄde darbinÄmÄ konteinerÄ. Ksync ir paredzÄts, lai atvieglotu Ŕīs galvassÄpes.
Kad komanda inicializÄ vienu reizi ksync init klasterÄ« tiek izveidots DaemonSet, ko izmanto, lai uzraudzÄ«tu atlasÄ«tÄ konteinera failu sistÄmas stÄvokli. SavÄ lokÄlajÄ datorÄ izstrÄdÄtÄjs palaiž komandu ksync watch, kas uzrauga konfigurÄcijas un darbojas syncthing, kas tieÅ”i sinhronizÄ failus ar kopu.
Atliek tikai norÄdÄ«t ksync, ko ar ko sinhronizÄt. PiemÄram, Ŕī komanda:
...izveidos novÄrotÄju ar nosaukumu myprojectkas meklÄs podiÅu ar etiÄ·eti app=backend un mÄÄ£iniet sinhronizÄt vietÄjo direktoriju /home/user/myproject/ ar katalogu /var/www/myproject/ pie konteinera sauc php.
ProblÄmas un piezÄ«mes par ksync no mÅ«su pieredzes:
Izmantojot Windows kÄ klienta operÄtÄjsistÄmu, failu sistÄmas vÄrotÄjs var nedarboties pareizi. Å Ä« kļūda tika pamanÄ«ta, strÄdÄjot ar lieliem direktorijiem - ar lielu skaitu ligzdotu failu un direktoriju. MÄs radÄ«jÄm attiecÄ«gs jautÄjums sinhronizÄcijas projektÄ, bet vÄl nav virzÄ«bas uz to (kopÅ” jÅ«lija sÄkuma).
Izmantojiet failu .stignore lai norÄdÄ«tu ceļus vai failu modeļus, kas nav jÄsinhronizÄ (piemÄram, direktorijus app/cache Šø .git).
PÄc noklusÄjuma ksync restartÄs konteineru ikreiz, kad tiks mainÄ«ti faili. Node.js tas ir Ärti, bet PHP tas ir pilnÄ«gi lieki. LabÄk ir izslÄgt opcache un izmantot karogu --reload=false.
KonfigurÄciju vienmÄr var labot $HOME/.ksync/ksync.yaml.
Å is rÄ«ks ir paredzÄts procesu atkļūdoÅ”anai tieÅ”i podiÅos. LietderÄ«ba ir vienkÄrÅ”a un interaktÄ«vi ļauj izvÄlÄties vajadzÄ«go atkļūdotÄju (SkatÄ«t zemÄk) un namespace + pod, kura procesÄ jums ir jÄiejaucas. PaÅ”laik tiek atbalstÄ«ts:
delve - Go lietojumprogrammÄm;
GDB - izmantojot mÄrÄ·a attÄlo + porta pÄradresÄciju;
JDWP portu pÄradresÄcija Java lietojumprogrammu atkļūdoÅ”anai.
IDE pusÄ atbalsts ir pieejams tikai VScode (izmantojot paplaÅ”inÄÅ”ana, tomÄr paÅ”reizÄjÄ (2019) gada plÄnos ietilpst Eclipse un Intellij.
Lai atkļūdotu procesus, Squash klastera mezglos vada priviliÄ£Ätu konteineru, tÄpÄc vispirms ir jÄiepazÄ«stas ar iespÄjÄm. droÅ”ais režīms lai izvairÄ«tos no droŔības problÄmÄm.
IntegrÄti risinÄjumi
PÄriesim pie smagÄs artilÄrijas - vairÄk āliela mÄrogaā projektu, kas paredzÄti, lai nekavÄjoties apmierinÄtu daudzas izstrÄdÄtÄju vajadzÄ«bas.
NB: Å ajÄ sarakstÄ, protams, ir vieta mÅ«su atvÄrtÄ koda utilÄ«tai werf (agrÄk pazÄ«stams kÄ dapp). TomÄr mÄs par to jau esam rakstÄ«juÅ”i un runÄjuÅ”i vairÄk nekÄ vienu reizi, un tÄpÄc nolÄmÄm to neiekļaut pÄrskatÄ. Tiem, kas vÄlas tuvÄk iepazÄ«ties ar tÄ iespÄjÄm, iesakÄm izlasÄ«t/noklausÄ«ties ziÅojumu āwerf ir mÅ«su CI/CD rÄ«ks pakalpojumÄ Kubernetes'.
DevSpace
ApakÅ”ÄjÄ lÄ«nija: tiem, kas vÄlas sÄkt strÄdÄt Kubernetes, bet nevÄlas iedziļinÄties tÄs džungļos.
RisinÄjums no tÄda paÅ”a nosaukuma uzÅÄmuma, kas nodroÅ”ina pÄrvaldÄ«tos klasterus ar Kubernetes komandas attÄ«stÄ«bai. LietderÄ«ba tika izveidota komerciÄlÄm kopÄm, taÄu tÄ lieliski darbojas ar citÄm kopÄm.
Palaižot komandu devspace init projektu katalogÄ Jums tiks piedÄvÄts (interaktÄ«vi):
atlasiet strÄdÄjoÅ”u Kubernetes klasteru,
izmantot esoÅ”o Dockerfile (vai Ä£enerÄjiet jaunu), lai izveidotu konteineru, pamatojoties uz to,
atlasiet repozitoriju konteinera attÄlu glabÄÅ”anai utt.
PÄc visÄm Ŕīm sagatavoÅ”anas darbÄ«bÄm varat sÄkt izstrÄdi, palaižot komandu devspace dev. Tas izveidos konteineru, augÅ”upielÄdÄs to repozitorijÄ, izvÄrs izvietoÅ”anu klasterÄ« un sÄks porta pÄrsÅ«tÄ«Å”anu un konteinera sinhronizÄciju ar vietÄjo direktoriju.
PÄc izvÄles jums tiks piedÄvÄts pÄrvietot terminÄli uz konteineru. Jums nevajadzÄtu atteikties, jo patiesÄ«bÄ konteiners sÄkas ar miega komandu, un reÄlai pÄrbaudei lietojumprogramma ir jÄpalaiž manuÄli.
Visbeidzot, komanda devspace deploy izlaiž lietojumprogrammu un saistÄ«to infrastruktÅ«ru klasterÄ«, pÄc tam viss sÄk darboties kaujas režīmÄ.
Visa projekta konfigurÄcija tiek saglabÄta failÄ devspace.yaml. Papildus izstrÄdes vides iestatÄ«jumiem tajÄ var atrast arÄ« infrastruktÅ«ras aprakstu, kas ir lÄ«dzÄ«gs standarta Kubernetes manifestiem, tikai ievÄrojami vienkÄrÅ”ots.
Arhitektūra un galvenie darba ar DevSpace posmi
TurklÄt projektam ir viegli pievienot iepriekÅ” definÄtu komponentu (piemÄram, MySQL DBVS) vai Helm diagrammu. VairÄk lasiet sadaÄ¼Ä dokumentÄcija - tas nav sarežģīti.
Å Ä« Google utilÄ«ta apgalvo, ka tÄ sedz visas izstrÄdÄtÄja vajadzÄ«bas, kura kods kaut kÄdÄ veidÄ darbosies Kubernetes klasterÄ«. SÄkt to lietot nav tik vienkÄrÅ”i kÄ devspace: nav interaktivitÄtes, valodas noteikÅ”anas un automÄtiskÄs izveides Dockerfile viÅi tev to Å”eit nepiedÄvÄs.
TomÄr, ja tas jÅ«s nebiedÄ, Skaffold ļauj veikt tÄlÄk norÄdÄ«tÄs darbÄ«bas.
Izsekojiet avota koda izmaiÅas.
SinhronizÄjiet to ar pod konteineru, ja tas nav jÄmontÄ.
SavÄc konteinerus ar kodu, ja valoda tiek interpretÄta, vai apkopojiet artefaktus un iesaiÅojiet tos konteineros.
AttÄlu atzÄ«mÄÅ”ana un augÅ”upielÄde Docker reÄ£istrÄ.
Izvietojiet lietojumprogrammu klasterī, izmantojot kubectl, Helm vai kustomize.
Veiciet portu pÄradresÄciju.
AtkļūdoŔanas programmas, kas rakstītas Java, Node.js, Python.
DarbplÅ«sma dažÄdÄs variÄcijÄs ir deklaratÄ«vi aprakstÄ«ta failÄ skaffold.yaml. Projektam varat arÄ« definÄt vairÄkus profilus, kuros var daļÄji vai pilnÄ«bÄ mainÄ«t montÄžas un izvietoÅ”anas posmus. PiemÄram, izstrÄdei norÄdiet izstrÄdÄtÄjam Ärtu bÄzes attÄlu, bet iestudÄÅ”anai un ražoÅ”anai - minimÄlu (+ izmantoÅ”ana securityContext konteinerus vai atkÄrtoti definÄjiet kopu, kurÄ lietojumprogramma tiks izvietota).
Docker konteinerus var uzbÅ«vÄt lokÄli vai attÄlinÄti: iekÅ”Ä Google Cloud Build vai klasterÄ«, izmantojot Kaniko. Tiek atbalstÄ«ti arÄ« Bazel un Jib Maven/Gradle. AtzÄ«mÄÅ”anai Skaffold atbalsta daudzas stratÄÄ£ijas: izmantojot git commit hash, datumu/laiku, sha256 avotu summu utt.
AtseviŔķi ir vÄrts atzÄ«mÄt iespÄju pÄrbaudÄ«t konteinerus. Jau pieminÄtÄ konteinera struktÅ«ras pÄrbaudes sistÄma piedÄvÄ Å”Ädas pÄrbaudes metodes:
Komandu izpilde konteinera kontekstÄ ar izejas statusu izsekoÅ”anu un komandas teksta izvades pÄrbaudi.
Failu klÄtbÅ«tnes pÄrbaude konteinerÄ un norÄdÄ«to atribÅ«tu atbilstÄ«ba.
Faila satura kontrole, izmantojot regulÄrÄs izteiksmes.
Failu sinhronizÄcija ar konteineru netiek veikta optimÄlÄkajÄ veidÄ: Skaffold vienkÄrÅ”i izveido arhÄ«vu ar avotiem, nokopÄ to un izsaiÅo konteinerÄ (jÄinstalÄ darva). TÄpÄc, ja jÅ«su galvenais uzdevums ir koda sinhronizÄcija, labÄk ir meklÄt specializÄtu risinÄjumu (ksync).
Skaffold darbības galvenie posmi
KopumÄ rÄ«ks neļauj abstrahÄties no Kubernetes manifestiem un tam nav nekÄdas interaktivitÄtes, tÄpÄc var Ŕķist, ka to ir grÅ«ti apgÅ«t. Bet tÄ ir arÄ« tÄ priekÅ”rocÄ«ba ā lielÄka rÄ«cÄ«bas brÄ«vÄ«ba.
Valoda: TypeScript (projektu plÄnots sadalÄ«t vairÄkos komponentos, no kuriem daži bÅ«s Go, kÄ arÄ« izveidot SDK papildinÄjumu izveidei TypeScript/JavaScript un Go).
Licence: Apache License 2.0.
TÄpat kÄ Skaffold, arÄ« Garden mÄrÄ·is ir automatizÄt lietojumprogrammas koda piegÄdes procesus K8s klasterim. Lai to izdarÄ«tu, vispirms YAML failÄ jÄapraksta projekta struktÅ«ra un pÄc tam palaidiet komandu garden dev. ViÅa darÄ«s visu maÄ£iju:
SavÄc konteinerus ar dažÄdÄm projekta daļÄm.
Veic integrÄcijas un vienÄ«bu testus, ja tÄdi ir aprakstÄ«ti.
Visus projekta komponentus izlaiž klasterī.
Ja avota kods mainÄs, tas restartÄs visu konveijeru.
Galvenais Ŕī rÄ«ka izmantoÅ”anas mÄrÄ·is ir koplietot attÄlo klasteru ar izstrÄdes komandu. Å ajÄ gadÄ«jumÄ, ja daži bÅ«vniecÄ«bas un testÄÅ”anas soļi jau ir veikti, tas ievÄrojami paÄtrinÄs visu procesu, jo Garden varÄs izmantot keÅ”atmiÅÄ saglabÄtos rezultÄtus.
Projekta modulis var bÅ«t konteiners, Maven konteiners, Helm diagramma, manifests kubectl apply vai pat OpenFaaS funkcija. TurklÄt jebkuru no moduļiem var izvilkt no attÄlÄs Git krÄtuves. Modulis var vai nevar definÄt pakalpojumus, uzdevumus un testus. Pakalpojumiem un uzdevumiem var bÅ«t atkarÄ«bas, lai jÅ«s varÄtu noteikt konkrÄta pakalpojuma izvietoÅ”anas secÄ«bu un organizÄt uzdevumu un testu palaiÅ”anu.
Garden nodroÅ”ina lietotÄjam skaistu informÄcijas paneli (Å”obrÄ«d atrodas eksperimentÄlais stÄvoklis), kurÄ attÄlots projekta grafiks: komponenti, montÄžas secÄ«ba, uzdevumu un testu izpilde, to savienojumi un atkarÄ«bas. TieÅ”i pÄrlÅ«kprogrammÄ varat apskatÄ«t visu projekta komponentu žurnÄlus un pÄrbaudÄ«t, ko konkrÄtais komponents izvada, izmantojot HTTP (ja, protams, tam ir deklarÄts ieejas resurss).
Panelis dÄrzam
Å im rÄ«kam ir arÄ« karstÄs pÄrlÄdÄÅ”anas režīms, kas vienkÄrÅ”i sinhronizÄ skripta izmaiÅas ar konteineru klasterÄ«, ievÄrojami paÄtrinot lietojumprogrammu atkļūdoÅ”anas procesu. DÄrzam ir labs dokumentÄciju un nav slikti piemÄru kopums, ļaujot Ätri pierast un sÄkt lietot. Starp citu, pavisam nesen publicÄjÄm raksta tulkojums no tÄ autoriem.
SecinÄjums
Protams, Å”is rÄ«ku saraksts lietojumprogrammu izstrÄdei un atkļūdoÅ”anai programmÄ Kubernetes neaprobežojas tikai ar. Ir vÄl daudzas ļoti noderÄ«gas un praktiskas utilÄ«tas, kas ir ja ne atseviŔķa raksta, tad vismaz pieminÄÅ”anas vÄrtas. PastÄstiet mums, ko lietojat, ar kÄdÄm problÄmÄm saskÄrÄties un kÄ tÄs atrisinÄjÄt!