Katsaus Skaffoldista Kubernetes-kehitykseen

Katsaus Skaffoldista Kubernetes-kehitykseen

Puolitoista vuotta sitten, 5. maaliskuuta 2018, Google julkaisi ensimmäisen alfaversion avoimen lähdekoodin CI/CD-projektistaan ​​nimeltä Scaffold, jonka tavoitteena oli luoda "yksinkertainen ja toistettava Kubernetes-kehitys", jotta kehittäjät voisivat keskittyä kehittämiseen hallinnon sijaan. Mikä voisi olla kiinnostavaa Skaffoldissa? Kuten käy ilmi, sen hihassaan on muutamia temppuja, jotka voivat tehdä siitä tehokkaan työkalun kehittäjälle ja ehkä jopa käyttöinsinöörille. Tutustutaan projektiin ja sen ominaisuuksiin.

NB: Muuten, olemme jo puhuneet lyhyesti Skaffoldista yleisessämme kehittäjätyökalujen katsaus, jonka elämä liittyy Kubernetesiin.

Teoria. Tarkoitus ja kyvyt

Yleisesti ottaen Skaffold ratkaisee siis CI/CD-syklin automatisointiongelman (rakennus-, työntö-, käyttöönottovaiheissa) tarjoamalla kehittäjälle nopeaa palautetta, ts. mahdollisuus saada nopeasti myöhempien koodimuutosten tulos - Kubernetes-klusterissa käynnissä olevan päivitetyn sovelluksen muodossa. Ja se voi toimia eri piireissä (kehittäjä, vaihe, tuotanto...), joille Skaffold auttaa kuvaamaan vastaavat putkistot käyttöönottoa varten.

Skaffoldin lähdekoodi on kirjoitettu Go-kielellä, jakelija ilmaisella Apache License 2.0:lla (GitHub).

Katsotaanpa tärkeimpiä toimintoja ja ominaisuuksia. Ensimmäiset sisältävät seuraavat:

  • Skaffold tarjoaa työkaluja CI/CD-putkien luomiseen.
  • Voit seurata lähdekoodin muutoksia taustalla ja suorittaa automaattisen prosessin koota koodia säilökuviksi, julkaista nämä kuvat Docker-rekisterissä ja ottaa ne käyttöön Kubernetes-klusteriin.
  • Synkronoi arkiston tiedostot säilön työhakemiston kanssa.
  • Testaa automaattisesti käyttämällä konttirakennetestiä.
  • Eteenpäin portit.
  • Lukee säilössä käynnissä olevan sovelluksen lokit.
  • Auttaa Java-, Node.js-, Python-, Go-kielillä kirjoitettujen sovellusten virheenkorjauksessa.

Nyt ominaisuuksista:

  • Skaffoldissa itsessään ei ole klusterin puoleisia komponentteja. Eli Kubernetesia ei tarvitse määrittää enempää käyttämään tätä apuohjelmaa.
  • Erilaiset putket sovelluksellesi. Pitääkö sinun julkaista koodi paikalliseen Minikubeen kehitystyön aikana ja sitten lavalle tai tuotantoon? Tätä tarkoitusta varten on olemassa профили ja käyttäjäkonfiguraatiot, ympäristömuuttujat ja liput, joiden avulla voit kuvata eri putkistoja yhdelle sovellukselle.
  • CLI. Vain konsoliapuohjelma ja kokoonpanot YAML:ssa. Internetistä löytyy viittauksia luomisyrityksiin kokeellinen GUITällä hetkellä tämä tarkoittaa kuitenkin todennäköisesti vain sitä, että joku tarvitsee häntä, mutta ei todellakaan.
  • Modulaarisuus. Skaffold ei ole itsenäinen harvesteri, vaan se pyrkii käyttämään yksittäisiä moduuleja tai olemassa olevia ratkaisuja tiettyihin tehtäviin.

Kuva jälkimmäisestä:

  • Kokoonpanovaiheessa voit käyttää:
    • docker build paikallisesti, klusterissa kanikon avulla tai Google Cloud Buildissa;
    • Bazel paikallisesti;
    • Jib Maven ja Jib Gradle paikallisesti tai Google Cloud Buildissa;
    • mukautetut rakennuskomentosarjat suoritetaan paikallisesti. Jos sinun on suoritettava toinen (joustavampi/tuttavampi/...) koontiratkaisu, se on kuvattu skriptissä niin, että Skaffold käynnistää sen (esimerkki dokumentaatiosta). Tämän avulla voit käyttää mitä tahansa keräilijää, jota voidaan kutsua komentosarjan avulla;
  • Testausvaiheessa jo mainittu säiliön rakennetesti;
  • Käyttöönottoa varten tarjotaan seuraavat:
    • Kubectl;
    • Helm;
    • muokata.

Tämän ansiosta Skaffoldia voidaan kutsua ainutlaatuiseksi puitteet CI/CD:n rakentamiseen. Tässä on esimerkki työnkulusta sitä käytettäessä (projektin dokumentaatiosta):

Katsaus Skaffoldista Kubernetes-kehitykseen

Miltä Skaffoldin työ näyttää yleisesti ottaen?

  1. Apuohjelma tarkkailee muutoksia lähdekoodihakemistossa. Jos tiedostoihin tehdään muutoksia, ne synkronoidaan Kubernetes-klusterin sovelluskotelon kanssa. Jos mahdollista, kokoamatta kuvaa uudelleen. Muussa tapauksessa uusi kuva kootaan.
  2. Koottu kuva tarkistetaan konttirakennetestillä, merkitään tunnisteella ja lähetetään Docker-rekisteriin.
  3. Tämän jälkeen kuva otetaan käyttöön - otetaan käyttöön Kubernetes-klusterissa.
  4. Jos käynnistys aloitettiin komennolla skaffold dev, alamme vastaanottaa lokeja sovelluksesta, ja Skaffold odottaa muutoksia toistaakseen kaikki toiminnot uudelleen.

Katsaus Skaffoldista Kubernetes-kehitykseen
Kuva Skaffoldin toiminnan päävaiheista

Harjoitella. Skaffoldia kokeillaan

Havainnollistaakseni Skaffoldin käyttöä otan esimerkin kohteesta GitHub-projektin arkisto... Muuten, samassa paikassa Löydät monia muita esimerkkejä, jotka ottavat huomioon erilaisia ​​erityispiirteitä. Suoritan kaikki toiminnot paikallisesti Minikubessa. Asennus on yksinkertaista ja kestää muutaman minuutin, ja tarvitset kubectlin aloittaaksesi.

Asenna 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

Kloonataan Skaffoldin arkisto tarvittavilla esimerkeillä:

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

Valitsin esimerkin kahdesta kotelosta, joista jokainen sisältää yhden pienen Go-sovelluksen. Yksi sovellus on käyttöliittymä (leeroy-web), joka ohjaa pyynnön toiseen sovellukseen - taustajärjestelmään (leeroy-app). Katsotaanpa miltä se näyttää:

~/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 sisältävät Go-koodin ja yksinkertaiset Docker-tiedostot tämän koodin rakentamiseen paikallisesti:

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

En anna sovelluskoodia - riittää, kun tiedät sen leeroy-web hyväksyy pyynnöt ja välittää ne leeroy-app. Siksi tiedostoissa Deployment.yaml on palvelu vain app (sisäistä reititystä varten). Pod portti web välitämme sen itsellemme sovelluksen nopeaa käyttöä varten.

Näyttää siltä 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

Kaikki edellä mainitut vaiheet on kuvattu tässä. Tämän konfiguraation lisäksi on myös tiedosto yleisillä asetuksilla - ~/.skaffold/config. Sitä voidaan muokata manuaalisesti tai CLI:n kautta - esimerkiksi näin:

skaffold config set --global local-cluster true

Tämä komento asettaa globaalin muuttujan local-cluster merkitykseen true, jonka jälkeen Skaffold ei yritä työntää kuvia etärekisteriin. Jos kehität paikallisesti, voit käyttää tätä komentoa kuvien rakentamiseen paikallisesti.

Takaisin skaffold.yaml:

  • Lavalla build määritämme, että sinun on kerättävä ja tallennettava kuva paikallisesti. Kun rakennus on suoritettu ensimmäisen kerran, näemme seuraavan:
    // т.к. 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

    Kuten näet, Skaffold merkitsi kuvat itse. Muuten, useita merkintäkäytäntöjä tuetaan.

  • Edelleen konfiguraatiossa se näkyy context: ./leeroy-app/, eli konteksti, jossa kuva kerätään, on määritelty.
  • Käyttöönottovaiheessa päätetään, että käytämme kubectlia ja maskia tarvittaville manifesteille.
  • PortForward: samalla tavalla kuin tavallisesti välitämme portteja käyttäen kubectl port-forward, annamme Skaffoldille ohjeet kutsua tämä komento. Tässä tapauksessa paikallinen portti 9000 välitetään käyttöönoton yhteydessä 8080:lle nimellä leeroy-web.

On aika käynnistää skaffold dev: Tiimi luo jatkuvan "palautesilmukan", ts. se ei vain kerää kaikkea ja ottaa sen käyttöön klusteriin, vaan myös kertoo podien tilasta tällä hetkellä, seuraa muutoksia ja päivittää podien tilaa.

Tässä julkaisun tulos skaffold dev --port-forward uudelleen koottaessa:

Katsaus Skaffoldista Kubernetes-kehitykseen

Ensinnäkin voit nähdä, että välimuistia käytetään. Seuraavaksi sovellus kootaan, otetaan käyttöön ja portit välitetään. Määritellystä lähtien --port-forward, Skaffold välitti sataman osoitteeseen web, kuten häneltä kysyttiin, mutta täällä app hän heitti oman harkintansa mukaan (valitsi lähimmän vapaan). Tämän jälkeen saamme ensimmäiset lokit sovelluksista.

Katsotaan toimiiko?

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

Tiedoston muokkaaminen leeroy-app/app.go - muutama sekunti kuluu... 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!!!

Samaan aikaan Skaffold itse näytti konsolissa samaa kuin ennenkin, yhtä kohtaa lukuun ottamatta: se vain rullasi ulos leeroy-app, eikä kaikkea kerralla.

Enemmän harjoitusta

On myös syytä mainita, että uutta projektia luotaessa Skaffoldin konfiguraatiot voidaan käynnistää komennolla init, mikä on erittäin kätevää. Lisäksi voit kirjoittaa useita määrityksiä: suorita kehitys oletuskonfiguraatiolla ja vie sitten vaiheeseen komennolla run (sama prosessi kuin dev, ei vain seuraa muutoksia), käyttämällä eri kokoonpanoa.

Katakodissa on руководство Se on vielä helpompaa esimerkin avulla. Mutta se tarjoaa valmiin hiekkalaatikon, jossa on Kubernetes, sovellus ja Skaffold. Loistava vaihtoehto, jos olet kiinnostunut kokeilemaan aivan perusasioita itse.

Eräs mahdollinen Skaffoldin käyttötapa on kehittää kehitystä etäklusterissa. Kaikilla ei ole mukavaa ajaa Minikubea omilla laitteillaan, ottaa sitten sovellus käyttöön ja odottaa sen toimivan kunnolla... Tässä tapauksessa Skaffold ratkaisee ongelman täydellisesti, minkä voi vahvistaa esimerkiksi Reddit-insinöörit, kuten olemme tehneet. jo keskusteltu писали blogissamme.

Ja tämä julkaisu Weaveworksista löydät esimerkin putkilinjan luomisesta tuotantoa varten.

Johtopäätös

Skaffold on kätevä työkalu sellaisten putkien rakentamiseen, joihin liittyy sovellusten käyttöönotto Kubernetesille ja jotka keskittyvät ensisijaisesti kehitystarpeisiin. Sen avulla on melko helppoa luoda "lyhyt" putkisto, joka ottaa huomioon kehittäjän perustarpeet, mutta haluttaessa voit järjestää suurempia prosesseja. Yhtenä selkeistä esimerkeistä Skaffoldin käytöstä CI/CD-prosesseissa on annettu sellainen testiprojekti 10 mikropalvelua, jotka käyttävät Kubernetesin, gRPC:n, Istion ja OpenCensus Tracingin ominaisuuksia.

Skaffoldilla on jo lähes 8000+ tähteä GitHubissa, sen on kehittänyt Google ja se on osa GoogleContainerTools – Yleisesti ottaen tällä hetkellä on syytä uskoa, että hanke kehittyy onnellisesti loppuun asti.

PS.

Lue myös blogistamme:

Lähde: will.com

Lisää kommentti