Skaffoldi ülevaade Kubernetese arendamiseks

Skaffoldi ülevaade Kubernetese arendamiseks

Poolteist aastat tagasi, 5. märtsil 2018, avaldas Google oma avatud lähtekoodiga projekti CI/CD esimese alfaversiooni nimega Skeffold, mille eesmärk oli luua "lihtne ja korratav Kubernetese arendus", et arendajad saaksid keskenduda pigem arendamisele kui administreerimisele. Mis võiks Skaffoldis huvitavat olla? Nagu selgub, on selle varrukas mõned nipid, mis võivad muuta selle arendajale ja võib-olla isegi operatsiooniinsenerile võimsaks tööriistaks. Tutvume projekti ja selle võimalustega.

NB: Muide, Skaffoldist oleme lühidalt juba oma üldsõnas rääkinud arendaja tööriistade ülevaade, kelle elud on seotud Kubernetesega.

teooria. Eesmärk ja võimalused

Seega üldiselt lahendab Skaffold CI/CD tsükli automatiseerimise probleemi (ehituse, tõuke, juurutamise etapis), pakkudes arendajale kiiret tagasisidet, s.t. võimalus kiiresti saada järgnevate koodimuudatuste tulemus - Kubernetese klastris töötava värskendatud rakenduse kujul. Ja see võib töötada erinevates ahelates (dev, etapp, tootmine ...), mille jaoks Skaffold aitab kirjeldada vastavaid torujuhtmeid kasutuselevõtuks.

Skaffoldi lähtekood on kirjutatud Go, jaotatud tasuta Apache License 2.0 (GitHub) alusel.

Vaatame peamisi funktsioone ja funktsioone. Esimesed hõlmavad järgmist:

  • Skaffold pakub tööriistu CI/CD torujuhtmete loomiseks.
  • Võimaldab teil jälgida taustal lähtekoodi muutusi ja käivitada automatiseeritud protsessi, mille käigus kood koondatakse konteineripiltideks, avaldatakse need kujutised Dockeri registris ja juurutatakse Kubernetese klastris.
  • Sünkroonib hoidlas olevad failid konteineris oleva töökataloogiga.
  • Testib automaatselt konteineri struktuuri testi abil.
  • Portid edasi.
  • Loeb konteineris töötava rakenduse logisid.
  • Aitab Java, Node.js, Python, Go keeles kirjutatud rakenduste silumisel.

Nüüd funktsioonidest:

  • Skaffoldil endal pole klastripoolseid komponente. See tähendab, et selle utiliidi kasutamiseks pole vaja Kubernetesit täiendavalt konfigureerida.
  • Erinevad torujuhtmed teie rakenduse jaoks. Kas peate koodi arendamise ajal kohalikus Minikube'is levitama ja seejärel lavale või tootmisele? Selleks on olemas profiilid ja kasutaja konfiguratsioonid, keskkonnamuutujad ja lipud, mis võimaldavad kirjeldada ühe rakenduse jaoks erinevaid konveierid.
  • CLI. Ainult konsooliutiliit ja konfiguratsioonid YAML-is. Internetist leiate viiteid loomise katsetele eksperimentaalne GUI, aga hetkel tähendab see suure tõenäosusega lihtsalt seda, et keegi vajab teda, aga mitte päriselt.
  • Modulaarsus. Skaffold ei ole iseseisev harvester, vaid püüab konkreetsete ülesannete jaoks kasutada üksikuid mooduleid või olemasolevaid lahendusi.

Viimase illustratsioon:

  • Kokkupaneku etapis saate kasutada:
    • dokkeri ehitamine lokaalselt, kanikot kasutades klastris või Google Cloud Buildis;
    • Bazel kohapeal;
    • Jib Maven ja Jib Gradle kohapeal või Google Cloud Buildis;
    • kohandatud ehitusskriptid töötavad kohapeal. Kui teil on vaja käitada mõnda muud (paindlikumat/tuttavamat/...) ehituslahendust, kirjeldatakse seda skriptis nii, et Skaffold käivitab selle (näide dokumentatsioonist). See võimaldab kasutada mis tahes kogujat, mida saab skripti abil välja kutsuda;
  • Katsetamise etapis juba mainitud konteineri ehituse katse;
  • Kasutuselevõtmiseks pakutakse järgmist:
    • Kubectl;
    • Helm;
    • kohandada.

Tänu sellele võib Skaffoldi nimetada ainulaadseks CI/CD ehitamise raamistik. Siin on töövoo näide selle kasutamisel (projekti dokumentatsioonist):

Skaffoldi ülevaade Kubernetese arendamiseks

Kuidas Skaffoldi töö üldiselt välja näeb?

  1. Utiliit jälgib muudatusi lähtekoodi kataloogis. Kui failidesse tehakse muudatusi, sünkroonitakse need Kubernetese klastris oleva rakenduspuldiga. Võimalusel ilma pilti uuesti kokku panemata. Vastasel juhul koostatakse uus pilt.
  2. Kokkupandud kujutist kontrollitakse konteineri struktuuri testiga, märgistatakse ja saadetakse Dockeri registrisse.
  3. Pärast seda pilt juurutatakse – juurutatakse Kubernetese klastris.
  4. Kui käivitamine käivitati käsuga skaffold dev, siis hakkame rakendusest logisid vastu võtma ja Skaffold ootab muudatusi, et kõiki toiminguid uuesti korrata.

Skaffoldi ülevaade Kubernetese arendamiseks
Skaffoldi töö põhietappide illustratsioon

Harjuta. Skaffoldi proovimine

Skaffoldi kasutamise demonstreerimiseks toon näite siit GitHubi projektihoidla. Muide seal Leiad palju muid näiteid, mis võtavad arvesse erinevaid eripärasid. Teen kõik toimingud kohapeal Minikubes. Installimine on lihtne ja võtab mõne minuti ning alustamiseks vajate kubectli.

Paigaldage 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

Kloonime Skaffoldi hoidla vajalike näidetega:

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

Valisin näite kahe kaunaga, millest igaüks sisaldab ühte väikest Go rakendust. Üks rakendus on frontend (leeroy-web), mis suunab päringu teisele rakendusele – taustaprogrammi (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 directories, 8 files

leeroy-app ja leeroy-web sisaldavad Go-koodi ja lihtsaid Docker-faile selle koodi kohalikuks loomiseks:

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

Ma ei anna rakenduse koodi – piisab sellest, kui tead leeroy-web võtab taotlusi vastu ja volitab neid leeroy-app. Seetõttu failides Deployment.yaml Teenus on ainult jaoks app (sisemiseks marsruutimiseks). Podi port web edastame selle endale kiireks rakendusele juurdepääsuks.

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 kirjeldatakse kõiki ülalnimetatud etappe. Lisaks sellele konfiguratsioonile on olemas ka fail globaalsete seadistustega - ~/.skaffold/config. Seda saab redigeerida käsitsi või CLI kaudu – näiteks järgmiselt:

skaffold config set --global local-cluster true

See käsk määrab globaalse muutuja local-cluster tähendusse true, mille järel Skaffold ei ürita pilte kaugregistrisse lükata. Kui arendate kohapeal, saate selle käsu abil pilte kohapeal luua.

Tagasi skaffold.yaml:

  • Laval build täpsustame, et peate pildi kohapeal koguma ja salvestama. Pärast ehituse esmakordset 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äete, märgistas Skaffold pildid ise. Muide, toetatakse mitut sildistamise poliitikat.

  • Edasi konfiguratsioonis on see näidatud context: ./leeroy-app/, st. täpsustatakse kontekst, kuhu pilt kogutakse.
  • Juurutamisetapis tehakse kindlaks, et kasutame vajalike manifestide jaoks kubectli ja maski.
  • PortForward: sarnane sellele, kuidas me tavaliselt porte edastame kubectl port-forward, anname Skaffoldile juhised selle käsu kutsumiseks. Sel juhul edastatakse kohalik port 9000 juurutamises nimega 8080-le leeroy-web.

On aeg käivitada skaffold dev: Meeskond loob pideva “tagasisideahela”, st. see mitte ainult ei kogu kõike ja juurutab selle klastrisse, vaid räägib teile ka kaunade hetkeseisust, jälgib muutusi ja värskendab kaunade olekut.

Siin on käivitamise tulemus skaffold dev --port-forward kokkupanemisel:

Skaffoldi ülevaade Kubernetese arendamiseks

Esiteks näete, et vahemälu kasutatakse. Järgmisena pannakse rakendus kokku, juurutatakse ja pordid edastatakse. Alates täpsustamisest --port-forward, Skaffold edastas pordi aadressile web, nagu talt küsiti, aga siin app ta viskas oma äranägemise järgi (valis lähima vaba). Pärast seda saame rakendustest esimesed logid.

Kontrollime, kas see töötab?

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

Faili muutmine leeroy-app/app.go - möödub mõni sekund... 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!!!

Samal ajal kuvas Skaffold ise konsoolis sama asja, mis varem, välja arvatud üks punkt: see ainult veeres välja leeroy-app, ja mitte kõike korraga.

Rohkem harjutamist

Samuti tasub mainida, et uue projekti loomisel saab Skafffoldi seadistusi käivitada käsuga init, mis on väga mugav. Lisaks saate kirjutada mitu konfiguratsiooni: viige läbi vaikekonfiguratsiooni arendus ja seejärel käivitage käsuga etapiks run (sama protsess nagu dev, lihtsalt ei jälgi muudatusi), kasutades teistsugust konfiguratsiooni.

Katakodal on olemas juhtpositsiooni Näite abil on veelgi lihtsam. Kuid see pakub valmis liivakasti Kubernetese, rakenduse ja Skaffoldiga. Suurepärane valik, kui olete huvitatud põhitõdedest ise järele proovida.

Skaffoldi üks võimalik kasutusjuht on arendustegevus kaugklastris. Kõigil pole mugav Minikube oma riistvara peal käivitada, seejärel rakendust välja lasta ja oodata, et see adekvaatselt toimiks... Sel juhul lahendab Skaffold probleemi suurepäraselt, mida võivad kinnitada näiteks Redditi insenerid, nagu meil on juba arutatud писали meie ajaveebis.

Ja see väljaanne Weaveworksist leiate näite tootmiseks torujuhtme loomisest.

Järeldus

Skaffold on mugav tööriist torujuhtmete ehitamiseks, mis hõlmavad rakenduste juurutamist Kubernetesisse ja on peamiselt keskendunud arendusvajadustele. Selle abil on üsna lihtne luua arendaja elementaarseid vajadusi arvestav “lühike” konveier, kuid soovi korral saab korraldada ka suuremaid protsesse. Ühe selge näitena Skaffoldi kasutamisest CI/CD protsessides antakse selline testprojekt 10 mikroteenust, mis kasutavad Kubernetese, gRPC, Istio ja OpenCensus Tracingu võimalusi.

Skaffoldil on GitHubis juba peaaegu 8000+ tärni, selle on välja töötanud Google ja see on osa GoogleContainerTools — üldiselt on hetkel alust arvata, et projekt areneb õnnelikult elu lõpuni.

PS

Loe ka meie blogist:

Allikas: www.habr.com

Lisa kommentaar