Pirms pusotra gada, 5. gada 2018. martÄ, Google izlaida sava atvÄrtÄ pirmkoda CI/CD projekta pirmo alfa versiju ar nosaukumu Skaffold, kuras mÄrÄ·is bija izveidot āvienkÄrÅ”u un atkÄrtojamu Kubernetes izstrÄdiā, lai izstrÄdÄtÄji varÄtu koncentrÄties uz attÄ«stÄ«bu, nevis administrÄÅ”anu. Kas varÄtu bÅ«t interesants par Skaffold? KÄ izrÄdÄs, tam ir daži triki, kas var padarÄ«t to par spÄcÄ«gu rÄ«ku izstrÄdÄtÄjam un, iespÄjams, pat operÄciju inženierim. IepazÄ«simies ar projektu un tÄ iespÄjÄm.
NB: Starp citu, mÄs jau Ä«si runÄjÄm par Skaffold mÅ«su vispÄrÄ«gajÄ izstrÄdÄtÄju rÄ«ku apskats, kuras dzÄ«ves ir saistÄ«tas ar Kubernetes.
Teorija. MÄrÄ·is un iespÄjas
TÄtad, vispÄrÄ«gi runÄjot, Skaffold atrisina CI/CD cikla automatizÄcijas problÄmu (bÅ«vÄÅ”anas, nosÅ«tÄ«Å”anas, izvietoÅ”anas stadijÄs), piedÄvÄjot izstrÄdÄtÄjam tÅ«lÄ«tÄju atgriezenisko saiti, t.i. iespÄja Ätri saÅemt turpmÄko koda izmaiÅu rezultÄtu - atjauninÄtas lietojumprogrammas veidÄ, kas darbojas Kubernetes klasterÄ«. Un tas var darboties dažÄdÄs shÄmÄs (izstrÄdÄtÄjs, stadija, ražoÅ”ana ...), kurÄm Skaffold palÄ«dz aprakstÄ«t atbilstoÅ”os cauruļvadus izvÄrÅ”anai.
Skaffold pirmkods ir rakstÄ«ts Go, izplata saskaÅÄ ar bezmaksas Apache licences 2.0 (GitHub) noteikumiem.
ApskatÄ«sim galvenÄs funkcijas un funkcijas. PirmajÄ ietilpst:
Nolasa lietojumprogrammas žurnÄlus, kas darbojas konteinerÄ.
Palīdz atkļūdot lietojumprogrammas, kas rakstītas Java, Node.js, Python, Go.
Tagad par funkcijÄm:
Skaffold paÅ”am nav klasteru puses komponentu. Tas nozÄ«mÄ, ka nav nepiecieÅ”ams tÄlÄk konfigurÄt Kubernetes, lai izmantotu Å”o utilÄ«tu.
DažÄdi cauruļvadi jÅ«su lietojumam. Vai izstrÄdes laikÄ kods ir jÄizlaiž vietÄjÄ Minikube un pÄc tam iestudÄÅ”anÄ vai ražoÅ”anÄ? Å im nolÅ«kam ir profili un lietotÄju konfigurÄcijas, vides mainÄ«gie un karodziÅi, kas ļauj aprakstÄ«t dažÄdus konveijerus vienai lietojumprogrammai.
CLI. Tikai konsoles utilÄ«ta un konfigurÄcijas YAML. InternetÄ var atrast atsauces uz mÄÄ£inÄjumiem izveidot eksperimentÄlÄ GUI, tomÄr Å”obrÄ«d tas, visticamÄk, tikai nozÄ«mÄ, ka viÅÅ” kÄdam ir vajadzÄ«gs, bet ne Ä«sti.
ModularitÄte. Skaffold nav atseviŔķs kombains, bet cenÅ”as izmantot atseviŔķus moduļus vai esoÅ”os risinÄjumus konkrÄtiem uzdevumiem.
PÄdÄjÄ ilustrÄcija:
MontÄžas stadijÄ varat izmantot:
Docker veidot lokÄli, klasterÄ«, izmantojot kaniko vai Google Cloud Build;
Bazel lokÄli;
Jib Maven un Jib Gradle lokÄli vai pakalpojumÄ Google Cloud Build;
pielÄgoti veidoÅ”anas skripti darbojas lokÄli. Ja nepiecieÅ”ams palaist citu (elastÄ«gÄku/pazÄ«stamÄku/...) bÅ«vÄÅ”anas risinÄjumu, tas ir aprakstÄ«ts skriptÄ, lai Skaffold to palaistu (piemÄrs no dokumentÄcijas). Tas ļauj izmantot jebkuru savÄcÄju, ko var izsaukt, izmantojot skriptu;
Pateicoties tam, Skaffold var saukt par unikÄlu ietvars CI/CD izveidei. TÄlÄk ir sniegts darbplÅ«smas piemÄrs, kad to lietojat (no projekta dokumentÄcijas):
KÄ kopumÄ izskatÄs Skaffold darbs?
LietderÄ«ba uzrauga izmaiÅas avota koda direktorijÄ. Ja failos tiek veiktas izmaiÅas, tÄs tiek sinhronizÄtas ar Kubernetes klastera lietojumprogrammu aplikumu. Ja iespÄjams, bez attÄla atkÄrtotas salikÅ”anas. PretÄjÄ gadÄ«jumÄ tiek salikts jauns attÄls.
SamontÄtais attÄls tiek pÄrbaudÄ«ts, izmantojot konteinera struktÅ«ras testu, atzÄ«mÄts un nosÅ«tÄ«ts uz Docker reÄ£istru.
PÄc tam attÄls tiek izvietots ā tiek izvietots Kubernetes klasterÄ«.
Ja palaiÅ”ana tika inicializÄta, izmantojot komandu skaffold dev, tad mÄs sÄkam saÅemt žurnÄlus no lietojumprogrammas, un Skaffold gaida izmaiÅas, lai vÄlreiz atkÄrtotu visas darbÄ«bas.
Skaffold darbÄ«bas galveno posmu ilustrÄcija
Prakse. IzmÄÄ£inot Skaffold
Lai demonstrÄtu Skaffold izmantoÅ”anu, es ÅemÅ”u piemÄru no GitHub projektu repozitorijs... Starp citu, tur JÅ«s varat atrast daudzus citus piemÄrus, kuros Åemta vÄrÄ dažÄda specifika. Visas darbÄ«bas izpildÄ«Å”u lokÄli MinikubÄ. InstalÄÅ”ana ir vienkÄrÅ”a un aizÅem dažas minÅ«tes, un, lai sÄktu, jums bÅ«s nepiecieÅ”ams kubectl.
KlonÄsim Skaffold repozitoriju ar nepiecieÅ”amajiem piemÄriem:
git clone https://github.com/GoogleContainerTools/skaffold
cd skaffold/examples/microservices
Es izvÄlÄjos piemÄru ar diviem podiem, no kuriem katrÄ ir viena neliela Go lietojumprogramma. Viena lietojumprogramma ir frontend (leeroy-web), kas novirza pieprasÄ«jumu uz otru lietojumprogrammu - aizmuguri (leeroy-app). ApskatÄ«sim, kÄ tas izskatÄs:
leeroy-app un leeroy-web satur Go kodu un vienkÄrÅ”us Docker failus, lai izveidotu Å”o kodu lokÄli:
~/skaffold/examples/microservices # cat leeroy-app/Dockerfile
FROM golang:1.12.9-alpine3.10 as builder
COPY app.go .
RUN go build -o /app .
FROM alpine:3.10
CMD ["./app"]
COPY --from=builder /app .
Es nesniegÅ”u pieteikuma kodu - pietiek ar to zinÄt leeroy-web pieÅem pieprasÄ«jumus un pilnvaro tos leeroy-app. TÄpÄc failos Deployment.yaml Pakalpojums ir paredzÄts tikai app (iekÅ”Äjai marÅ”rutÄÅ”anai). Pod osta web mÄs to pÄrsÅ«tÄ«sim sev, lai Ätri piekļūtu lietojumprogrammai.
Å eit ir aprakstÄ«ti visi iepriekÅ” minÄtie posmi. Papildus Å”ai konfigurÄcijai ir arÄ« fails ar globÄlajiem iestatÄ«jumiem - ~/.skaffold/config. To var rediÄ£Ät manuÄli vai izmantojot CLI, piemÄram, Å”Ädi:
skaffold config set --global local-cluster true
Å Ä« komanda iestatÄ«s globÄlo mainÄ«go local-cluster nozÄ«mÄ true, pÄc kura Skaffold nemÄÄ£inÄs nosÅ«tÄ«t attÄlus uz attÄlo reÄ£istru. Ja izstrÄdÄjat lokÄli, varat izmantot Å”o komandu, lai lokÄli izveidotu attÄlus.
Atpakaļ uz skaffold.yaml:
Uz skatuves build mÄs norÄdÄm, ka jums ir jÄsavÄc un jÄsaglabÄ attÄls lokÄli. PÄc pirmÄs izveides palaiÅ”anas mÄs redzÄsim sekojoÅ”o:
// Ń.Šŗ. Minikube ŃŠ¾Š·Š“Š°ŠµŃ ŠŗŠ»Š°ŃŃŠµŃ Š² Š¾ŃŠ“ŠµŠ»ŃŠ½Š¾Š¹ Š²ŠøŃŃŃŠ°Š»ŃŠ½Š¾Š¹ Š¼Š°ŃŠøŠ½Šµ,
// ŠæŃŠøŠ“ŠµŃŃŃ ŠæŃŠ¾Š½ŠøŠŗŠ½ŃŃŃ Š²Š½ŃŃŃŃ, ŃŃŠ¾Š±Ń Š½Š°Š¹ŃŠø Š¾Š±ŃŠ°Š·Ń
# minikube ssh
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
leeroy-app 7d55a50803590b2ff62e47e6f240723451f3ef6f8c89aeb83b34e661aa287d2e 7d55a5080359 4 hours ago 13MB
leeroy-app v0.37.1-171-g0270a0c-dirty 7d55a5080359 4 hours ago 13MB
leeroy-web 5063bfb29d984db1ff70661f17d6efcc5537f2bbe6aa6907004ad1ab38879681 5063bfb29d98 5 hours ago 13.1MB
leeroy-web v0.37.1-171-g0270a0c-dirty 5063bfb29d98 5 hours ago 13.1MB
KÄ redzat, Skaffolds pats atzÄ«mÄja attÄlus. Starp citu, tiek atbalstÄ«tas vairÄkas marÄ·ÄÅ”anas politikas.
TÄlÄk konfigurÄcijÄ tas ir norÄdÄ«ts context: ./leeroy-app/, t.i. ir norÄdÄ«ts konteksts, kurÄ attÄls tiek savÄkts.
IzvietoÅ”anas stadijÄ ir noteikts, ka nepiecieÅ”amajiem manifestiem izmantosim kubectl un masku.
PortForward: lÄ«dzÄ«gi tam, kÄ mÄs parasti pÄrsÅ«tÄm portus, izmantojot kubectl port-forward, mÄs sniedzam norÄdÄ«jumus Skaffold izsaukt Å”o komandu. Å ajÄ gadÄ«jumÄ vietÄjais ports 9000 tiek pÄrsÅ«tÄ«ts uz 8080 izvietoÅ”anÄ ar nosaukumu leeroy-web.
Ir pienÄcis laiks palaist skaffold dev: komanda izveidos pastÄvÄ«gu āatgriezeniskÄs saites cilpuā, t.i. tas ne tikai apkopos visu un izvietos to klasterÄ«, bet arÄ« pastÄstÄ«s par podiÅu stÄvokli Å”obrÄ«d, uzraudzÄ«s izmaiÅas un atjauninÄs podiÅu stÄvokli.
Å eit ir palaiÅ”anas rezultÄts skaffold dev --port-forward saliekot atpakaļ:
PirmkÄrt, jÅ«s varat redzÄt, ka tiek izmantota keÅ”atmiÅa. PÄc tam lietojumprogramma tiek samontÄta, izvietota un porti tiek pÄrsÅ«tÄ«ti. KopÅ” norÄdÄ«ts --port-forward, Skaffold pÄrsÅ«tÄ«ja ostu uz web, kÄ viÅam prasÄ«ja, bet Å”eit app viÅÅ” iemeta pÄc saviem ieskatiem (izvÄlÄjÄs tuvÄko brÄ«vo). PÄc tam mÄs saÅemam pirmos žurnÄlus no lietojumprogrammÄm.
PÄrbaudÄ«sim, vai tas darbojas?
~/skaffold/examples/microservices # kubectl get po
NAME READY STATUS RESTARTS AGE
leeroy-app-6998dfcc95-2nxvf 1/1 Running 0 103s
leeroy-web-69f7d47c9d-5ff77 1/1 Running 0 103s
~/skaffold/examples/microservices # curl localhost:9000
leeroooooy app!!!
~/skaffold/examples/microservices # kubectl get po
NAME READY STATUS RESTARTS AGE
leeroy-app-ffd79d986-l6nwp 1/1 Running 0 11s
leeroy-web-69f7d47c9d-5ff77 1/1 Running 0 4m59s
~/skaffold/examples/microservices # curl localhost:9000
leeroooooy Habr!!!
TajÄ paÅ”Ä laikÄ pats Skaffold konsolÄ rÄdÄ«ja to paÅ”u, ko iepriekÅ”, izÅemot vienu punktu: tas tikai izskrÄja leeroy-app, un ne visu uzreiz.
VairÄk prakses
Ir arÄ« vÄrts pieminÄt, ka, veidojot jaunu projektu, Skaffold konfigurÄcijas var sÄknÄt, izmantojot komandu init, kas ir ļoti Ärti. TurklÄt varat rakstÄ«t vairÄkas konfigurÄcijas: veikt noklusÄjuma konfigurÄcijas izstrÄdi un pÄc tam izvÄrst uz skatuves ar komandu run (tas pats process kÄ dev, vienkÄrÅ”i neuzrauga izmaiÅas), izmantojot citu konfigurÄciju.
KatakodÄ ir vadÄ«ba Ar piemÄru tas ir vÄl vienkÄrÅ”Äk. Bet tas piedÄvÄ gatavu smilÅ”u kasti ar Kubernetes, aplikÄciju un Skaffold. Lieliska iespÄja, ja vÄlaties paÅ”am izmÄÄ£inÄt paÅ”us pamatus.
Viens no iespÄjamiem Skaffold izmantoÅ”anas gadÄ«jumiem ir izstrÄdes veikÅ”ana attÄlÄ klasterÄ«. Ne visiem ir Ärti darbinÄt Minikube uz savas aparatÅ«ras, pÄc tam izrullÄt aplikÄciju un sagaidÄ«t, ka tÄ darbosies adekvÄti... Å ajÄ gadÄ«jumÄ Skaffold lieliski atrisina problÄmu, ko var apstiprinÄt, piemÄram, Reddit inženieri, kÄ mums ir jau apspriests ŠæŠøŃŠ°Š»Šø mÅ«su emuÄrÄ.
Un Ŕī publikÄcija vietnÄ Weaveworks varat atrast piemÄru, kÄ izveidot cauruļvadu ražoÅ”anai.
SecinÄjums
Skaffold ir Ärts rÄ«ks cauruļvadu izveidei, kas ietver lietojumprogrammu izvÄrÅ”anu Kubernetes un galvenokÄrt ir vÄrsta uz attÄ«stÄ«bas vajadzÄ«bÄm. Tas ļauj diezgan vienkÄrÅ”i izveidot "Ä«su" konveijeru, kas Åem vÄrÄ izstrÄdÄtÄja pamatvajadzÄ«bas, bet, ja vÄlaties, varat organizÄt lielÄkus procesus. KÄ viens no skaidriem Skaffold izmantoÅ”anas piemÄriem CI/CD procesos ir dots Å”Äds testa projekts no 10 mikropakalpojumiem, izmantojot Kubernetes, gRPC, Istio un OpenCensus Tracing iespÄjas.
Skaffold jau ir gandrÄ«z 8000+ zvaigznes GitHub, to izstrÄdÄ Google un ir daļa no GoogleContainerTools ā kopumÄ Å”obrÄ«d ir pamats domÄt, ka projekts attÄ«stÄ«sies laimÄ«gi.