Skaffoldi ĂŒlevaade Kubernetes'i arendamiseks

Skaffoldi ĂŒlevaade Kubernetes'i arendamiseks

Poolteist aastat tagasi, 5. mĂ€rtsil 2018, tĂ”i Google turule oma Open Source projekti CI/CD jaoks nimega Skaffold, mille eesmĂ€rk oli luua "lihtne ja uuendatav arendus Kubernetesel", et arendajad saaksid keskenduda tĂ”eliselt arendusele, mitte haldamisele. Miks vĂ”iks Skaffold huvi pakkuda? Selgus, et sellel on mitmeid trumpe varrukas, mis aitavad tal saada tugevaks tööriistaks arendajale ning vĂ”ib-olla ka sĂŒsteemiadministraatorile. Tutvume projekti ja selle vĂ”imalustega.

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

Teooria. EesmÀrk ja vÔimalused

Nii et ĂŒldiselt öeldes, Skaffold lahendab CI/CD tsĂŒkli automatiseerimise ĂŒlesanne (build, push, deploy etappidel), pakkudes arendajale operatiivset tagasisidet, st vĂ”imalust kiiresti saada tulemusi jĂ€rgmiste koodimuudatusete osas - vĂ€rskendatud rakenduse nĂ€ol, mis töötab Kubernetes klastris. Ja see vĂ”ib töötada erinevates keskkondades (dev, stage, production...), mille jaoks Skaffold aitab kirjeldada sobivaid pipeline'e.

Skaffoldi allikakood on kirjutatud Go keeles, levitatakse vabade litsentsi Apache License 2.0 (GitHub) tingimustel.

Vaatame peamisi funktsioone ja omadusi. Esimeste hulka kuuluvad jÀrgmised:

  • Skaffold pakub tööriistu CI/CD pipeline'ide loomiseks.
  • Lubab ajalises reĆŸiimis jĂ€lgida muutusi allikakoodis ja kĂ€ivitada automatiseeritud koodi ehitamise protsessi konteineripiltide loomiseks, nende publitseerimiseks Docker Registry's ning nende juurutamiseks Kubernetes klastris.
  • SĂŒnkroneerib failid repositsioonis konteineris töötava töökataloogiga.
  • Automaatne testimine container-structure-test abil.
  • Suunab porte.
  • Loeb konteineris töötava rakenduse logisid.
  • Aitab rakenduste tĂ”rkeotsingul, mis on kirjutatud Java, Node.js, Python, Go.

NĂŒĂŒd - omadustest:

  • Skaffoldil endal ei ole komponente klastripoolsel kĂŒljel. See tĂ€hendab, et Kubernetesit ei pea selle utiliidi kasutamiseks lisateenuse leiutamisega kohandama.
  • Erinevad pipeline'id teie rakendusele. Kas peate koodi vĂ€ljitama kohalikku Minikube'i, samas kui te arendate, ja seejĂ€rel - stage vĂ”i production? Selle jaoks on ette nĂ€htud isoleerimise profiilid ja kasutajate konfiguratsioonid, keskkonnamuutujad ja lipud, mis vĂ”imaldavad kirjeldada erinevaid vooge ĂŒhe rakenduse jaoks.
  • cli-runtime'is ja kubectl'is. Ainult konsooli utiliit ja konfiguratsioonid YAML-is. VĂ”rgus vĂ”ib leida mainimisi katsetest luua katsetatud GUI, kuid praegu tĂ€hendab see pigem, et kellelegi on see vajalik, kuid mitte vĂ€ga.
  • Modulaarsus. Skaffold ei ole iseseisev kombain, vaid pĂŒĂŒab kasutada eraldi module vĂ”i juba olemasolevaid lahendusi konkreetsete ĂŒlesannete jaoks.

Viimane nÀide:

  • Kogumise etapis vĂ”ib kasutada:
    • docker build kohapeal, klastris kaniko abil vĂ”i Google Cloud Buildis;
    • Bazel kohapeal;
    • Jib Maven ja Jib Gradle kohapeal vĂ”i Google Cloud Buildis;
    • kohandatud build-skripte, mida kĂ€ivitatakse kohapeal. Kui on vaja kĂ€ivitada mĂ”ni muu (paindlikum / tuttavam /
) lahendus, on see kirjas skriptil, et Skaffold kĂ€ivitaks just selle (CSIInlineVolume). See vĂ”imaldab kasutada tegelikult ĂŒkskĂ”ik millisest ehitajast, mida saab skripti abil kutsuda;
  • Testimise etapis toetatakse juba mainitud container-structure-test;
  • Deployimiseks on ette nĂ€htud:
    • Kubectl;
    • Helm;
    • kustomize.

Selle tÔttu saab Skaffoldi nimetada omamoodi CI/CD raamistiku. Siin on nÀide tööprotsessist selle kasutamisel (projekti dokumentatsioonist):

Skaffoldi ĂŒlevaade Kubernetes'i arendamiseks

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

  1. Utiliit jĂ€lgib lĂ€htekoodikaustas toimuvaid muudatusi. Kui failidesse tehakse muudatusi, sĂŒnkroonitakse need rakenduse pod'iga Kuberneteses. Kui see on vĂ”imalik - ilma pildi ĂŒmberkogumiseta. Vastupidisel juhul koostatakse uus pilt.
  2. Koostatud pilti kontrollitakse container-structure-test'i abil, mÀrgistatakse ja saadetakse Docker Registry'sse.
  3. PÀrast seda pilt deployitakse - kÀivitatakse Kuberneteses.
  4. Kui kÀivitamine algatati kÀsu skaffold dev, hakkame saama rakenduse logisid, ja Skaffold ootab muudatusi, et korrata kÔiki toiminguid uuesti.

Skaffoldi ĂŒlevaade Kubernetes'i arendamiseks
Skaffoldi töö pÔhietappide illustreerimine

Praktika. Proovime Skaffoldi

Skaffoldi kasutamise demonstreerimiseks vĂ”tan nĂ€ite projekti GitHubi repolt. ÜkskĂ”ik, seal samas saab leida ka palju teisi nĂ€iteid, mis arvestavad erinevat spetsifikatsiooni. KĂ”iki toiminguid teostan kohapeal Minikube'is. Installatsioon on lihtne ja vĂ”tab vaid paar minutit, ning töö alustamiseks on vajalik kubectl.

Installime 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 Skaffold'i repositooriumi vajalike nÀidistega:

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

Valisin nĂ€ite kahe pod'iga, millest kummaski on ĂŒks vĂ€ike Go rakendus. Üks rakendus on frontend (leeroy-web), mis suunab pĂ€ringud teise rakendusse — backend (leeroy-app). Vaadakem, 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 katalooge, 8 faili

leeroy-app ja leeroy-web sisaldavad Go koodi ja lihtsaid Dockerfile'e selle koodi kohalikuks 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 tooma ei hakka — piisab teadas, et leeroy-web vastab pĂ€ringutele ja suunab need edasi leeroy-app. SeetĂ”ttu on failides Deployment.yaml ainult teenus olemas app (sisekasutuseks marsruudistamiseks). Pod'i porti web suuname kiireks juurdepÀÀsuks rakendusele.

Kuidas see vÀlja nÀeb 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 kirjas kĂ”ik etapid, mida varem mainiti. Lisaks sellele konfiguratsioonile on olemas ka fail globaalsete seadistustega — ~/.skaffold/config. Seda saab redigeerida kĂ€sitsi vĂ”i CLI kaudu — nĂ€iteks nii:

skaffold config set --global local-cluster true

See kĂ€sk seab globaalse muutuja local-cluster vÀÀrtuseks true, pĂ€rast mida Skaffold ei pĂŒĂŒa pilte kaugarhi push’ida. Kui arendate kohapeal, vĂ”ite selle kĂ€su kasutada, et salvestada pilte samuti kohapeal.

Naaseme skaffold.yaml:

  • Etapis build meie puhul mÀÀratleme, et pilt tuleb koguda ja salvestada kohapeal. PĂ€rast esmakordset ehituse 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

    Nagu nĂ€ha, on Skaffold ise pildid sildistanud. Üksikasjana on toetatud mitmeid sildistamisstrateegiaid.

  • JĂ€tkuks konfiguratsioonis on mÀÀratud context: ./leeroy-app/, st mÀÀratud kontekst, milles pilti ehitatakse.
  • Deployimise etapis mÀÀratakse, et kasutame kubectl'i ja sobivaid manifeste.
  • PortForward: sarnaselt sellele, kuidas tavaliselt suuname porte lĂ€bi kubectl port-forward, anname Skaffoldile juhised selle kĂ€su kĂ€ivitamiseks. Antud juhul suunatakse kohalik port 9000 8080-le mÀÀratud Deployment'is nimega leeroy-web.

On just Ă”ige aeg alustada skaffold dev: kĂ€sk loob pideva "tagasiside tsĂŒkli", st mitte ainult ei kogu kĂ”ike ja deplooi klastrisse, vaid ka teatab pod'ide hetkeseisust, jĂ€lgib muutusi ja uuendab pod'ide olekut.

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

Skaffoldi ĂŒlevaade Kubernetes'i arendamiseks

Esiteks, on nÀha, et kasutatakse vahemÀlu. Edasi - rakendus kogutakse, deplooinitakse, portide suunamine toimub. Kuna on mÀÀratud --port-forward, Skaffold suunas portaadi nagu palutud, kuid webta suunas oma ÀranÀgemise jÀrgi (valis lÀhima vaba). PÀrast seda saame esimesed logid rakendustelt. app Kontrollime töökindlust?

~\/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!!!

Muudame faili

leeroy-app\/app.go — möödub paar sekundit
 ja: ~\/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!!!

Skaffold kuvab konsoolis sama, mis enne, vĂ€lja arvatud ĂŒks asi: ta nĂ€itas ainult

, mitte kÔike korraga. leeroy-appRohkem praktikat

Tasub mainida, et uue projekti loomisel saab Skaffoldi config'e luua kÀsu abil

, mis on vĂ€ga mugav. Samuti vĂ”ib kirjutada mitu config'i: arendada vaikimisi config'i alusel ja seejĂ€rel luua staadiumis kĂ€suga — algne ettevalmistus enne juurutamist, siin vĂ”ib olla kĂ”ike: sĂ”ltuvuste allalaadimist, saladuste lahtipakkimist ja muud.(sama protsess, mis run , lihtsalt ei jĂ€lgi muutusi), kasutades teist config'i. devKatacoda's on

lihtsam nÀide. Seal on juba valmis liivakasti Kubernetes, rakendus ja Skaffold. SuurepÀrane variant, kui soovite iseseisvalt proovida pÔhiteadmisi. juhend on

Üks vĂ”imalik rakendus Skaffoldi kasutamiseks on arendamine kaugklastri peal. Mitte kĂ”igile ei meeldi kĂ€ivitada Minikube enda seadmetel, et seejĂ€rel rakendust vĂ€lja panna ja oodata selle korrektset toimimist... Sellisel juhul lahendab Skaffold suurepĂ€raselt seatud ĂŒlesande, mida vĂ”ivad kinnitada nĂ€iteks Redditi insenerid, millest me juba me meie blogist.

Ja selle vÀljaande Weaveworksilt vÔib leida nÀite tootmisprotsessi torujuhtme loomisest.

KokkuvÔte

Skaffold on mugav tööriist torujuhtmete koostamiseks, mis hĂ”lmavad rakenduste vĂ€ljalaskmist Kuberneteses ja keskenduvad peamiselt arenduse vajadustele. Sellega on ĂŒsna lihtne luua "lĂŒhi" torujuhe, mis arvestab arendaja pĂ”hinĂ”udmisi, kuid soovi korral saab korraldada ka suuremaid protsesse. Ühe nĂ€itlikuna Skaffoldi kasutamisest CI/CD protsessides toodud niisugust testprojekt 10 mikroteenusega, mis kasutavad Kubernetes, gRPC, Istio ja OpenCensus jĂ€lgimist.

Skaffold on juba saanud peaaegu 8000+ tĂ€hte GitHubis, seda arendab Google ja see kuulub GoogleContainerTools — ĂŒldiselt on hetkel kĂ”ik pĂ”hjused arvata, et projekt areneb kaua ja edukalt.

P.S.

Lugege ka meie blogist:

Allikas: habr.com

Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster