Skaffoldi ĂŒlevaade Kubernetesel arendamiseks

Skaffoldi ĂŒlevaade Kubernetesel arendamiseks

Poolteist aastat tagasi, 5. mĂ€rtsil 2018, kĂ€ivitas Google oma avatud lĂ€htekoodiga CI/CD projekti, mille nimi on Skaffold, mille eesmĂ€rk on luua „lihtne ja reprodutseeritav arendus Kuberneteses”, et arendajad saaksid keskenduda tĂ”eliselt arendusele, mitte haldamisele. Miks on Skaffold huvitav? Selgub, et tal on mĂ”ned trumpĂ€ssad varrukas, mis vĂ”ivad teha sellest tugeva tööriista arendajatele ja vĂ”ib-olla ka eksploiteerimise inseneridele. Tutvume projekti ja selle vĂ”imalustega.

NB: Muide, oleme juba lĂŒhidalt rÀÀkinud Skaffoldist meie ĂŒldises arendajate tööriistade ĂŒlevaates, kelle elu on seotud Kubernetesega.

Teooria. EesmÀrk ja vÔimalused

Seega, kui rÀÀkida ĂŒldiselt, lahendab Skaffold CI/CD tsĂŒkli automatiseerimise ĂŒlesande (ehitamisel, tĂ”ukamisel, juurutamisel), pakkudes arendajale kiiret tagasisidet, st vĂ”imalust kiiresti saada tulemusi koodimuutuste kohta - vĂ€rskendatud rakenduse nĂ€ol, mis töötab Kuberneteses. See vĂ”ib toimida erinevates keskkondades (dev, stage, production...), mille jaoks Skaffold aitab kirjeldada vastavaid vĂ€ljalaskepipeline'e.

Skaffoldi lĂ€htekood on kirjutatud Go keeles, GNU Üldine Avaliku litsentsi alusel. Apache License 2.0 (GitHub) vabakirjanduse tingimustel.

Vaadakem peamisi funktsioone ja omadusi. Esimeste seas vÔib nimetada jÀrgmist:

  • Skaffold pakub vahendeid CI/CD pipeline'ide loomiseks.
  • See vĂ”imaldab taustal jĂ€lgida muudatusi lĂ€htekoodis ja kĂ€ivitada automatiseeritud protsesse koodi kompileerimiseks konteineripiltideks, nende piltide avaldamiseks Docker Registry's ja nende juurutamiseks Kubernetesesse.
  • SĂŒnkroniseerib failid hoidlas konteineri töötava kataloogiga.
  • Automaatne testimine container-structure-test abil.
  • Edastab porte.
  • Lugeda rakenduse logisid, mis on konteineris kĂ€ivitatud.
  • Aitab Java, Node.js, Python, Go keeles kirjutatud rakenduste tĂ”rkeotsingul.

NĂŒĂŒd rÀÀgime omadustest:

  • Skaffoldil ei ole klastripoolseid komponente. See tĂ€hendab, et Kubernetesit pole vaja selle tööriista kasutamiseks tĂ€iendavalt seadistada.
  • Erinevad torud teie rakendusele. Kas peate koodi kohaliku Minikube'i kaudu vĂ€lja andma, samal ajal kui te arendate, ja seejĂ€rel stseenis vĂ”i tootmises? Selleks on ette nĂ€htud profiilid ja kasutajakohased konfiguratsioonid, keskkonnamuutujad ja lipud, mis vĂ”imaldavad ĂŒhte rakendust erinevalt kirjeldada.
  • CLI. Ainult konsooli tööriist ja YAML konfiguratsioonid. Internetis leidub teateid katsetest luua eksperimentaalset GUI-d, kuid praegu tĂ€hendab see pigem seda, et keegi vajab seda, kuid mitte vĂ€ga palju.
  • Modulaarsus. Skaffold ei ole iseseisev kombain, vaid pĂŒĂŒab kasutada eraldi mooduleid vĂ”i juba olemasolevaid lahendusi konkreetsete ĂŒlesannete jaoks.

Viimase illustratsioon:

  • Ehitusfaasis saab kasutada:
    • docker build kohalikult, klastris kaniko abil vĂ”i Google Cloud Build'is;
    • Bazel kohalikult;
    • Jib Maven ja Jib Gradle kohalikult vĂ”i Google Cloud Build'is;
    • kohandatud build-skriptid, mis kĂ€ivitatakse kohalikult. Kui vajate teistsugust (paindlikumat / tuttavamat / 
) kogumise lahendust, siis see kirjeldatakse skriptis, et Skaffold kĂ€ivitaks just selle.dokumendi nĂ€ide) See vĂ”imaldab kasutada ĂŒldse mitte mingit kogujat, mida on vĂ”imalik skripti abil kutsuda;
  • Testeetapis toetatakse juba mainitud container-structure-test;
  • Deployimiseks on ette nĂ€htud:
    • Kubectl;
    • Helm;
    • kustomize.

Selle tÔttu vÔib Skaffoldit nimetada teatud mÀÀral CI/CD ehitamise raamistiku. Siin on nÀide töökÀigust selle kasutamisel (projekti dokumentatsioonist):

Skaffoldi ĂŒlevaade Kubernetesel arendamiseks

Kuidas nĂ€eb Skaffoldi töö ĂŒldiselt vĂ€lja?

  1. Tööriist jĂ€lgib muudatusi lĂ€htekoodi kataloogis. Kui failidesse tehakse muudatusi, sĂŒnkroonitakse need rakenduse pod'iga Kubernetes klastris. Kui vĂ”imalik, siis ilma uue pildi eelnevata ehitamiseta. Kui see pole vĂ”imalik, siis ehitatakse uus pilt.
  2. Ehitatud pilti kontrollitakse container-structure-testiga, mÀrgistatakse ja saadetakse Docker Registry'sse.
  3. PĂ€rast seda pilti deployitakse – arendatakse ĂŒles Kubernetes klastris.
  4. Kui kÀivitamine algatati kÀsu kaudu skaffold dev, siis hakkame saama rakendusest logisid, samas kui Skaffold ootab muudatusi, et kÔik toimingud uuesti korda teha.

Skaffoldi ĂŒlevaade Kubernetesel arendamiseks
Skaffoldi töö peamiste etappide illustreerimine

Praktika. Proovime Skaffoldi

Skaffoldi kasutamise demonstreerimiseks vÔtan nÀite projekti GitHubi hoidlast.Muide, seal on samuti mitmeid teisi nÀiteid, mis arvestavad erinevaid spetsiifikasid. KÔik toimingud teen kohapeal Minikubes. Installimine on lihtne ja vÔtab vaid mÔned minutid, kuid töötamiseks on vajalik kubectl.

Paigaldame Skaffoldi:

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

Kloonime endale Skaffoldi hoidla vajalike nÀidetega:

git clone https://github.com/GoogleContainerTools/skaffold
cd skaffold/examples/microservices

Valisin nĂ€ite kahe pod’iga, millest igaĂŒhes on ĂŒks vĂ€ike Go-rakendus. Üks rakendus on front-end (leeroy-web), mis suunab pĂ€ringu teisele rakendusele — back-endile (leeroy-app). Vaatame, kuidas see vĂ€lja nĂ€eb:

~/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 kausta, 8 faili

leeroy-app ja leeroy-web sisaldavad Go koodi ja lihtsaid Dockerfiles selle kohaliku ehitamiseks:

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

Rakenduste koodi ma nĂ€itama ei hakka — piisab sellest, et leeroy-web vastab pĂ€ringutele ja edastab need leeroy-app. SeetĂ”ttu failides Deployment.yaml on ainult Service app (sisemiseks marsruutimiseks). Pod'i port web edastatakse meile rakendusele kiire ligipÀÀsuks.

Kuidas nÀeb vÀlja 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

Siin on kirjeldatud kĂ”ik etapid, mis eelnevalt mainitud. Lisaks sellele konfiguratsioonile on olemas ka globaalsete seadistustega fail — ~/.skaffold/config. Seda saab redigeerida kĂ€sitsi vĂ”i CLI abil — nĂ€iteks nii:

skaffold config set --global local-cluster true

See kĂ€sk seab globaalse muutujana local-cluster vÀÀrtuse true, pĂ€rast mida Skaffold ei pĂŒĂŒa pilte kaugregistrisse 'push'ida. Kui töötate lokaalsetes tingimustes, saate seda kĂ€sku kasutada, et koguda pilte samuti lokaalselt.

Naaseme skaffold.yaml:

  • etappi build , kus mÀÀrame, et pilt tuleb koguda ja salvestada lokaalselt. PĂ€rast esmakordset kompileerimise kĂ€ivitamist nĂ€eme jĂ€rgmist:
    // т.Đș. 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

    Kuidas nÀha, Skaffold ise markeeris pildid. Muide, toetatakse mitmeid markeerimispoliitikaid.

  • Edasi on konfis nĂ€idatud context: ./leeroy-app/, st on mÀÀratud kontekst, milles pilti kogutakse.
  • Depoos mÀÀratakse, et kasutame kubectl’i ja maski vajalike manifestide jaoks.
  • PortForward: sarnaselt sellele, kuidas me tavaliselt porte edastame kubectl port-forward, anname Skaffoldile korralduse selle kĂ€su vĂ€ljakutsumiseks. Antud juhul — lokaalne port 9000 suunatakse 8080-le Deployment'is, mille nimi on leeroy-web.

On aeg alustada skaffold dev: kĂ€sk loob jĂ€tkuva „tagasiside tsĂŒkli“, st mitte ainult ei kogu kĂ”ike ja ei depoleeri klastrisse, vaid ka ĂŒtleb pod'ide seisundi hetkel, jĂ€lgib muudatusi ja uuendab pod'ide seisundit.

Siin on kÀivitamise tulemus skaffold dev --port-forward uuesti kokkupanemise korral:

Skaffoldi ĂŒlevaade Kubernetesel arendamiseks

Esiteks on nĂ€ha, et kasutatakse vahemĂ€lu. Edasi — rakendus kogutakse, depoleeritakse, ja portide edastamine toimub. Kuna on mÀÀratud --port-forward, Skaffold edastas porti kuni web, nagu paluti, kuid app ta edastas oma Ă€ranĂ€gemise jĂ€rgi (valis lĂ€hima vaba). PĂ€rast seda saame esimesed logid rakendustest.

Kontrollime toimivust?

~/skaffold/examples/microservices # kubectl get po
NIMI                           VALMIS  SEISUND  UUESTIKÄIVITAMISD  VANUS
leeroy-app-6998dfcc95-2nxvf   1/1     KĂ€ib    0           103s
leeroy-web-69f7d47c9d-5ff77    1/1     KĂ€ib    0           103s
~/skaffold/examples/microservices # curl localhost:9000
leeroooooy app!!!

Muudame faili leeroy-app/app.go — möödub paar sekundit
 ja:

~/skaffold/examples/microservices # kubectl get po
NIMI                           VALMIS  SEISUND  UUESTIKÄIVITAMISD  VANUS
leeroy-app-ffd79d986-l6nwp    1/1     KĂ€ib    0           11s
leeroy-web-69f7d47c9d-5ff77    1/1     KĂ€ib    0           4m59s
~/skaffold/examples/microservices # curl localhost:9000
leeroooooy Habr!!!

Skaffold vĂ€ljastas konsoolis sama, mis varem, vĂ€lja arvatud ĂŒks aspekt: ta nĂ€itas ainult leeroy-app, mitte kĂ”ike korraga.

Rohkem praktikat

Tasub mainida, et uue projekti loomisel saab Skaffoldi konfiguratsioone „bootstrap‘ida” kĂ€suga init, mis on vĂ€ga mugav. Lisaks saab kirjutada mitu konfiguratsiooni: arendada vaikimisi konfiguratsiooni jĂ€rgi ja seejĂ€rel minna etappi kĂ€suga run sama protsess, mis on dev, kuid ei jĂ€lgi muudatusi, kasutades teist konfiguratsiooni.

Katacodas on juhend nÀide, mis on veelgi lihtsam. Seal on juba valmis liivakast koos Kubernetes, rakenduse ja Skaffoldiga. SuurepÀrane vÔimalus, kui soovite ise proovida kÔige tÀhtsamaid aspekte.

Üks vĂ”imalik Skaffoldi kasutamise variant on arendustöö kaugklastri peal. Mitte kĂ”ik ei soovi kĂ€ivitada Minikube'i oma riistvaral, pĂ€rast mida rakendust kĂ€ivitada ja oodata selle korrektselt toimimist
 Sel juhul lahendab Skaffold ĂŒlesande suurepĂ€raselt, millest vĂ”ivad kinnitada nĂ€iteks Redditi insenerid, nagu oleme juba kirjutanud meie blogist.

Ja selles publikatsioonis Weaveworksilt leiate nÀite tootmispipeline'i loomisest.

KokkuvÔte

Skaffold — mugav tööriist rakenduste juurutamise protsesside ĂŒlesehitamiseks Kuberneteses, mis keskendub eelkĂ”ige arenduse vajadustele. Selle abil on suhteliselt lihtne luua "lĂŒhi" protsess, mis arvestab arendaja peamisi vajadusi, kuid soovi korral on vĂ”imalik korraldada ka keerukamaid protsesse. NĂ€iteks vĂ”ib tuua Skaffoldi kasutamise nĂ€itena CI/CD protsessides on toodud selline testprojekt 10 mikroteenust, mis kasutavad Kubernetes, gRPC, Istio ja OpenCensus jĂ€lgimist.

Skaffold on saanud peaaegu 8000+ tĂ€hte GitHubis, seda arendab Google ja see kuulub GoogleContainerTools — praegu on igal juhul kĂ”ik tĂ”endid, et projekt jĂ€tkab pika ja eduka arengu teed.

P.S.

Lugege ka meie blogist:

Allikas: habr.com

Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster