Skaffold apskats Kubernetes attīstībai

Skaffold apskats Kubernetes attīstībai

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:

  • Skaffold piedāvā rÄ«kus CI/CD cauruļvadu izveidei.
  • Ä»auj pārraudzÄ«t izmaiņas avota kodā fonā un palaist automatizētu koda apkopoÅ”anas procesu konteinera attēlos, publicējot Å”os attēlus Docker reÄ£istrā un izvietojot tos Kubernetes klasterÄ«.
  • Sinhronizē failus repozitorijā ar darba direktoriju konteinerā.
  • Automātiski pārbauda, ā€‹ā€‹izmantojot konteinera struktÅ«ras testu.
  • Uz priekÅ”u porti.
  • 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;
  • TestÄ“Å”anas stadijā jau pieminētais konteinera struktÅ«ras pārbaude;
  • IzvietoÅ”anai tiek nodroÅ”ināts:
    • Kubectl;
    • StÅ«re;
    • pielāgot.

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):

Skaffold apskats Kubernetes attīstībai

Kā kopumā izskatās Skaffold darbs?

  1. 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.
  2. Samontētais attēls tiek pārbaudīts, izmantojot konteinera struktūras testu, atzīmēts un nosūtīts uz Docker reģistru.
  3. Pēc tam attēls tiek izvietots ā€” tiek izvietots Kubernetes klasterÄ«.
  4. 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 apskats Kubernetes attīstībai
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.

Instalējiet Skaffold:

curl -Lo skaffold https://storage.googleapis.com/skaffold/releases/latest/skaffold-linux-amd64
chmod +x skaffold
sudo mv skaffold /usr/local/bin
skaffold version
v0.37.1

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:

~/skaffold/examples/microservices # tree
.
ā”œā”€ā”€ leeroy-app
ā”‚   ā”œā”€ā”€ app.go
ā”‚   ā”œā”€ā”€ Dockerfile
ā”‚   ā””ā”€ā”€ kubernetes
ā”‚       ā””ā”€ā”€ deployment.yaml
ā”œā”€ā”€ leeroy-web
ā”‚   ā”œā”€ā”€ Dockerfile
ā”‚   ā”œā”€ā”€ kubernetes
ā”‚   ā”‚   ā””ā”€ā”€ deployment.yaml
ā”‚   ā””ā”€ā”€ web.go
ā”œā”€ā”€ README.adoc
ā””ā”€ā”€ skaffold.yaml
 
4 directories, 8 files

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.

Izskatās skaffold.yaml:

~/skaffold/examples/microservices # cat skaffold.yaml
apiVersion: skaffold/v1beta13
kind: Config
build:
  artifacts:
    - image: leeroy-web
      context: ./leeroy-web/
    - image: leeroy-app
      context: ./leeroy-app/
deploy:
  kubectl:
    manifests:
      - ./leeroy-web/kubernetes/*
      - ./leeroy-app/kubernetes/*
portForward:
  - resourceType: deployment
    resourceName: leeroy-web
    port: 8080
    localPort: 9000

Å 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ļ:

Skaffold apskats Kubernetes attīstībai

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!!!

Faila pārveidoŔana leeroy-app/app.go - paiet dažas sekundes... un:

~/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.

PS

Lasi arī mūsu emuārā:

Avots: www.habr.com

Pievieno komentāru