Skaffold-en berrikuspena Kubernetes garapenerako

Skaffold-en berrikuspena Kubernetes garapenerako

Duela urte eta erdi, 5ko martxoaren 2018ean, Google-k CI/CDrako Open Source proiektuaren lehen bertsio alfa kaleratu zuen. Skaffold, zeinaren helburua "Kubernetes garapen sinple eta errepikagarria" sortzea zen, garatzaileek garapenean zentratu ahal izateko administrazioan baino. Zer izan daiteke interesgarria Skaffold-i buruz? Bihurtzen denez, trikimailu batzuk ditu mahukan, garatzailearentzat eta, agian, eragiketen ingeniariarentzat tresna indartsu bihur daitezkeenak. Ezagutu ditzagun proiektua eta bere gaitasunak.

NB: Bide batez, Skaffoldi buruz laburki hitz egin dugu gure orokorrean garatzaileen tresnen berrikuspena, zeinen bizitzak Kubernetesekin lotuta dauden.

Teoria. Helburua eta gaitasunak

Beraz, orokorrean, Skaffold-ek CI/CD zikloa automatizatzeko arazoa konpontzen du (eraiki, bultza eta inplementatzeko faseetan), garatzaileari berehalako iritzia eskainiz, hau da. ondorengo kode aldaketen emaitza azkar jasotzeko gaitasuna - Kubernetes klusterrean exekutatzen den aplikazio eguneratu baten moduan. Eta hainbat zirkuitutan lan egin dezake (garapena, etapa, ekoizpena...), eta horretarako Skaffold-ek zabaltzeko dagozkion kanalizazioak deskribatzen laguntzen du.

Skaffold-en iturburu kodea Go-n idatzita dago, arabera banatuta Doako Apache License 2.0 (GitHub) lizentziapean.

Ikus ditzagun funtzio eta ezaugarri nagusiak. Lehenengoak honako hauek dira:

  • Skaffoldek CI/CD kanalizazioak sortzeko tresnak eskaintzen ditu.
  • Iturburu-kodearen aldaketak atzeko planoan kontrolatzeko eta edukiontzien irudietan kodea biltzeko prozesu automatizatu bat exekutatzeko aukera ematen du, irudi horiek Docker Erregistroan argitaratuz eta Kubernetes klusterean zabalduz.
  • Biltegiko fitxategiak edukiontziko lan-direktorioarekin sinkronizatzen ditu.
  • Automatikoki probak egiten ditu edukiontzi-egitura-testa erabiliz.
  • Aurrerako portuak.
  • Edukiontzi batean exekutatzen ari den aplikazio baten erregistroak irakurtzen ditu.
  • Java, Node.js, Python, Go-n idatzitako aplikazioak arazketan laguntzen du.

Orain ezaugarriei buruz:

  • Skaffold-ek berak ez du kluster-alboko osagairik. Hau da, ez dago Kubernetes gehiago konfiguratu beharrik utilitate hau erabiltzeko.
  • Zure aplikaziorako kanalizazio desberdinak. Kodea tokiko Minikube-ra zabaldu behar al duzu garatzen ari zaren bitartean, eta gero eszenaratzea edo ekoizpena? Horretarako daude profilak eta erabiltzaileen konfigurazioak, ingurune-aldagaiak eta banderak, aplikazio bakarrerako kanalizazio desberdinak deskribatzeko aukera ematen dutenak.
  • CLI. YAML-n kontsolaren erabilgarritasuna eta konfigurazioak soilik. Interneten aurki ditzakezu sortzeko saiakeren erreferentziak GUI esperimentala, hala ere, une honetan ziurrenik norbaitek behar duela esan nahi du, baina ez benetan.
  • Modularitatea. Skaffold ez da uzta biltzaile autonomoa, baina zeregin zehatzetarako modulu indibidualak edo lehendik dauden soluzioak erabiltzen ahalegintzen da.

Azken honen ilustrazioa:

  • Muntaketa fasean erabil dezakezu:
    • docker eraikitzea lokalean, kaniko erabiliz edo Google Cloud Build-en kluster batean;
    • Bazel lokalean;
    • Jib Maven eta Jib Gradle lokalean edo Google Cloud Build-en;
    • eraikitzeko script pertsonalizatuak lokalean exekutatzen dira. Beste eraikuntza-soluzio bat (malguagoa/ezagunagoa/...) exekutatu behar baduzu, scriptean deskribatzen da Skaffold-ek abiarazteko (dokumentaziotik ateratako adibidea). Horri esker, script bat erabiliz deitu daitekeen edozein biltzaile erabil dezakezu;
  • Proba fasean, lehen aipatutakoa edukiontzi-egitura-proba;
  • Hedatzeko honako hauek eskaintzen dira:
    • Kubectl;
    • Helmuga;
    • pertsonalizatu.

Horri esker, Skaffold bakarra dei daiteke CI/CD eraikitzeko esparrua. Hona hemen erabiltzean lan-fluxuaren adibide bat (proiektuaren dokumentaziotik):

Skaffold-en berrikuspena Kubernetes garapenerako

Nolakoa da Skaffold-en lana termino orokorrean?

  1. Utilitateak iturburu-kodeen direktorioaren aldaketak kontrolatzen ditu. Fitxategietan aldaketak egiten badira, Kubernetes klusterreko aplikazio-podarekin sinkronizatuko dira. Ahal bada, irudia berriro muntatu gabe. Bestela, irudi berri bat muntatzen da.
  2. Muntatutako irudia edukiontzi-egitura-testa erabiliz egiaztatzen da, etiketatu eta Docker Erregistrora bidaltzen da.
  3. Horren ondoren, irudia zabaltzen da - Kubernetes klusterrean zabalduta.
  4. Abiarazi komandoa erabiliz hasieratu bazen skaffold dev, orduan aplikaziotik erregistroak jasotzen hasiko gara, eta Skaffold-ek aldaketak zaintzen ditu ekintza guztiak berriro errepikatzeko.

Skaffold-en berrikuspena Kubernetes garapenerako
Skaffold funtzionamenduaren fase nagusien ilustrazioa

Praktikatu. Skaffold probatzen

Skaffold-en erabilera erakusteko, adibide bat hartuko dut GitHub proiektuaren biltegia... Bide batez, han Hainbat zehaztasun kontuan hartzen dituzten beste adibide asko aurki ditzakezu. Ekintza guztiak lokalean egingo ditut Minikuben. Instalazioa erraza da eta minutu batzuk behar ditu, eta kubectl beharko duzu hasteko.

Instalatu 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

Klon dezagun Skaffold-en biltegia beharrezko adibideekin:

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

Adibide bat aukeratu nuen bi lekekin, bakoitzak Go aplikazio txiki bat duena. Aplikazio bat frontend-a da (leeroy-web), eskaera bigarren aplikaziora birbideratzen duena - backend-era (leeroy-app). Ikus dezagun nolakoa den:

~/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 eta leeroy-web-ek Go kodea eta Dockerfile sinpleak dituzte kode hau lokalean eraikitzeko:

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

Ez dut aplikazioaren kodea emango; nahikoa da hori jakitea leeroy-web eskaerak onartzen ditu eta haiei proxy ematen die leeroy-app. Beraz, fitxategietan Deployment.yaml Zerbitzu bat dago soilik app (barne bideratzeko). Pod ataka web geure buruari bidaliko diogu aplikaziora azkar sartzeko.

Itxura 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

Goian aipatutako fase guztiak deskribatzen dira hemen. Konfigurazio honetaz gain, ezarpen orokorrak dituen fitxategi bat ere badago - ~/.skaffold/config. Eskuz edo CLI bidez edita daiteke, adibidez, honela:

skaffold config set --global local-cluster true

Komando honek aldagai globala ezarriko du local-cluster esanahian sartu true, eta ondoren Skaffold ez da saiatuko irudiak urruneko erregistrora bultzatzen. Lokalean garatzen ari bazara, komando hau erabil dezakezu irudiak lokalean eraikitzeko.

Itzuli skaffold.yaml:

  • Oholtza gainean build irudia lokalean bildu eta gorde behar duzula zehazten dugu. Eraikuntza lehen aldiz exekutatu ondoren, honako hau ikusiko dugu:
    // т.к. 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

    Ikus dezakezunez, Skaffoldek berak markatu zituen irudiak. Bide batez, hainbat etiketa-politika onartzen dira.

  • Aurrerago konfigurazioan adierazten da context: ./leeroy-app/, hau da. irudia biltzen den testuingurua zehazten da.
  • Inplementazio fasean, kubectl eta maskara bat erabiliko ditugula zehazten da beharrezko manifestetarako.
  • PortForward: erabili ohi ditugun portuak birbidaltzen ditugunaren antzekoa kubectl port-forward, agindu hau deitzeko aginduak ematen dizkiogu Skaffold-i. Kasu honetan, tokiko ataka 9000 8080ra birbidaltzen da Deployment-en izenarekin leeroy-web.

Abian jartzeko ordua da skaffold dev: Taldeak etengabeko "feedback loop" bat sortuko du, hau da. dena bildu eta klusterera zabalduko ez ezik, unean uneko poden egoeraren berri emango dizu, aldaketak kontrolatu eta poden egoera eguneratuko du.

Hona hemen abiaraztearen emaitza skaffold dev --port-forward berriro muntatzean:

Skaffold-en berrikuspena Kubernetes garapenerako

Lehenik eta behin, cachea erabiltzen ari dela ikus dezakezu. Ondoren, aplikazioa muntatu, zabaldu eta portuak birbidaltzen dira. Zehaztu zenetik --port-forward, Skaffold-ek portua helarazi zion web, galdetu zioten bezala, baina hemen app bere erabakiz bota zuen (hurbilen dagoen librea aukeratu). Honen ostean, aplikazioetatik lehenengo erregistroak jasotzen ditugu.

Egiazta dezagun funtzionatzen duen?

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

Fitxategia aldatzea leeroy-app/app.go - segundo batzuk pasatzen dira... eta:

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

Aldi berean, Skaffoldek berak lehengo gauza bera erakusten zuen kontsolan, puntu bat izan ezik: bakarrik zabaldu zen. leeroy-app, eta ez guztiak batera.

Praktika gehiago

Aipatzekoa da, halaber, proiektu berri bat sortzerakoan, Skaffold-en konfigurazioak abiarazi daitezkeela komandoa erabiliz. init, oso erosoa dena. Horrez gain, hainbat konfigurazio idatz ditzakezu: egin ezazu garapena konfigurazio lehenetsian eta, gero, agerrarazi komandoarekin. run (prozesu bera dev, ez ditu aldaketak kontrolatzen), beste konfigurazio bat erabiliz.

Katacoda-n dago lidergoa Adibide batekin are errazagoa da. Baina prest egindako sandbox bat eskaintzen du Kubernetes, aplikazio bat eta Skaffold-ekin. Aukera paregabea oinarriak zuk zeuk probatzeko interesa baduzu.

Skaffold-en erabilera kasu posible bat urruneko kluster batean garapena egitea da. Denak ez daude eroso Minikube bere hardwarean exekutatzen, gero aplikazioa zabaldu eta behar bezala funtzionatuko duela espero... Kasu honetan, Skaffold-ek ezin hobeto konpontzen du arazoa, eta hori baiezta dezakete, adibidez, Reddit ingeniariek, guk egin dugunez. dagoeneko eztabaidatua писали gure blogean.

Eta argitalpen hau Weaveworks-en produkziorako kanalizazio bat sortzeko adibide bat aurki dezakezu.

Ondorioa

Skaffold tresna erosoa da Kubernetes-era aplikazioak zabaltzea dakarten kanalizazioak eraikitzeko eta garapen-beharretara bideratzen direnak nagusiki. Garatzailearen oinarrizko beharrak kontuan hartzen dituen kanalizazio "laburra" sortzea nahiko erraza da, baina nahi izanez gero, prozesu handiagoak antola ditzakezu. Skaffold CI/CD prozesuetan erabiltzearen adibide argietako bat bezala ematen da besteak beste, proba-proiektua 10 mikrozerbitzuetatik Kubernetes, gRPC, Istio eta OpenCensus Tracing-en gaitasunak erabiliz.

Skaffold-ek dagoeneko ia 8000 izar baino gehiago ditu GitHub-en, Google-k garatu du eta honen parte da. GoogleContainerTools — orokorrean, momentuz, proiektua zoriontsu garatuko dela uste izateko arrazoiak daude.

PS

Irakurri ere gure blogean:

Iturria: www.habr.com

Gehitu iruzkin berria