Mapitio ya Skaffold kwa maendeleo ya Kubernetes

Mapitio ya Skaffold kwa maendeleo ya Kubernetes

Mwaka mmoja na nusu uliopita, Machi 5, 2018, Google ilitoa toleo la kwanza la alpha la mradi wake wa Open Source wa CI/CD unaoitwa. Skafu, ambao lengo lake lilikuwa kuunda "maendeleo rahisi na yanayoweza kurudiwa ya Kubernetes" ili watengenezaji waweze kuzingatia maendeleo badala ya utawala. Ni nini kinachoweza kufurahisha kuhusu Skaffold? Kama inavyogeuka, ina hila chache juu ya sleeve yake ambayo inaweza kuifanya chombo chenye nguvu kwa msanidi programu, na labda hata mhandisi wa shughuli. Hebu tufahamiane na mradi na uwezo wake.

NB: Kwa njia, tayari tumezungumza kwa ufupi kuhusu Skaffold kwa ujumla wetu ukaguzi wa zana za wasanidi programu, ambao maisha yao yameunganishwa na Kubernetes.

Nadharia. Kusudi na uwezo

Kwa hiyo, kwa ujumla, Skaffold hutatua tatizo la otomatiki mzunguko wa CI/CD (katika hatua za kujenga, kusukuma, kupeleka), kutoa maoni ya haraka ya msanidi programu, i.e. uwezo wa kupokea haraka matokeo ya mabadiliko ya msimbo yanayofuata - katika mfumo wa programu iliyosasishwa inayoendesha kwenye nguzo ya Kubernetes. Na inaweza kufanya kazi katika mizunguko tofauti (dev, hatua, uzalishaji ...), ambayo Skaffold husaidia kuelezea mabomba yanayolingana ya kusambaza.

Msimbo wa chanzo wa Skaffold umeandikwa katika Go, kusambazwa na chini ya Leseni ya bure ya Apache 2.0 (GitHub).

Hebu tuangalie kazi kuu na vipengele. Ya kwanza ni pamoja na yafuatayo:

  • Skaffold inatoa zana za kuunda mabomba ya CI/CD.
  • Inakuruhusu kufuatilia mabadiliko katika msimbo wa chanzo chinichini na kuendesha mchakato otomatiki wa kuunganisha msimbo katika picha za kontena, kuchapisha picha hizi kwenye Usajili wa Doka na kuzipeleka kwenye nguzo ya Kubernetes.
  • Husawazisha faili kwenye hazina na saraka ya kufanya kazi kwenye kontena.
  • Hujaribu kiotomatiki kwa kutumia chombo-muundo-jaribio.
  • Bandari za mbele.
  • Husoma kumbukumbu za programu inayoendeshwa kwenye kontena.
  • Husaidia katika utatuzi wa programu zilizoandikwa katika Java, Node.js, Python, Go.

Sasa kuhusu vipengele:

  • Skaffold yenyewe haina vijenzi vya upande wa nguzo. Hiyo ni, hakuna haja ya kusanidi zaidi Kubernetes kutumia matumizi haya.
  • Mabomba tofauti ya maombi yako. Je, unahitaji kusambaza msimbo kwa Minikube ya ndani wakati unatengeneza, na kisha kwa jukwaa au uzalishaji? Kwa kusudi hili kuna profaili na usanidi wa mtumiaji, vigezo vya mazingira na bendera, ambayo inakuwezesha kuelezea mabomba tofauti kwa programu moja.
  • CLI. Huduma na usanidi wa kiweko katika YAML pekee. Kwenye mtandao unaweza kupata marejeleo ya majaribio ya kuunda GUI ya majaribio, hata hivyo, kwa wakati huu uwezekano mkubwa unamaanisha tu kwamba mtu anamhitaji, lakini si kweli.
  • Utaratibu. Skaffold sio kivunaji cha kujitegemea, lakini hujitahidi kutumia moduli za kibinafsi au suluhisho zilizopo kwa kazi maalum.

Mchoro wa mwisho:

  • Katika hatua ya mkusanyiko unaweza kutumia:
    • docker kujenga ndani ya nchi, katika nguzo kwa kutumia kaniko au katika Google Cloud Build;
    • Bazel ndani ya nchi;
    • Jib Maven na Jib Gradle ndani ya nchi au katika Google Cloud Build;
    • hati za ujenzi maalum huendeshwa ndani ya nchi. Ikiwa unahitaji kuendesha suluhisho lingine (inayonyumbulika zaidi/inayojulikana/...) la kujenga, imeelezewa kwenye hati ili Skaffold aizindue (mfano kutoka kwa nyaraka) Hii inakuwezesha kutumia mtoza yeyote anayeweza kuitwa kwa kutumia hati;
  • Katika hatua ya majaribio, tayari kutajwa mtihani wa muundo wa chombo;
  • Kwa kusambaza zifuatazo hutolewa:
    • Kubectl;
    • Helm;
    • Customize.

Shukrani kwa hili, Skaffold inaweza kuitwa ya kipekee mfumo wa kujenga CI/CD. Hapa kuna mfano wa mtiririko wa kazi wakati wa kuitumia (kutoka kwa nyaraka za mradi):

Mapitio ya Skaffold kwa maendeleo ya Kubernetes

Je, kazi ya Skaffold inaonekanaje kwa ujumla?

  1. Wachunguzi wa matumizi hubadilika katika saraka ya msimbo wa chanzo. Marekebisho yakifanywa kwa faili, yanalandanishwa na ganda la programu katika kundi la Kubernetes. Ikiwezekana, bila kuunganisha tena picha. Vinginevyo, picha mpya imekusanywa.
  2. Picha iliyokusanywa inakaguliwa kwa kutumia chombo-muundo-jaribio, iliyowekwa alama na kutumwa kwa Usajili wa Doka.
  3. Baada ya hayo, picha inatumwa - imetumwa kwenye nguzo ya Kubernetes.
  4. Ikiwa uzinduzi ulianzishwa kwa kutumia amri skaffold dev, kisha tunaanza kupokea kumbukumbu kutoka kwa programu, na Skaffold inasubiri mabadiliko ili kurudia vitendo vyote tena.

Mapitio ya Skaffold kwa maendeleo ya Kubernetes
Mchoro wa hatua kuu za operesheni ya Skaffold

Fanya mazoezi. Kujaribu Skaffold

Ili kuonyesha matumizi ya Skaffold, nitachukua mfano kutoka Hifadhi ya mradi wa GitHub. Japo kuwa, hapo Unaweza kupata mifano mingine mingi ambayo inazingatia maalum tofauti. Nitafanya vitendo vyote ndani ya Minikube. Usakinishaji ni rahisi na huchukua dakika chache, na utahitaji kubectl ili kuanza.

Sakinisha 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

Wacha tulinganishe hazina ya Skaffold na mifano inayofaa:

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

Nilichagua mfano na maganda mawili, kila moja ikiwa na programu ndogo ya Go. Programu moja ni sehemu ya mbele (leeroy-web), ambayo inaelekeza ombi kwa programu ya pili - mazingira ya nyuma (leeroy-app). Wacha tuone jinsi inavyoonekana:

~/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 na leeroy-web zina Go code na Dockerfiles rahisi za kuunda msimbo huu ndani ya nchi:

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

Sitatoa nambari ya maombi - inatosha kujua hilo leeroy-web inakubali maombi na kuwapa washirika leeroy-app. Kwa hivyo kwenye faili Deployment.yaml kuna Huduma kwa ajili tu app (kwa uelekezaji wa ndani). Mlango wa ganda web tutaituma kwetu kwa ufikiaji wa haraka wa programu.

Inaonekana 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

Hatua zote zilizotajwa hapo juu zimeelezewa hapa. Kwa kuongezea usanidi huu, pia kuna faili iliyo na mipangilio ya ulimwengu - ~/.skaffold/config. Inaweza kuhaririwa kwa mikono au kupitia CLI - kwa mfano, kama hii:

skaffold config set --global local-cluster true

Amri hii itaweka utofauti wa kimataifa local-cluster kwenye maana true, baada ya hapo Skaffold haitajaribu kushinikiza picha kwenye Usajili wa mbali. Ikiwa unakuza ndani ya nchi, unaweza kutumia amri hii kuunda picha ndani ya nchi.

Rudi kwa skaffold.yaml:

  • Kwenye jukwaa build tunabainisha kuwa unahitaji kukusanya na kuhifadhi picha ndani ya nchi. Baada ya ujenzi kuanza kwa mara ya kwanza, tutaona yafuatayo:
    // т.к. 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

    Kama unavyoona, Skaffold aliweka tagi picha mwenyewe. Kwa njia, sera kadhaa za kuweka alama zinaungwa mkono.

  • Zaidi katika usanidi imeonyeshwa context: ./leeroy-app/, i.e. muktadha ambamo picha inakusanywa imebainishwa.
  • Katika hatua ya kupeleka, imedhamiriwa kuwa tutatumia kubectl na barakoa kwa maonyesho muhimu.
  • PortForward: sawa na jinsi sisi kawaida kusambaza bandari kutumia kubectl port-forward, tunatoa maagizo kwa Skaffold kupiga amri hii. Katika kesi hii, bandari ya ndani 9000 inatumwa kwa 8080 katika Usambazaji na jina. leeroy-web.

Ni wakati wa kuzindua skaffold dev: Timu itaunda "kitanzi cha maoni" kinachoendelea, i.e. sio tu itakusanya kila kitu na kupeleka kwenye nguzo, lakini pia itakuambia kuhusu hali ya maganda kwa sasa, kufuatilia mabadiliko na kusasisha hali ya maganda.

Haya hapa matokeo ya uzinduzi skaffold dev --port-forward wakati wa kukusanyika tena:

Mapitio ya Skaffold kwa maendeleo ya Kubernetes

Kwanza, unaweza kuona kwamba cache inatumiwa. Ifuatayo, programu inakusanywa, kutumwa, na bandari hutumwa. Tangu kubainishwa --port-forward, Skaffold ilisambaza bandari kwa web, kama alivyoulizwa, lakini hapa app alitupa kwa hiari yake mwenyewe (alichagua aliye karibu na bure). Baada ya hayo, tunapokea magogo ya kwanza kutoka kwa programu.

Wacha tuangalie ikiwa inafanya kazi?

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

Kubadilisha faili leeroy-app/app.go - sekunde chache hupita ... na:

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

Wakati huo huo, Skaffold yenyewe ilionyesha kitu kile kile kwenye koni kama hapo awali, isipokuwa nukta moja: ilitoka tu. leeroy-app, na sio wote mara moja.

Mazoezi zaidi

Inafaa pia kutaja kuwa wakati wa kuunda mradi mpya, usanidi wa Skaffold unaweza kufungwa kwa kutumia amri. init, ambayo ni rahisi sana. Kwa kuongezea, unaweza kuandika usanidi kadhaa: fanya usanidi kwenye usanidi chaguo-msingi, na kisha ueneze kwa hatua na amri. run (mchakato sawa na dev, haifuatilii mabadiliko), kwa kutumia usanidi tofauti.

Kwenye katacoda kuna mwongozo Ni rahisi zaidi kwa mfano. Lakini inatoa sandbox iliyotengenezwa tayari na Kubernetes, programu na Skaffold. Chaguo nzuri ikiwa una nia ya kujaribu mambo ya msingi mwenyewe.

Kesi moja inayowezekana ya utumiaji kwa Skaffold ni kufanya usanidi kwenye nguzo ya mbali. Sio kila mtu yuko vizuri kuendesha Minikube kwenye maunzi yake mwenyewe, kisha kusambaza programu na kutarajia ifanye kazi vya kutosha... Katika kesi hii, Skaffold hutatua tatizo kikamilifu, ambayo inaweza kuthibitishwa, kwa mfano, na wahandisi wa Reddit, kama tunavyo. tayari kujadiliwa писали katika blogu yetu.

Na ndani uchapishaji huu kutoka kwa Weaveworks unaweza kupata mfano wa kuunda bomba la uzalishaji.

Hitimisho

Skaffold ni zana rahisi ya kujenga mabomba ambayo inahusisha kusambaza maombi kwa Kubernetes na yanalenga hasa mahitaji ya maendeleo. Inafanya iwe rahisi sana kuunda bomba "fupi" ambalo linazingatia mahitaji ya msingi ya msanidi programu, lakini ikiwa inataka, unaweza kupanga michakato mikubwa. Kama moja ya mifano wazi ya kutumia Skaffold katika michakato ya CI/CD imepewa kama mradi wa mtihani ya huduma ndogo 10 zinazotumia uwezo wa Kubernetes, gRPC, Istio na Ufuatiliaji wa OpenCensus.

Skaffold tayari ina takriban nyota 8000+ kwenye GitHub, imetengenezwa na Google na ni sehemu ya GoogleContainerTools - kwa ujumla, kwa sasa kuna kila sababu ya kuamini kuwa mradi utaendelea kwa furaha milele.

PS

Soma pia kwenye blogi yetu:

Chanzo: mapenzi.com

Kuongeza maoni