Mwaka mmoja na nusu uliopita, Machi 5, 2018, Google ilitoa toleo la kwanza la alpha la mradi wake wa Open Source wa CI/CD unaoitwa. Skafu, ambao lengo lake lilikuwa kuunda "maendeleo rahisi na yanayoweza kurudiwa ya Kubernetes" ili watengenezaji waweze kuzingatia maendeleo badala ya utawala. Ni nini kinachoweza kufurahisha kuhusu Skaffold? Kama inavyogeuka, ina hila chache juu ya sleeve yake ambayo inaweza kuifanya chombo chenye nguvu kwa msanidi programu, na labda hata mhandisi wa shughuli. Hebu tufahamiane na mradi na uwezo wake.
NB: Kwa njia, tayari tumezungumza kwa ufupi kuhusu Skaffold kwa ujumla wetu ukaguzi wa zana za wasanidi programu, ambao maisha yao yameunganishwa na Kubernetes.
Nadharia. Kusudi na uwezo
Kwa hiyo, kwa ujumla, Skaffold hutatua tatizo la otomatiki mzunguko wa CI/CD (katika hatua za kujenga, kusukuma, kupeleka), kutoa maoni ya haraka ya msanidi programu, i.e. uwezo wa kupokea haraka matokeo ya mabadiliko ya msimbo yanayofuata - katika mfumo wa programu iliyosasishwa inayoendesha kwenye nguzo ya Kubernetes. Na inaweza kufanya kazi katika mizunguko tofauti (dev, hatua, uzalishaji ...), ambayo Skaffold husaidia kuelezea mabomba yanayolingana ya kusambaza.
Msimbo wa chanzo wa Skaffold umeandikwa katika Go, kusambazwa na chini ya Leseni ya bure ya Apache 2.0 (GitHub).
Hebu tuangalie kazi kuu na vipengele. Ya kwanza ni pamoja na yafuatayo:
Skaffold inatoa zana za kuunda mabomba ya CI/CD.
Inakuruhusu kufuatilia mabadiliko katika msimbo wa chanzo chinichini na kuendesha mchakato otomatiki wa kuunganisha msimbo katika picha za kontena, kuchapisha picha hizi kwenye Usajili wa Doka na kuzipeleka kwenye nguzo ya Kubernetes.
Husawazisha faili kwenye hazina na saraka ya kufanya kazi kwenye kontena.
Hujaribu kiotomatiki kwa kutumia chombo-muundo-jaribio.
Bandari za mbele.
Husoma kumbukumbu za programu inayoendeshwa kwenye kontena.
Husaidia katika utatuzi wa programu zilizoandikwa katika Java, Node.js, Python, Go.
Sasa kuhusu vipengele:
Skaffold yenyewe haina vijenzi vya upande wa nguzo. Hiyo ni, hakuna haja ya kusanidi zaidi Kubernetes kutumia matumizi haya.
Mabomba tofauti ya maombi yako. Je, unahitaji kusambaza msimbo kwa Minikube ya ndani wakati unatengeneza, na kisha kwa jukwaa au uzalishaji? Kwa kusudi hili kuna profaili na usanidi wa mtumiaji, vigezo vya mazingira na bendera, ambayo inakuwezesha kuelezea mabomba tofauti kwa programu moja.
CLI. Huduma na usanidi wa kiweko katika YAML pekee. Kwenye mtandao unaweza kupata marejeleo ya majaribio ya kuunda GUI ya majaribio, hata hivyo, kwa wakati huu uwezekano mkubwa unamaanisha tu kwamba mtu anamhitaji, lakini si kweli.
Utaratibu. Skaffold sio kivunaji cha kujitegemea, lakini hujitahidi kutumia moduli za kibinafsi au suluhisho zilizopo kwa kazi maalum.
Mchoro wa mwisho:
Katika hatua ya mkusanyiko unaweza kutumia:
docker kujenga ndani ya nchi, katika nguzo kwa kutumia kaniko au katika Google Cloud Build;
Bazel ndani ya nchi;
Jib Maven na Jib Gradle ndani ya nchi au katika Google Cloud Build;
hati za ujenzi maalum huendeshwa ndani ya nchi. Ikiwa unahitaji kuendesha suluhisho lingine (inayonyumbulika zaidi/inayojulikana/...) la kujenga, imeelezewa kwenye hati ili Skaffold aizindue (mfano kutoka kwa nyaraka) Hii inakuwezesha kutumia mtoza yeyote anayeweza kuitwa kwa kutumia hati;
Shukrani kwa hili, Skaffold inaweza kuitwa ya kipekee mfumo wa kujenga CI/CD. Hapa kuna mfano wa mtiririko wa kazi wakati wa kuitumia (kutoka kwa nyaraka za mradi):
Je, kazi ya Skaffold inaonekanaje kwa ujumla?
Wachunguzi wa matumizi hubadilika katika saraka ya msimbo wa chanzo. Marekebisho yakifanywa kwa faili, yanalandanishwa na ganda la programu katika kundi la Kubernetes. Ikiwezekana, bila kuunganisha tena picha. Vinginevyo, picha mpya imekusanywa.
Picha iliyokusanywa inakaguliwa kwa kutumia chombo-muundo-jaribio, iliyowekwa alama na kutumwa kwa Usajili wa Doka.
Baada ya hayo, picha inatumwa - imetumwa kwenye nguzo ya Kubernetes.
Ikiwa uzinduzi ulianzishwa kwa kutumia amri skaffold dev, kisha tunaanza kupokea kumbukumbu kutoka kwa programu, na Skaffold inasubiri mabadiliko ili kurudia vitendo vyote tena.
Mchoro wa hatua kuu za operesheni ya Skaffold
Fanya mazoezi. Kujaribu Skaffold
Ili kuonyesha matumizi ya Skaffold, nitachukua mfano kutoka Hifadhi ya mradi wa GitHub. Japo kuwa, hapo Unaweza kupata mifano mingine mingi ambayo inazingatia maalum tofauti. Nitafanya vitendo vyote ndani ya Minikube. Usakinishaji ni rahisi na huchukua dakika chache, na utahitaji kubectl ili kuanza.
Wacha tulinganishe hazina ya Skaffold na mifano inayofaa:
git clone https://github.com/GoogleContainerTools/skaffold
cd skaffold/examples/microservices
Nilichagua mfano na maganda mawili, kila moja ikiwa na programu ndogo ya Go. Programu moja ni sehemu ya mbele (leeroy-web), ambayo inaelekeza ombi kwa programu ya pili - mazingira ya nyuma (leeroy-app). Wacha tuone jinsi inavyoonekana:
leeroy-app na leeroy-web zina Go code na Dockerfiles rahisi za kuunda msimbo huu ndani ya nchi:
~/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 .
Sitatoa nambari ya maombi - inatosha kujua hilo leeroy-web inakubali maombi na kuwapa washirika leeroy-app. Kwa hivyo kwenye faili Deployment.yaml kuna Huduma kwa ajili tu app (kwa uelekezaji wa ndani). Mlango wa ganda web tutaituma kwetu kwa ufikiaji wa haraka wa programu.
Hatua zote zilizotajwa hapo juu zimeelezewa hapa. Kwa kuongezea usanidi huu, pia kuna faili iliyo na mipangilio ya ulimwengu - ~/.skaffold/config. Inaweza kuhaririwa kwa mikono au kupitia CLI - kwa mfano, kama hii:
skaffold config set --global local-cluster true
Amri hii itaweka utofauti wa kimataifa local-cluster kwenye maana true, baada ya hapo Skaffold haitajaribu kushinikiza picha kwenye Usajili wa mbali. Ikiwa unakuza ndani ya nchi, unaweza kutumia amri hii kuunda picha ndani ya nchi.
Rudi kwa skaffold.yaml:
Kwenye jukwaa build tunabainisha kuwa unahitaji kukusanya na kuhifadhi picha ndani ya nchi. Baada ya ujenzi kuanza kwa mara ya kwanza, tutaona yafuatayo:
// т.к. 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
Kama unavyoona, Skaffold aliweka tagi picha mwenyewe. Kwa njia, sera kadhaa za kuweka alama zinaungwa mkono.
Zaidi katika usanidi imeonyeshwa context: ./leeroy-app/, i.e. muktadha ambamo picha inakusanywa imebainishwa.
Katika hatua ya kupeleka, imedhamiriwa kuwa tutatumia kubectl na barakoa kwa maonyesho muhimu.
PortForward: sawa na jinsi sisi kawaida kusambaza bandari kutumia kubectl port-forward, tunatoa maagizo kwa Skaffold kupiga amri hii. Katika kesi hii, bandari ya ndani 9000 inatumwa kwa 8080 katika Usambazaji na jina. leeroy-web.
Ni wakati wa kuzindua skaffold dev: Timu itaunda "kitanzi cha maoni" kinachoendelea, i.e. sio tu itakusanya kila kitu na kupeleka kwenye nguzo, lakini pia itakuambia kuhusu hali ya maganda kwa sasa, kufuatilia mabadiliko na kusasisha hali ya maganda.
Haya hapa matokeo ya uzinduzi skaffold dev --port-forward wakati wa kukusanyika tena:
Kwanza, unaweza kuona kwamba cache inatumiwa. Ifuatayo, programu inakusanywa, kutumwa, na bandari hutumwa. Tangu kubainishwa --port-forward, Skaffold ilisambaza bandari kwa web, kama alivyoulizwa, lakini hapa app alitupa kwa hiari yake mwenyewe (alichagua aliye karibu na bure). Baada ya hayo, tunapokea magogo ya kwanza kutoka kwa programu.
Wacha tuangalie ikiwa inafanya kazi?
~/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!!!
Kubadilisha faili leeroy-app/app.go - sekunde chache hupita ... na:
~/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!!!
Wakati huo huo, Skaffold yenyewe ilionyesha kitu kile kile kwenye koni kama hapo awali, isipokuwa nukta moja: ilitoka tu. leeroy-app, na sio wote mara moja.
Mazoezi zaidi
Inafaa pia kutaja kuwa wakati wa kuunda mradi mpya, usanidi wa Skaffold unaweza kufungwa kwa kutumia amri. init, ambayo ni rahisi sana. Kwa kuongezea, unaweza kuandika usanidi kadhaa: fanya usanidi kwenye usanidi chaguo-msingi, na kisha ueneze kwa hatua na amri. run (mchakato sawa na dev, haifuatilii mabadiliko), kwa kutumia usanidi tofauti.
Kwenye katacoda kuna mwongozo Ni rahisi zaidi kwa mfano. Lakini inatoa sandbox iliyotengenezwa tayari na Kubernetes, programu na Skaffold. Chaguo nzuri ikiwa una nia ya kujaribu mambo ya msingi mwenyewe.
Kesi moja inayowezekana ya utumiaji kwa Skaffold ni kufanya usanidi kwenye nguzo ya mbali. Sio kila mtu yuko vizuri kuendesha Minikube kwenye maunzi yake mwenyewe, kisha kusambaza programu na kutarajia ifanye kazi vya kutosha... Katika kesi hii, Skaffold hutatua tatizo kikamilifu, ambayo inaweza kuthibitishwa, kwa mfano, na wahandisi wa Reddit, kama tunavyo. tayari kujadiliwa писали katika blogu yetu.
Na ndani uchapishaji huu kutoka kwa Weaveworks unaweza kupata mfano wa kuunda bomba la uzalishaji.
Hitimisho
Skaffold ni zana rahisi ya kujenga mabomba ambayo inahusisha kusambaza maombi kwa Kubernetes na yanalenga hasa mahitaji ya maendeleo. Inafanya iwe rahisi sana kuunda bomba "fupi" ambalo linazingatia mahitaji ya msingi ya msanidi programu, lakini ikiwa inataka, unaweza kupanga michakato mikubwa. Kama moja ya mifano wazi ya kutumia Skaffold katika michakato ya CI/CD imepewa kama mradi wa mtihani ya huduma ndogo 10 zinazotumia uwezo wa Kubernetes, gRPC, Istio na Ufuatiliaji wa OpenCensus.
Skaffold tayari ina takriban nyota 8000+ kwenye GitHub, imetengenezwa na Google na ni sehemu ya GoogleContainerTools - kwa ujumla, kwa sasa kuna kila sababu ya kuamini kuwa mradi utaendelea kwa furaha milele.