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;
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):
Miltä Skaffoldin työ näyttää yleisesti ottaen?
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.
Koottu kuva tarkistetaan konttirakennetestillä, merkitään tunnisteella ja lähetetään Docker-rekisteriin.
Tämän jälkeen kuva otetaan käyttöön - otetaan käyttöön Kubernetes-klusterissa.
Jos käynnistys aloitettiin komennolla skaffold dev, alamme vastaanottaa lokeja sovelluksesta, ja Skaffold odottaa muutoksia toistaakseen kaikki toiminnot uudelleen.
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.
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ää:
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.
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:
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.