Tinjauan Skaffold pikeun pangwangunan Kubernetes

Tinjauan Skaffold pikeun pangwangunan Kubernetes

Sataun satengah ka tukang, dina 5 Maret 2018, Google ngarilis versi alfa munggaran tina proyék Open Source na pikeun CI / CD disebut. Skaffold, anu tujuanana nya éta nyieun "pangwangunan Kubernetes basajan tur bisa diulang" ku kituna pamekar bisa difokuskeun ngembangkeun tinimbang administrasi. Naon anu tiasa pikaresepeun ngeunaan Skaffold? Tétéla, éta ngagaduhan sababaraha trik anu tiasa ngajantenkeun alat anu kuat pikeun pamekar, sareng panginten insinyur operasi. Hayu urang kenal sareng proyék sareng kamampuanana.

NB: Ku jalan kitu, urang geus ngobrol sakeudeung ngeunaan Skaffold di umum urang review parabot pamekar, anu hirupna dihubungkeun sareng Kubernetes.

Téori. Tujuan jeung kamampuhan

Ku kituna, umumna disebutkeun, Skaffold solves masalah automating siklus CI / CD (dina tahap ngawangun, push, nyebarkeun), nawarkeun eupan balik ajakan pamekar, i.e. kamampuhan pikeun gancang nampa hasil parobahan kode saterusna - dina bentuk hiji aplikasi diropéa ngajalankeun dina klaster Kubernetes. Sarta eta tiasa dianggo dina sirkuit béda (dev, panggung, produksi ...), nu Skaffold mantuan pikeun ngajelaskeun pipelines pakait pikeun rollout.

Kode sumber Skaffold ditulis dina Go, disebarkeun ku handapeun Lisensi Apache gratis 2.0 (GitHub).

Hayu urang nempo fungsi utama jeung fitur. Kahiji kaasup handap:

  • Skaffold nawiskeun alat pikeun nyiptakeun pipa CI / CD.
  • Ngidinan anjeun ngawas parobahan dina kode sumber dina latar tukang sareng ngajalankeun prosés otomatis assembling kode kana gambar wadahna, nyebarkeun gambar ieu dina Docker Registry sareng nyebarkeunana kana klaster Kubernetes.
  • Nyingkronkeun file dina gudang sareng diréktori kerja dina wadahna.
  • Tes otomatis nganggo wadah-struktur-test.
  • palabuhan maju.
  • Maca log aplikasi anu dijalankeun dina wadah.
  • Mantuan dina debugging aplikasi ditulis dina Java, Node.js, Python, Go.

Ayeuna ngeunaan fitur:

  • Skaffold sorangan teu boga komponén cluster-sisi. Hartina, teu perlu ngonpigurasikeun deui Kubernetes pikeun ngagunakeun utilitas ieu.
  • pipelines béda pikeun aplikasi Anjeun. Naha anjeun kedah ngagulung kodeu ka Minikube lokal nalika anjeun ngembangkeun, teras ka panggung atanapi produksi? Pikeun tujuan ieu aya propil jeung konfigurasi pamaké, variabel lingkungan jeung bandéra, nu ngidinan Anjeun pikeun ngajelaskeun pipelines béda pikeun hiji aplikasi.
  • CLI. Ngan utilitas konsol sareng konfigurasi dina YAML. Dina Internét anjeun tiasa mendakan rujukan pikeun usaha nyiptakeun GUI ékspérimén, kumaha oge, dina momen ieu paling dipikaresep ngan hartina batur perlu anjeunna, tapi teu bener.
  • Modularitas. Skaffold sanes a harvester mandiri, tapi boga tujuan pikeun ngagunakeun modul individu atawa solusi aya pikeun tugas husus.

Ilustrasi anu terakhir:

  • Dina tahap assembly anjeun tiasa nganggo:
    • docker ngawangun lokal, dina klaster maké kaniko atanapi di Google Cloud Build;
    • Bazel lokal;
    • Jib Maven sareng Jib Gradle sacara lokal atanapi dina Google Cloud Build;
    • skrip ngawangun adat dijalankeun sacara lokal. Upami anjeun kedah ngajalankeun solusi ngawangun anu sanés (leuwih fleksibel / akrab / ...), éta dijelaskeun dina naskah supados Skaffold ngaluncurkeunana (conto tina dokuméntasi). Ieu ngidinan Anjeun pikeun make sagala collector nu bisa disebut maké naskah;
  • Dina tahap nguji, anu geus disebutkeun wadah-struktur-test;
  • Pikeun deployment disadiakeun di handap:
    • Kubectl;
    • Helm;
    • ngaropéa.

Hatur nuhun kana ieu, Skaffold bisa disebut unik kerangka pikeun ngawangun CI / CD. Ieu conto alur kerja nalika ngagunakeunana (tina dokuméntasi proyék):

Tinjauan Skaffold pikeun pangwangunan Kubernetes

Naon rupa karya Skaffold dina istilah umum?

  1. Utiliti ngawas parobahan dina diréktori kode sumber. Upami modifikasi dilakukeun kana file, aranjeunna disingkronkeun sareng pod aplikasi dina klaster Kubernetes. Mun mungkin, tanpa reassembling gambar. Upami teu kitu, gambar anyar dirakit.
  2. Gambar anu dirakit dipariksa nganggo wadah-struktur-test, ditandaan sareng dikirim ka Docker Registry.
  3. Saatos ieu, gambar éta disebarkeun - disebarkeun dina klaster Kubernetes.
  4. Lamun peluncuran ieu initialized ngagunakeun paréntah skaffold dev, teras urang mimitian nampi log tina aplikasi, sareng Skaffold ngantosan parobihan pikeun ngulang sadaya tindakan deui.

Tinjauan Skaffold pikeun pangwangunan Kubernetes
Ilustrasi tina tahapan utama operasi Skaffold

Prakték. Nyobian Skaffold

Pikeun demonstrate pamakéan Skaffold, Kuring baris nyandak conto tina Repository proyék GitHub. Ngomong-ngomong, Tuh Anjeun tiasa mendakan seueur conto sanés anu tumut kana sababaraha spésifik. Kuring bakal ngalakukeun sagala lampah lokal di Minikube. Pamasangan saderhana sareng peryogi sababaraha menit, sareng anjeun peryogi kubectl pikeun ngamimitian.

Pasang 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

Hayu urang clone gudang Skaffold sareng conto anu diperyogikeun:

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

Kuring milih conto dua pods, unggal ngandung hiji aplikasi Go leutik. Hiji aplikasi nyaeta frontend (leeroy-web), nu alihan pamundut ka aplikasi kadua - backend (leeroy-app). Hayu urang tingali kumaha éta:

~/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 sareng leeroy-web ngandung kode Go sareng Dockerfiles basajan pikeun ngawangun kode ieu sacara lokal:

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

Kuring moal masihan kodeu aplikasi - éta cukup pikeun terang éta leeroy-web narima requests na proxy aranjeunna ka leeroy-app. Ku kituna dina file Deployment.yaml aya Service ngan pikeun app (pikeun routing internal). palabuhan pod web kami bakal teruskeun ka diri urang pikeun aksés gancang kana aplikasi.

Sigana mah 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

Sadaya tahapan anu disebatkeun di luhur dijelaskeun di dieu. Salian config ieu, aya ogé file sareng setélan global - ~/.skaffold/config. Éta tiasa diédit sacara manual atanapi ngalangkungan CLI - contona, sapertos kieu:

skaffold config set --global local-cluster true

Paréntah ieu bakal nyetél variabel global local-cluster kana harti true, Saatos éta Skaffold moal nyobian nyorong gambar kana pendaptaran jauh. Upami anjeun ngembangkeun sacara lokal, anjeun tiasa nganggo paréntah ieu pikeun ngawangun gambar sacara lokal.

Mulang ka skaffold.yaml:

  • Dina panggung build kami nangtukeun yén anjeun kedah ngumpulkeun sareng nyimpen gambar sacara lokal. Saatos ngawangun jalan pertama kalina, urang bakal ningali ieu:
    // т.к. 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

    Sakumaha anjeun tiasa tingali, Skaffold tagged gambar sorangan. Ku jalan kitu, sababaraha kawijakan tagging dirojong.

  • Salajengna dina config dituduhkeun context: ./leeroy-app/, i.e. konteks nu gambar dikumpulkeun dieusian.
  • Dina tahap panyebaran, ditangtukeun yén urang bakal nganggo kubectl sareng masker pikeun manifes anu diperyogikeun.
  • PortForward: sarupa kumaha urang biasana maju port ngagunakeun kubectl port-forward, kami masihan parentah ka Skaffold pikeun nelepon paréntah ieu. Dina hal ieu, port lokal 9000 diteruskeun ka 8080 di Deployment kalayan nami leeroy-web.

Waktosna ngaluncurkeun skaffold dev: Tim bakal nyieun hiji lumangsung "eupan balik loop", i.e. teu ngan baris ngumpulkeun sagalana jeung nyebarkeun ka klaster, tapi ogé bakal ngabejaan Anjeun tentang kaayaan pods di momen, ngawas parobahan sarta ngamutahirkeun kaayaan pods.

Ieu hasil peluncuran skaffold dev --port-forward nalika reassembling:

Tinjauan Skaffold pikeun pangwangunan Kubernetes

Mimiti, anjeun tiasa ningali yén cache dianggo. Salajengna, aplikasi dirakit, disebarkeun, sareng palabuhan diteruskeun. Kusabab dieusian --port-forward, Skaffold diteruskeun port ka web, sakumaha anjeunna ditanya, tapi di dieu app anjeunna threw dina kawijaksanaan sorangan (milih nu pangcaketna bébas). Saatos ieu, kami nampi log munggaran tina aplikasi.

Hayu urang pariksa naha éta jalan?

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

Ngarobah file leeroy-app/app.go - sababaraha detik kaliwat... jeung:

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

Dina waktos anu sami, Skaffold nyalira nampilkeun hal anu sami dina konsol sapertos sateuacana, kecuali hiji titik: éta ngan ukur digulung. leeroy-app, sareng henteu sakaligus.

Langkung latihan

Éta ogé kedah disebatkeun yén nalika nyiptakeun proyék énggal, konfigurasi pikeun Skaffold tiasa di-bootstrap nganggo paréntah. init, nu pohara merenah. Salaku tambahan, anjeun tiasa nyerat sababaraha konfigurasi: ngalaksanakeun pamekaran dina konfigurasi standar, teras gulung ka panggung kalayan paréntah. run (prosés sarua jeung dev, ngan teu ngawas parobahan), ngagunakeun config béda.

Dina katacoda aya kapamimpinan Éta langkung gampang kalayan conto. Tapi nawiskeun sandbox siap-siap sareng Kubernetes, aplikasi sareng Skaffold. Pilihan anu saé upami anjeun resep nyobian dasar-dasarna nyalira.

Hiji kasus pamakéan mungkin pikeun Skaffold nyaéta pikeun ngalakonan pangwangunan dina klaster jauh. Teu sadaya jelema nyaman ngajalankeun Minikube on hardware sorangan, lajeng rolling kaluar aplikasi tur expecting eta fungsina adequately ... Dina hal ieu, Skaffold solves masalah sampurna, nu bisa dikonfirmasi, contona, ku insinyur Reddit, sakumaha urang gaduh. geus dibahas wrote dina blog urang.

Jeung dina ieu publikasi ti Weaveworks anjeun tiasa mendakan conto nyiptakeun pipa pikeun produksi.

kacindekan

Skaffold mangrupakeun alat merenah pikeun ngawangun pipelines nu ngalibatkeun rolling kaluar aplikasi pikeun Kubernetes sarta utamana fokus kana kaperluan ngembangkeun. Éta ngagampangkeun ngadamel pipa "pondok" anu tumut kana kabutuhan dasar pamekar, tapi upami hoyong, anjeun tiasa ngatur prosés anu langkung ageung. Salaku salah sahiji conto jelas ngagunakeun Skaffold dina CI / prosés CD dibikeun a saperti proyék tés ti 10 microservices ngagunakeun kamampuhan Kubernetes, gRPC, Istio na OpenCensus Tracing.

Skaffold parantos ngagaduhan ampir 8000+ béntang dina GitHub, dikembangkeun ku Google sareng mangrupikeun bagian tina GoogleContainerTools - Sacara umum, dina momen aya unggal alesan pikeun yakin yén proyék bakal ngamekarkeun happily kantos sanggeus.

PS

Baca ogé dina blog urang:

sumber: www.habr.com

Tambahkeun komentar