Pagsusuri ng Skaffold para sa pagbuo ng Kubernetes

Pagsusuri ng Skaffold para sa pagbuo ng Kubernetes

Isang taon at kalahati ang nakalipas, noong Marso 5, 2018, inilabas ng Google ang unang alpha na bersyon ng Open Source na proyekto nito para sa CI/CD na tinatawag na Skaffold, na ang layunin ay lumikha ng "simple at paulit-ulit na pag-unlad ng Kubernetes" upang ang mga developer ay makapag-focus sa pag-unlad sa halip na pangangasiwa. Ano ang maaaring maging kawili-wili tungkol sa Skaffold? Sa lumalabas, mayroon itong ilang mga trick na maaaring gawin itong isang mahusay na tool para sa developer, at marahil kahit na ang operations engineer. Kilalanin natin ang proyekto at ang mga kakayahan nito.

NB: Siyanga pala, napag-usapan na natin nang maikli ang tungkol sa Skaffold sa ating heneral pagsusuri ng mga tool ng developer, na ang buhay ay konektado sa Kubernetes.

Teorya. Layunin at kakayahan

Kaya, sa pangkalahatan, nilulutas ng Skaffold ang problema sa pag-automate ng CI/CD cycle (sa mga yugto ng build, push, deploy), nag-aalok ng prompt ng feedback sa developer, i.e. ang kakayahang mabilis na makatanggap ng resulta ng mga kasunod na pagbabago ng code - sa anyo ng isang na-update na application na tumatakbo sa kumpol ng Kubernetes. At maaari itong gumana sa iba't ibang mga circuit (dev, stage, production...), kung saan nakakatulong ang Skaffold na ilarawan ang mga kaukulang pipeline para sa rollout.

Ang source code ng Skaffold ay nakasulat sa Go, ipinamahagi ni sa ilalim ng libreng Apache License 2.0 (GitHub).

Tingnan natin ang mga pangunahing pag-andar at tampok. Ang una ay kinabibilangan ng mga sumusunod:

  • Nag-aalok ang Skaffold ng mga tool para sa paggawa ng mga pipeline ng CI/CD.
  • Binibigyang-daan kang subaybayan ang mga pagbabago sa source code sa background at magpatakbo ng isang automated na proseso ng pag-assemble ng code sa mga container na imahe, pag-publish ng mga larawang ito sa Docker Registry at pag-deploy ng mga ito sa Kubernetes cluster.
  • Sini-synchronize ang mga file sa repository sa gumaganang direktoryo sa container.
  • Awtomatikong sumusubok gamit ang container-structure-test.
  • Mga forward port.
  • Binabasa ang mga log ng isang application na tumatakbo sa isang lalagyan.
  • Tumutulong sa pag-debug ng mga application na nakasulat sa Java, Node.js, Python, Go.

Ngayon tungkol sa mga tampok:

  • Ang Skaffold mismo ay walang mga bahagi ng cluster-side. Ibig sabihin, hindi na kailangan pang i-configure ang Kubernetes para magamit ang utility na ito.
  • Iba't ibang pipeline para sa iyong aplikasyon. Kailangan mo bang i-roll out ang code sa lokal na Minikube habang nagde-develop ka, at pagkatapos ay sa stage o production? Para sa layuning ito mayroong profile at mga configuration ng user, environment variable at flag, na nagbibigay-daan sa iyong ilarawan ang iba't ibang pipeline para sa isang application.
  • CLI. Tanging console utility at mga configuration sa YAML. Sa Internet maaari kang makahanap ng mga sanggunian sa mga pagtatangka na lumikha pang-eksperimentong GUI, gayunpaman, sa sandaling ito ay malamang na nangangahulugan lamang na may nangangailangan sa kanya, ngunit hindi talaga.
  • Modularity. Ang Skaffold ay hindi isang standalone harvester, ngunit nagsusumikap na gumamit ng mga indibidwal na module o umiiral na mga solusyon para sa mga partikular na gawain.

Ilustrasyon ng huli:

  • Sa yugto ng pagpupulong maaari mong gamitin ang:
    • lokal na build ng docker, sa isang cluster gamit ang kaniko o sa Google Cloud Build;
    • Bazel sa lokal;
    • Jib Maven at Jib Gradle nang lokal o sa Google Cloud Build;
    • lokal na tumatakbo ang mga custom na build script. Kung kailangan mong magpatakbo ng isa pang (mas nababaluktot/pamilyar/...) build solution, inilalarawan ito sa script upang mailunsad ito ng Skaffold (halimbawa mula sa dokumentasyon). Ito ay nagpapahintulot sa iyo na gumamit ng anumang kolektor na maaaring tawagan gamit ang isang script;
  • Sa yugto ng pagsubok, ang nabanggit na container-structure-test;
  • Para sa deployment ang mga sumusunod ay ibinigay:
    • Kubectl;
    • Helm;
    • ipasadya.

Dahil dito, ang Skaffold ay matatawag na kakaiba balangkas para sa pagbuo ng CI/CD. Narito ang isang halimbawa ng daloy ng trabaho kapag ginagamit ito (mula sa dokumentasyon ng proyekto):

Pagsusuri ng Skaffold para sa pagbuo ng Kubernetes

Ano ang hitsura ng trabaho ni Skaffold sa mga pangkalahatang tuntunin?

  1. Sinusubaybayan ng utility ang mga pagbabago sa direktoryo ng source code. Kung ang mga pagbabago ay ginawa sa mga file, sila ay naka-synchronize sa application pod sa Kubernetes cluster. Kung maaari, nang hindi muling pinagsama-sama ang imahe. Kung hindi, isang bagong imahe ang binuo.
  2. Ang naka-assemble na imahe ay sinusuri gamit ang container-structure-test, na-tag at ipinadala sa Docker Registry.
  3. Pagkatapos nito, i-deploy ang imahe - na-deploy sa cluster ng Kubernetes.
  4. Kung sinimulan ang paglunsad gamit ang command skaffold dev, pagkatapos ay magsisimula kaming makatanggap ng mga log mula sa application, at naghihintay ang Skaffold para sa mga pagbabago na ulitin ang lahat ng mga aksyon.

Pagsusuri ng Skaffold para sa pagbuo ng Kubernetes
Ilustrasyon ng mga pangunahing yugto ng operasyon ng Skaffold

Magsanay. Sinusubukan ang Skaffold

Upang ipakita ang paggamit ng Skaffold, kukuha ako ng isang halimbawa mula sa GitHub project repository. Siya nga pala, doon Makakahanap ka ng maraming iba pang mga halimbawa na isinasaalang-alang ang iba't ibang mga detalye. Gagawin ko ang lahat ng aksyon nang lokal sa Minikube. Ang pag-install ay simple at tumatagal ng ilang minuto, at kakailanganin mo ng kubectl upang makapagsimula.

I-install ang 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

I-clone natin ang repositoryo ng Skaffold gamit ang mga kinakailangang halimbawa:

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

Pumili ako ng isang halimbawa na may dalawang pod, bawat isa ay naglalaman ng isang maliit na Go application. Ang isang application ay ang frontend (leeroy-web), na nagre-redirect sa kahilingan sa pangalawang application - ang backend (leeroy-app). Tingnan natin kung ano ang hitsura nito:

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

Ang leeroy-app at leeroy-web ay naglalaman ng Go code at simpleng Dockerfiles para sa lokal na pagbuo ng code na ito:

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

Hindi ko ibibigay ang application code - sapat na para malaman iyon leeroy-web tumatanggap ng mga kahilingan at nag-proxy sa kanila leeroy-app. Samakatuwid sa mga file Deployment.yaml mayroong Serbisyo para lamang sa app (para sa panloob na pagruruta). Pod port web ipapasa namin ito sa aming sarili para sa mabilis na pag-access sa application.

Ano ang hitsura nito 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

Ang lahat ng mga yugto na nabanggit sa itaas ay inilarawan dito. Bilang karagdagan sa config na ito, mayroon ding isang file na may mga pandaigdigang setting - ~/.skaffold/config. Maaari itong i-edit nang manu-mano o sa pamamagitan ng CLI - halimbawa, tulad nito:

skaffold config set --global local-cluster true

Itatakda ng command na ito ang global variable local-cluster sa kahulugan true, pagkatapos nito ay hindi susubukan ng Skaffold na itulak ang mga imahe sa remote na pagpapatala. Kung lokal ka sa pagbuo, maaari mong gamitin ang command na ito upang bumuo ng mga imahe nang lokal.

Balik sa skaffold.yaml:

  • Sa entablado build tinukoy namin na kailangan mong kolektahin at i-save ang imahe nang lokal. Matapos tumakbo ang build sa unang pagkakataon, makikita natin ang sumusunod:
    // т.к. 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

    Tulad ng nakikita mo, si Skaffold ang nag-tag mismo ng mga larawan. Siyanga pala, maraming mga patakaran sa pag-tag ang sinusuportahan.

  • Karagdagan sa config ito ay ipinahiwatig context: ./leeroy-app/, ibig sabihin. tinukoy ang konteksto kung saan kinokolekta ang larawan.
  • Sa yugto ng pag-deploy, natukoy na gagamitin namin ang kubectl at isang mask para sa mga kinakailangang manifest.
  • PortForward: katulad ng kung paano namin karaniwang nagpapasa ng mga port gamit kubectl port-forward, nagbibigay kami ng mga tagubilin sa Skaffold na tawagan ang command na ito. Sa kasong ito, ang lokal na port 9000 ay ipinapasa sa 8080 sa Deployment na may pangalan leeroy-web.

Oras na para ilunsad skaffold dev: Ang koponan ay lilikha ng isang patuloy na "feedback loop", ibig sabihin. hindi lamang nito kokolektahin ang lahat at i-deploy ito sa cluster, ngunit sasabihin din sa iyo ang tungkol sa estado ng mga pod sa ngayon, subaybayan ang mga pagbabago at i-update ang estado ng mga pod.

Narito ang resulta ng paglulunsad skaffold dev --port-forward kapag muling pinagsama-sama:

Pagsusuri ng Skaffold para sa pagbuo ng Kubernetes

Una, makikita mo na ginagamit ang cache. Susunod, ang application ay binuo, ipinakalat, at ang mga port ay ipinapasa. Dahil tinukoy --port-forward, ipinasa ng Skaffold ang port sa web, gaya ng itinanong sa kanya, ngunit narito app itinapon niya sa kanyang sariling paghuhusga (pinili ang pinakamalapit na libre). Pagkatapos nito, natatanggap namin ang mga unang log mula sa mga application.

Tingnan natin kung gumagana ito?

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

Pagbabago ng file leeroy-app/app.go - lumipas ang ilang segundo... at:

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

Kasabay nito, ang Skaffold mismo ay nagpakita ng parehong bagay sa console tulad ng dati, maliban sa isang punto: ito ay inilunsad lamang leeroy-app, at hindi sabay-sabay.

Mas maraming pagsasanay

Nararapat ding banggitin na kapag lumilikha ng isang bagong proyekto, ang mga config para sa Skaffold ay maaaring ma-bootstrapped gamit ang command init, na napaka maginhawa. Bilang karagdagan, maaari kang magsulat ng ilang mga config: isagawa ang pag-unlad sa default na config, at pagkatapos ay ilunsad sa entablado gamit ang command run (parehong proseso ng dev, hindi lang sinusubaybayan ang mga pagbabago), gamit ang ibang config.

Sa katacoda meron pamumuno Ito ay mas madali sa isang halimbawa. Ngunit nag-aalok ito ng isang handa na sandbox na may Kubernetes, isang application at Skaffold. Isang mahusay na opsyon kung interesado kang subukan ang mga pangunahing kaalaman sa iyong sarili.

Ang isang posibleng kaso ng paggamit para sa Skaffold ay ang pagsasagawa ng development sa isang remote cluster. Hindi lahat ay kumportable na patakbuhin ang Minikube sa kanilang sariling hardware, pagkatapos ay ilunsad ang application at umaasa na ito ay gagana nang sapat... Sa kasong ito, perpektong malulutas ng Skaffold ang problema, na maaaring makumpirma, halimbawa, ng mga inhinyero ng Reddit, tulad ng mayroon kami napag-usapan na nagsulat sa aming blog.

At sa ang publikasyong ito mula sa Weaveworks makakahanap ka ng halimbawa ng paggawa ng pipeline para sa produksyon.

Konklusyon

Ang Skaffold ay isang maginhawang tool para sa pagbuo ng mga pipeline na kinabibilangan ng paglulunsad ng mga application sa Kubernetes at pangunahing nakatuon sa mga pangangailangan sa pag-unlad. Pinapadali nitong lumikha ng isang "maikling" pipeline na isinasaalang-alang ang mga pangunahing pangangailangan ng developer, ngunit kung ninanais, maaari mong ayusin ang mas malalaking proseso. Bilang isa sa mga malinaw na halimbawa ng paggamit ng Skaffold sa mga proseso ng CI/CD ay ibinigay tulad pagsubok na proyekto ng 10 microservices gamit ang mga kakayahan ng Kubernetes, gRPC, Istio at OpenCensus Tracing.

Ang Skaffold ay mayroon nang halos 8000+ star sa GitHub, ay binuo ng Google at bahagi ng GoogleContainerTools — sa pangkalahatan, sa ngayon ay may lahat ng dahilan upang maniwala na ang proyekto ay bubuo nang maligaya magpakailanman.

PS

Basahin din sa aming blog:

Pinagmulan: www.habr.com

Magdagdag ng komento