Kubernetes rivojlanishi uchun Skaffold sharhi

Kubernetes rivojlanishi uchun Skaffold sharhi

Bir yarim yil avval, 5-yil 2018-martda Google CI/CD uchun Ochiq manba loyihasining birinchi alfa versiyasini chiqardi. Skaffold, uning maqsadi ishlab chiquvchilar ma'muriyatga emas, balki rivojlanishga e'tibor qaratishlari uchun "oddiy va takrorlanadigan Kubernetes rivojlanishini" yaratish edi. Skaffold haqida nima qiziqarli bo'lishi mumkin? Ma'lum bo'lishicha, unda bir nechta hiyla-nayranglar mavjud bo'lib, ular uni ishlab chiquvchi va ehtimol operatsion muhandis uchun kuchli vositaga aylantira oladi. Keling, loyiha va uning imkoniyatlari bilan tanishaylik.

NB: Aytgancha, biz Skaffold haqida umumiy fikrda qisqacha gaplashdik ishlab chiquvchi vositalarini ko'rib chiqish, ularning hayoti Kubernetes bilan bog'liq.

Nazariya. Maqsad va imkoniyatlar

Shunday qilib, umuman olganda, Skaffold CI/CD siklini avtomatlashtirish muammosini hal qiladi (qurilish, surish, joylashtirish bosqichlarida), ishlab chiquvchiga tezkor fikr-mulohazalarni taklif qiladi, ya'ni. keyingi kod o'zgarishlarining natijasini tezda olish qobiliyati - Kubernetes klasterida ishlaydigan yangilangan dastur ko'rinishida. Va u turli xil sxemalarda ishlashi mumkin (dev, sahna, ishlab chiqarish ...), buning uchun Skaffold ishlab chiqarish uchun mos keladigan quvurlarni tavsiflashga yordam beradi.

Skaffoldning manba kodi Go-da yozilgan, tarqaladi bepul Apache litsenziyasi 2.0 (GitHub) ostida.

Keling, asosiy funktsiyalar va xususiyatlarni ko'rib chiqaylik. Birinchisiga quyidagilar kiradi:

  • Skaffold CI/CD quvurlarini yaratish uchun vositalarni taklif etadi.
  • Bu sizga fonda manba kodidagi o'zgarishlarni kuzatish va kodni konteyner tasvirlariga yig'ish, bu tasvirlarni Docker registrida nashr qilish va Kubernetes klasteriga joylashtirishning avtomatlashtirilgan jarayonini amalga oshirish imkonini beradi.
  • Ombordagi fayllarni konteynerdagi ishchi katalog bilan sinxronlashtiradi.
  • Konteyner-struktura-test yordamida avtomatik sinovlar.
  • Forward portlar.
  • Konteynerda ishlaydigan dastur jurnallarini o'qiydi.
  • Java, Node.js, Python, Go-da yozilgan ilovalarni disk raskadrovka qilishda yordam beradi.

Endi xususiyatlar haqida:

  • Skaffoldning o'zida klaster tomoni komponentlari yo'q. Ya'ni, Kubernetes-ni ushbu yordam dasturidan foydalanish uchun qo'shimcha sozlashning hojati yo'q.
  • Ilovangiz uchun turli xil quvurlar. Rivojlanayotganingizda kodni mahalliy Minikube-ga, keyin esa sahnalashtirish yoki ishlab chiqarishga chiqarishingiz kerakmi? Shu maqsadda mavjud profillar va foydalanuvchi konfiguratsiyasi, atrof-muhit o'zgaruvchilari va bayroqlar, bu sizga bitta dastur uchun turli xil quvurlarni tavsiflash imkonini beradi.
  • CLI. YAMLda faqat konsol yordam dasturi va konfiguratsiyalar. Internetda siz yaratishga urinishlarga havolalarni topishingiz mumkin eksperimental GUI, ammo, Ayni paytda bu, ehtimol, kimdir unga muhtojligini anglatadi, lekin aslida emas.
  • Modullik. Skaffold mustaqil kombayn emas, balki muayyan vazifalar uchun alohida modullar yoki mavjud echimlardan foydalanishga intiladi.

Ikkinchisining tasviri:

  • Yig'ish bosqichida siz foydalanishingiz mumkin:
    • docker mahalliy sifatida, kaniko yordamida klasterda yoki Google Cloud Build-da qurish;
    • Bazel mahalliy;
    • Jib Maven va Jib Gradle mahalliy yoki Google Cloud Build-da;
    • maxsus qurish skriptlari mahalliy sifatida ishlaydi. Agar siz boshqa (ko'proq moslashuvchan/tanish/...) qurish yechimini ishga tushirishingiz kerak bo'lsa, u Skaffold uni ishga tushirishi uchun skriptda tasvirlangan (hujjatlardan misol). Bu skript yordamida chaqirilishi mumkin bo'lgan har qanday kollektordan foydalanish imkonini beradi;
  • Sinov bosqichida, allaqachon aytib o'tilgan konteyner-struktura-test;
  • Joylashtirish uchun quyidagilar taqdim etiladi:
    • Kubectl;
    • rul;
    • moslashtirish.

Buning yordamida Skaffoldni noyob deb atash mumkin CI/CD yaratish uchun asos. Uni ishlatishda ish jarayonining namunasi (loyiha hujjatlaridan):

Kubernetes rivojlanishi uchun Skaffold sharhi

Skaffoldning ishi umumiy nuqtai nazardan qanday ko'rinishga ega?

  1. Yordamchi dastur manba kodi katalogidagi o'zgarishlarni kuzatib boradi. Agar fayllarga o'zgartirishlar kiritilsa, ular Kubernetes klasteridagi dastur podasi bilan sinxronlashtiriladi. Iloji bo'lsa, tasvirni qayta yig'masdan. Aks holda, yangi rasm yig'iladi.
  2. Yig'ilgan rasm konteyner-struktura-test yordamida tekshiriladi, teglanadi va Docker registriga yuboriladi.
  3. Shundan so'ng, rasm o'rnatiladi - Kubernetes klasterida joylashtiriladi.
  4. Agar ishga tushirish buyruq yordamida ishga tushirilgan bo'lsa skaffold dev, keyin biz dasturdan jurnallarni olishni boshlaymiz va Skaffold barcha amallarni yana takrorlash uchun o'zgarishlarni kutadi.

Kubernetes rivojlanishi uchun Skaffold sharhi
Skaffold operatsiyasining asosiy bosqichlari tasviri

Amaliyot. Skaffold sinab ko'rilmoqda

Skaffold-dan foydalanishni ko'rsatish uchun men misol keltiraman GitHub loyiha ombori. Aytmoqchi, bir joyda Turli xil xususiyatlarni hisobga oladigan boshqa ko'plab misollarni topishingiz mumkin. Men barcha amallarni mahalliy Minikubeda bajaraman. O'rnatish oddiy va bir necha daqiqa davom etadi va boshlash uchun sizga kubectl kerak bo'ladi.

Skaffold o'rnating:

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

Keling, Skaffold omborini kerakli misollar bilan klonlaylik:

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

Men ikkita podsli misolni tanladim, ularning har biri bitta kichik Go ilovasini o'z ichiga oladi. Ilovalardan biri frontend (leeroy-web) bo'lib, so'rovni ikkinchi dasturga - backendga (leeroy-app) yo'naltiradi. Keling, qanday ko'rinishini ko'rib chiqaylik:

~/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 va leeroy-web ushbu kodni mahalliy yaratish uchun Go kodi va oddiy Dockerfilllarni o'z ichiga oladi:

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

Men dastur kodini bermayman - buni bilish kifoya leeroy-web so'rovlarni qabul qiladi va ularga proksi yuboradi leeroy-app. Shuning uchun fayllarda Deployment.yaml faqat uchun xizmat mavjud app (ichki marshrutlash uchun). Pod port web ilovaga tez kirish uchun uni o'zimizga yuboramiz.

Shunga o'xshash 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

Yuqorida aytib o'tilgan barcha bosqichlar bu erda tasvirlangan. Ushbu konfiguratsiyaga qo'shimcha ravishda global sozlamalarga ega fayl ham mavjud - ~/.skaffold/config. Uni qo'lda yoki CLI orqali tahrirlash mumkin - masalan, bu kabi:

skaffold config set --global local-cluster true

Ushbu buyruq global o'zgaruvchini o'rnatadi local-cluster ma'noga kiradi true, shundan so'ng Skaffold rasmlarni masofaviy ro'yxatga olish kitobiga o'tkazishga urinmaydi. Agar siz mahalliy darajada rivojlanayotgan bo'lsangiz, ushbu buyruqni mahalliy sifatida tasvirlarni yaratish uchun ishlatishingiz mumkin.

Orqaga skaffold.yaml:

  • Sahnada build biz tasvirni mahalliy sifatida to'plashingiz va saqlashingiz kerakligini aniqlaymiz. Qurilish birinchi marta ishga tushirilgandan so'ng, biz quyidagilarni ko'ramiz:
    // т.к. 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

    Ko'rib turganingizdek, Skaffold rasmlarni o'zi belgiladi. Aytgancha, bir nechta teglash siyosatlari qo'llab-quvvatlanadi.

  • Keyinchalik konfiguratsiyada u ko'rsatilgan context: ./leeroy-app/, ya'ni. tasvir to'plangan kontekst ko'rsatilgan.
  • Joylashtirish bosqichida biz kubectl va kerakli manifestlar uchun niqobdan foydalanishimiz aniqlandi.
  • PortForward: biz odatda portlarni qanday yo'naltirishimiz bilan o'xshash kubectl port-forward, biz Skaffold-ga ushbu buyruqni chaqirish uchun ko'rsatmalar beramiz. Bunday holda, mahalliy port 9000 nomi bilan Joylashtirishda 8080 ga yo'naltiriladi. leeroy-web.

Ishga tushirish vaqti keldi skaffold dev: Jamoa doimiy "teskari aloqa" ni yaratadi, ya'ni. u nafaqat hamma narsani to'playdi va uni klasterga joylashtiradi, balki ayni paytda podkastlarning holati haqida ham aytib beradi, o'zgarishlarni kuzatib boradi va podalar holatini yangilaydi.

Mana ishga tushirish natijasi skaffold dev --port-forward qayta yig'ishda:

Kubernetes rivojlanishi uchun Skaffold sharhi

Birinchidan, kesh ishlatilayotganini ko'rishingiz mumkin. Keyinchalik, dastur yig'iladi, joylashtiriladi va portlar uzatiladi. Belgilanganidan beri --port-forward, Skaffold portni yo'naltirdi web, undan so'raganidek, lekin app u o'z xohishiga ko'ra tashladi (eng yaqin bepulni tanladi). Shundan so'ng biz ilovalardan birinchi jurnallarni olamiz.

Keling, tekshirib ko'raylik, u ishlaydimi?

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

Faylni o'zgartirish leeroy-app/app.go - bir necha soniya o'tadi ... va:

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

Shu bilan birga, Skaffoldning o'zi konsolda xuddi shu narsani ko'rsatdi, bir nuqta bundan mustasno: u faqat chiqdi. leeroy-app, va hammasi birdan emas.

Ko'proq amaliyot

Shuni ham ta'kidlash kerakki, yangi loyiha yaratishda Skaffold uchun konfiguratsiyalar buyruq yordamida yuklanishi mumkin. init, bu juda qulay. Bundan tashqari, siz bir nechta konfiguratsiyalarni yozishingiz mumkin: standart konfiguratsiya bo'yicha ishlab chiqishni amalga oshiring va keyin buyruq bilan sahnaga chiqing. run (xuddi shunday jarayon dev, faqat o'zgarishlarni kuzatmaydi), boshqa konfiguratsiya yordamida.

Katakoda bor etakchilik Bir misol bilan bu yanada osonroq. Ammo u Kubernetes, dastur va Skaffold bilan tayyor sandboxni taklif qiladi. Agar siz asoslarni o'zingiz sinab ko'rmoqchi bo'lsangiz, ajoyib variant.

Skaffolddan foydalanishning mumkin bo'lgan holatlaridan biri uzoq klasterda ishlab chiqishni amalga oshirishdir. Har kim ham Minikube-ni o'z uskunasida ishga tushira olmaydi, keyin dasturni ishga tushiradi va uning to'g'ri ishlashini kutadi ... Bu holda Skaffold muammoni mukammal hal qiladi, buni bizda bo'lgani kabi, masalan, Reddit muhandislari tasdiqlashi mumkin. allaqachon muhokama qilingan yozgan bizning blogimizda.

Va ichkarida Ushbu nashr Weaveworks-dan siz ishlab chiqarish uchun quvur liniyasini yaratish misolini topishingiz mumkin.

xulosa

Skaffold - bu Kubernetes-ga ilovalarni tarqatishni o'z ichiga olgan va birinchi navbatda rivojlanish ehtiyojlariga qaratilgan quvurlarni qurish uchun qulay vosita. Bu ishlab chiquvchining asosiy ehtiyojlarini hisobga oladigan "qisqa" quvur liniyasini yaratishni juda osonlashtiradi, ammo agar xohlasangiz, siz kattaroq jarayonlarni tashkil qilishingiz mumkin. CI/CD jarayonlarida Skaffolddan foydalanishning aniq misollaridan biri sifatida beriladi bunday sinov loyihasi Kubernetes, gRPC, Istio va OpenCensus Tracing imkoniyatlaridan foydalangan holda 10 ta mikroservisdan iborat.

Skaffold allaqachon GitHub-da deyarli 8000+ yulduzga ega, Google tomonidan ishlab chiqilgan va uning bir qismidir. GoogleContainerTools — Umuman olganda, hozirda loyiha bundan keyin ham baxtli rivojlanadi, deyishga barcha asoslar bor.

PS

Shuningdek, bizning blogimizda o'qing:

Manba: www.habr.com

a Izoh qo'shish