
Sena u nofs ilu, fil-5 ta’ Marzu 2018, Google ħarġet l-ewwel verżjoni alpha tal-proġett Open Source tagħha għal CI/CD imsejħa , li l-għan tiegħu kien li joħloq "żvilupp Kubernetes sempliċi u ripetibbli" sabiex l-iżviluppaturi jkunu jistgħu jiffukaw fuq l-iżvilupp aktar milli l-amministrazzjoni. X'jista' jkun interessanti dwar Skaffold? Kif jirriżulta, għandu ftit tricks fil-kmiem li jistgħu jagħmluha għodda qawwija għall-iżviluppatur, u forsi anke l-inġinier tal-operazzjonijiet. Ejja nagħmlu familjari mal-proġett u l-kapaċitajiet tiegħu.
NB: Mill-mod, diġà tkellimna fil-qosor dwar Skaffold fil-ġenerali tagħna , li ħajjitha hija konnessa ma 'Kubernetes.
Teorija. Għan u kapaċitajiet
Allura, b'mod ġenerali, Skaffold issolvi l-problema tal-awtomatizzazzjoni taċ-ċiklu CI/CD (fl-istadji tal-bini, l-imbuttar, l-iskjerament), li joffri lill-iżviluppatur feedback fil-pront, i.e. l-abbiltà li tirċievi malajr ir-riżultat ta 'bidliet sussegwenti fil-kodiċi - fil-forma ta' applikazzjoni aġġornata li taħdem fil-cluster Kubernetes. U jista 'jaħdem f'ċirkwiti differenti (dev, stadju, produzzjoni...), li għalihom Skaffold jgħin biex jiddeskrivi l-pipelines korrispondenti għat-tnedija.
Il-kodiċi tas-sors ta' Skaffold huwa miktub f'Go, taħt il-Liċenzja Apache 2.0 b'xejn (GitHub).
Ejja nħarsu lejn il-funzjonijiet u l-karatteristiċi ewlenin. L-ewwel jinkludu dan li ġej:
- Skaffold joffri għodod għall-ħolqien ta' pipelines CI/CD.
- Jippermettilek tissorvelja l-bidliet fil-kodiċi tas-sors fl-isfond u tmexxi proċess awtomatizzat ta 'assemblaġġ ta' kodiċi f'immaġini ta 'kontenitur, tippubblika dawn l-immaġini fir-Reġistru Docker u skjeramenthom fil-cluster Kubernetes.
- Jissinkronizza fajls fir-repożitorju mad-direttorju tax-xogħol fil-kontenitur.
- Testijiet awtomatikament bl-użu ta 'kontenitur-istruttura-test.
- Portijiet 'il quddiem.
- Jaqra r-reġistri ta' applikazzjoni li taħdem f'kontenitur.
- Jgħin fid-debugging ta' applikazzjonijiet miktuba f'Java, Node.js, Python, Go.
Issa dwar il-karatteristiċi:
- Skaffold innifsu m'għandu l-ebda komponenti tal-cluster-side. Jiġifieri, m'hemmx bżonn li Kubernetes jiġi kkonfigurat aktar biex juża din l-utilità.
- Pipelines differenti għall-applikazzjoni tiegħek. Għandek bżonn biex toħroġ il-kodiċi għal Minikube lokali waqt li tkun qed tiżviluppa, u mbagħad għall-istadju jew il-produzzjoni? Għal dan il-għan hemm u konfigurazzjonijiet tal-utent, varjabbli ambjentali u bnadar, li jippermettulek tiddeskrivi pipelines differenti għal applikazzjoni waħda.
- CLI. Utilità u konfigurazzjonijiet tal-console biss f'YAML. Fuq l-Internet tista' ssib referenzi għal tentattivi ta' ħolqien , madankollu, bħalissa dan x'aktarx ifisser biss li xi ħadd għandu bżonnu, iżda mhux verament.
- Modularità. Skaffold mhuwiex ħsad waħdu, iżda għandu l-għan li juża moduli individwali jew soluzzjonijiet eżistenti għal kompiti speċifiċi.
Illustrazzjoni ta' dan tal-aħħar:
- Fl-istadju tal-assemblaġġ tista' tuża:
- docker build lokalment, fi cluster bl-użu tal-kaniko jew fil-Google Cloud Build;
- Bazel lokalment;
- Jib Maven u Jib Gradle lokalment jew f'Google Cloud Build;
- skripts tal-bini tad-dwana jimxu lokalment. Jekk għandek bżonn tmexxi soluzzjoni ta' bini oħra (aktar flessibbli/familjari/...), hija deskritta fl-iskritt sabiex Skaffold iniediha (). Dan jippermettilek tuża kwalunkwe kollettur li jista 'jissejjaħ bl-użu ta' skript;
- Fl-istadju tal-ittestjar, il-diġà msemmija ;
- Għall-iskjerament huma pprovduti dawn li ġejjin:
- Kubectl;
- Tmun;
- Ippersonalizza.
Grazzi għal dan, Skaffold jista 'jissejjaħ uniku qafas għall-bini tas-CI/CD. Hawn hu eżempju ta' fluss tax-xogħol meta tużah (mid-dokumentazzjoni tal-proġett):

Kif jidher ix-xogħol ta' Skaffold f'termini ġenerali?
- L-utilità timmonitorja l-bidliet fid-direttorju tal-kodiċi tas-sors. Jekk isiru modifiki fil-fajls, huma sinkronizzati mal-pod tal-applikazzjoni fil-cluster Kubernetes. Jekk possibbli, mingħajr ma terġa' tgħaqqad l-immaġni. Inkella, tinġabar immaġni ġdida.
- L-immaġni immuntata tiġi ċċekkjata bl-użu tat-test tal-istruttura tal-kontenitur, ittikkettata u mibgħuta lir-Reġistru Docker.
- Wara dan, l-immaġni hija skjerata - skjerata fil-cluster Kubernetes.
- Jekk it-tnedija kienet inizjalizzata bl-użu tal-kmand
skaffold dev, imbagħad nibdew nirċievu zkuk mill-applikazzjoni, u Skaffold jistenna li l-bidliet jerġgħu jirrepetu l-azzjonijiet kollha.

Illustrazzjoni tal-istadji ewlenin tal-operat tal-Skaffold
Prattika. Jippruvaw Skaffold
Biex nuri l-użu ta 'Skaffold, se nieħu eżempju minn . Mill-mod, Tista 'ssib ħafna eżempji oħra li jqisu ispeċifiċitajiet varji. Se nwettaq l-azzjonijiet kollha lokalment f'Minikube. L-installazzjoni hija sempliċi u tieħu ftit minuti, u jkollok bżonn kubectl biex tibda.
Installa 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.1Ejja nikklonu r-repożitorju ta’ Skaffold bl-eżempji meħtieġa:
git clone https://github.com/GoogleContainerTools/skaffold
cd skaffold/examples/microservicesGħażilt eżempju b'żewġ imżiewed, kull wieħed ikun fih applikazzjoni waħda żgħira ta' Go. Applikazzjoni waħda hija l-frontend (leeroy-web), li tidderieġi t-talba għat-tieni applikazzjoni - il-backend (leeroy-app). Ejja naraw kif jidher:
~/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 filesleeroy-app u leeroy-web fihom kodiċi Go u Dockerfiles sempliċi biex jibnu dan il-kodiċi lokalment:
~/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 . Mhux se nagħti l-kodiċi tal-applikazzjoni - huwa biżżejjed li tkun taf dan leeroy-web jaċċetta talbiet u jagħtihom prokura leeroy-app. Għalhekk fil-fajls Deployment.yaml hemm Servizz biss għal app (għal rotta interna). Pod port web aħna se ngħadduha lilna nfusna għal aċċess rapidu għall-applikazzjoni.
Kif tidher 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 L-istadji kollha msemmija hawn fuq huma deskritti hawn. Minbarra din il-konfigurazzjoni, hemm ukoll fajl b'settings globali - ~/.skaffold/config. Jista' jiġi editjat manwalment jew permezz tas-CLI - pereżempju, bħal dan:
skaffold config set --global local-cluster true Dan il-kmand se jistabbilixxi l-varjabbli globali local-cluster fis-sens true, wara li Skaffold mhux se jipprova jimbotta immaġini għar-reġistru remot. Jekk qed tiżviluppa lokalment, tista' tuża dan il-kmand biex tibni immaġini lokalment.
Lura għal skaffold.yaml:
- Fuq il-palk
buildaħna nispeċifikaw li għandek bżonn tiġbor u tissejvja l-immaġni lokalment. Wara li l-bini jibda għall-ewwel darba, se naraw dan li ġej:// т.к. 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.1MBKif tistgħu taraw, Skaffold tikketta l-immaġini hu stess. Mill-mod, diversi politiki ta 'tikkettar huma appoġġjati.
- Aktar fil-konfigurazzjoni huwa indikat
context: ./leeroy-app/, i.e. il-kuntest li fih tinġabar l-immaġni huwa speċifikat. - Fl-istadju tal-iskjerament, huwa determinat li se nużaw kubectl u maskra għall-manifesti meħtieġa.
-
PortForward: simili għal kif aħna normalment tibgħat portijiet bl-użukubectl port-forward, aħna nagħtu struzzjonijiet lil Skaffold biex isejjaħ dan il-kmand. F'dan il-każ, il-port lokali 9000 jintbagħat lil 8080 f'Deployment bl-isemleeroy-web.
Wasal iż-żmien li tniedi skaffold dev: It-tim se joħloq “loop ta’ feedback” kontinwu, i.e. mhux biss se tiġbor kollox u tiskjerah fil-cluster, iżda wkoll tgħidlek dwar l-istat tal-imżiewed fil-mument, tissorvelja l-bidliet u taġġorna l-istat tal-imżiewed.
Hawn hu r-riżultat tat-tnedija skaffold dev --port-forward meta tgħaqqad mill-ġdid:

L-ewwel, tista 'tara li l-cache qed jintuża. Sussegwentement, l-applikazzjoni tiġi mmuntata, skjerata, u l-portijiet jintbagħtu. Peress speċifikat --port-forward, Skaffold bagħtet il-port lil web, kif kien mistoqsi, imma hawn app tefa’ fid-diskrezzjoni tiegħu (għażel l-eqreb wieħed ħieles). Wara dan, nirċievu l-ewwel zkuk mill-applikazzjonijiet.
Ejja niċċekkjaw jekk taħdimx?
~/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!!! Timmodifika l-fajl leeroy-app/app.go - jgħaddu ftit sekondi... u:
~/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!!! Fl-istess ħin, Skaffold innifsu wera l-istess ħaġa fil-console bħal qabel, bl-eċċezzjoni ta 'punt wieħed: ħarġet biss leeroy-app, u mhux kollha f'daqqa.
Aktar prattika
Ta’ min isemmi wkoll li meta jinħoloq proġett ġdid, il-konfigurazzjonijiet għal Skaffold jistgħu jiġu bootstrapped bl-użu tal-kmand init, li huwa konvenjenti ħafna. Barra minn hekk, tista 'tikteb diversi konfigurazzjonijiet: wettaq żvilupp fuq il-konfigurazzjoni default, u mbagħad roll out għall-istadju bil-kmand run (l-istess proċess bħal dev, sempliċement ma jimmonitorjax il-bidliet), bl-użu ta 'konfigurazzjoni differenti.
Fuq katacoda hemm Huwa saħansitra aktar faċli b'eżempju. Iżda joffri sandbox lest b'Kubernetes, applikazzjoni u Skaffold. Għażla kbira jekk int interessat li tipprova l-affarijiet bażiċi lilek innifsek.
Każ ta' użu possibbli għal Skaffold huwa li twettaq żvilupp fuq cluster remot. Mhux kulħadd huwa komdu jmexxi Minikube fuq il-ħardwer tiegħu stess, imbagħad iħaddem l-applikazzjoni u jistenna li taħdem b'mod adegwat... F'dan il-każ, Skaffold issolvi l-problema perfettament, li tista 'tiġi kkonfermata, pereżempju, mill-inġiniera ta' Reddit, kif għandna diġà diskussi fil-blog tagħna.
U fl- minn Weaveworks tista 'ssib eżempju ta' ħolqien ta 'pipeline għall-produzzjoni.
Konklużjoni
Skaffold hija għodda konvenjenti għall-bini ta 'pipelines li jinvolvu t-tnedija ta' applikazzjonijiet għal Kubernetes u huma primarjament iffukati fuq il-ħtiġijiet ta 'żvilupp. Jagħmilha pjuttost faċli li jinħoloq pipeline "qasir" li jqis il-ħtiġijiet bażiċi tal-iżviluppatur, iżda jekk mixtieq, tista 'torganizza proċessi akbar. Bħala wieħed mill-eżempji ċari tal-użu ta' Skaffold fi proċessi CI/CD bħal ta’ 10 mikroservizzi li jużaw il-kapaċitajiet ta’ Kubernetes, gRPC, Istio u OpenCensus Tracing.
Skaffold diġà għandu kważi 8000+ stilla fuq GitHub, huwa żviluppat minn Google u huwa parti minn — b'mod ġenerali, bħalissa hemm kull raġuni biex wieħed jemmen li l-proġett se jiżviluppa kuntenti għal dejjem.
PS
Aqra wkoll fuq il-blog tagħna:
- «»;
- «»;
- «»;
- «".
Sors: www.habr.com
