Kubernetes хөгжүүлэлтэд зориулсан Skaffold-ийн тойм

Kubernetes хөгжүүлэлтэд зориулсан Skaffold-ийн тойм

Жил хагасын өмнө буюу 5 оны 2018-р сарын XNUMX-нд Google CI/CD-д зориулсан Нээлттэй эхийн төслийн анхны альфа хувилбарыг гаргасан. Скаффолд, түүний зорилго нь "энгийн бөгөөд давтагдах Kubernetes хөгжүүлэлт"-ийг бий болгох бөгөөд ингэснээр хөгжүүлэгчид удирдлагаас илүү хөгжилд анхаарлаа хандуулах боломжтой байв. Скаффолдын талаар юу сонирхолтой байж болох вэ? Эндээс харахад энэ нь хөгжүүлэгч, магадгүй үйл ажиллагааны инженер хүртэл хүчирхэг хэрэгсэл болгож чадах хэд хэдэн заль мэхтэй. Төсөл болон түүний боломжуудтай танилцацгаая.

NB: Дашрамд хэлэхэд бид ерөнхийдөө Скаффолдын талаар товч ярьсан хөгжүүлэгчийн хэрэгслүүдийн тойм, тэдний амьдрал Кубернетестэй холбоотой.

Онол. Зорилго, чадвар

Тиймээс ерөнхийдөө Skaffold нь CI/CD циклийг автоматжуулах ( бүтээх, түлхэх, байрлуулах үе шатуудад) асуудлыг шийдэж, хөгжүүлэгчийн шуурхай санал хүсэлтийг санал болгодог. дараагийн кодын өөрчлөлтийн үр дүнг хурдан хүлээн авах чадвар - Kubernetes кластерт ажиллаж байгаа шинэчлэгдсэн програм хэлбэрээр. Мөн энэ нь өөр өөр хэлхээнд (хөгжүүлэгч, үе шат, үйлдвэрлэл ...) ажиллах боломжтой бөгөөд үүнд Skaffold нь нэвтрүүлэхэд тохирох дамжуулах хоолойнуудыг тайлбарлахад тусалдаг.

Skaffold-ийн эх код нь Go дээр бичигдсэн, тараасан үнэгүй Apache Лиценз 2.0 (GitHub) дагуу.

Үндсэн функц, онцлогуудыг авч үзье. Эхнийх нь дараахь зүйлийг агуулна.

  • Skaffold нь CI/CD дамжуулах хоолой үүсгэх хэрэгслийг санал болгодог.
  • Энэ нь танд эх кодын арын код дахь өөрчлөлтийг хянах, кодыг контейнерийн зураг болгон нэгтгэх, эдгээр зургийг Docker бүртгэлд нийтлэх, Кубернетес кластерт байрлуулах автомат процессыг ажиллуулах боломжийг олгоно.
  • Репозитор дахь файлуудыг контейнер доторх ажлын лавлахтай синхрончилдог.
  • Container-structure-test ашиглан автоматаар шалгана.
  • Дамжуулах портууд.
  • Контейнер дотор ажиллаж байгаа програмын бүртгэлийг уншина.
  • Java, Node.js, Python, Go дээр бичигдсэн програмуудыг дибаг хийхэд тусална.

Одоо онцлог шинж чанаруудын талаар:

  • Skaffold өөрөө кластер талын бүрэлдэхүүн хэсгүүдгүй. Өөрөөр хэлбэл, энэ хэрэгслийг ашиглахын тулд Kubernetes-ийг цаашид тохируулах шаардлагагүй болно.
  • Таны хэрэглээний өөр өөр шугам хоолой. Та хөгжүүлж байх хугацаандаа орон нутгийн Minikube-д кодыг тарааж, дараа нь тайз эсвэл үйлдвэрлэлд оруулах шаардлагатай байна уу? Энэ зорилгоор байдаг профайлууд Хэрэглэгчийн тохиргоо, орчны хувьсагч ба тугууд нь нэг програмын өөр өөр дамжуулах шугамыг дүрслэх боломжийг олгодог.
  • CLI. Зөвхөн YAML дахь консолын хэрэгсэл болон тохиргоонууд. Интернет дээр та үүсгэх оролдлогын лавлагаа олж болно туршилтын GUIГэсэн хэдий ч, одоогоор энэ нь хэн нэгэнд хэрэгтэй гэсэн үг юм, гэхдээ үнэндээ тийм биш.
  • Модульчлал. Skaffold нь бие даасан комбайн биш боловч тодорхой ажлуудад зориулж тусдаа модулиуд эсвэл одоо байгаа шийдлүүдийг ашиглахыг хичээдэг.

Сүүлчийн зураглал:

  • Угсралтын үе шатанд та дараахь зүйлийг ашиглаж болно.
    • docker-ыг орон нутагт, kaniko ашиглан кластерт эсвэл Google Cloud Build дээр бүтээх;
    • Базел орон нутагт;
    • Jib Maven болон Jib Gradle нарыг дотооддоо эсвэл Google Cloud Build дээр;
    • захиалгат бүтээх скриптүүд нь орон нутагт ажилладаг. Хэрэв та өөр (илүү уян хатан/танил/...) бүтээх шийдлийг ажиллуулах шаардлагатай бол үүнийг Скаффолд ажиллуулахын тулд скриптэд тайлбарласан болно (баримт бичгийн жишээ). Энэ нь скрипт ашиглан дуудаж болох аливаа цуглуулагчийг ашиглах боломжийг танд олгоно;
  • Туршилтын үе шатанд аль хэдийн дурдсан чингэлэг-бүтэц-туршилт;
  • Байршуулахын тулд дараахь зүйлийг хангана.
    • Kubectl;
    • жолоо;
    • тохируулах.

Үүний ачаар Скаффолдыг өвөрмөц гэж нэрлэж болно CI/CD бүтээх хүрээ. Үүнийг ашиглах үеийн ажлын жишээ энд байна (төслийн баримт бичгээс):

Kubernetes хөгжүүлэлтэд зориулсан Skaffold-ийн тойм

Скаффолдын бүтээл ерөнхийдөө ямар харагддаг вэ?

  1. Уг хэрэгсэл нь эх кодын лавлах дахь өөрчлөлтийг хянадаг. Хэрэв файлд өөрчлөлт оруулсан бол тэдгээрийг Kubernetes кластер дахь програмын самбартай синхрончилно. Боломжтой бол зургийг дахин угсрахгүйгээр. Үгүй бол шинэ зураг угсарна.
  2. Угсарсан зургийг container-structure-test ашиглан шалгаж, шошголож, Docker Registry руу илгээнэ.
  3. Үүний дараа зургийг Kubernetes кластерт байрлуулна.
  4. Хэрэв эхлүүлэх командыг ашиглан эхлүүлсэн бол skaffold dev, дараа нь бид програмаас лог хүлээн авч эхлэх бөгөөд Skaffold бүх үйлдлийг дахин давтах өөрчлөлтийг хүлээж байна.

Kubernetes хөгжүүлэлтэд зориулсан Skaffold-ийн тойм
Скаффолдын үйл ажиллагааны үндсэн үе шатуудын зураглал

Дасгал хийх. Скаффолдыг оролдож байна

Skaffold-ийн хэрэглээг харуулахын тулд би жишээ авах болно GitHub төслийн агуулах. Дашрамд хэлэхэд, Тэнд Та янз бүрийн онцлогийг харгалзан үзсэн бусад олон жишээг олж болно. Би бүх үйлдлийг Minikube-д орон нутагт хийх болно. Суулгах нь энгийн бөгөөд хэдхэн минут шаардагдах бөгөөд эхлэхийн тулд танд kubectl хэрэгтэй болно.

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

Скаффолдын агуулахыг шаардлагатай жишээнүүдээр хувилъя:

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

Би тус бүр нь нэг жижиг Go програм агуулсан хоёр pods бүхий жишээг сонгосон. Нэг програм нь урд талын програм (leeroy-web) бөгөөд хүсэлтийг хоёр дахь программ руу чиглүүлдэг - backend (leeroy-app). Энэ нь юу болохыг харцгаая:

~/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 болон leeroy-web нь энэ кодыг дотооддоо бүтээхэд зориулсан Go код болон энгийн Docker файлуудыг агуулдаг:

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

Би програмын кодыг өгөхгүй - үүнийг мэдэхэд хангалттай leeroy-web хүсэлтийг хүлээн авч, тэдэнд итгэмжлэгдсэн төлөөлөгч leeroy-app. Тиймээс файлуудад Deployment.yaml зөвхөн үйлчилгээ байдаг app (дотоод чиглүүлэлтийн хувьд). Под порт web Бид програм руу хурдан нэвтрэхийн тулд үүнийг өөрсдөдөө дамжуулах болно.

Үзсэн мэт харагдаж байна 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

Дээр дурдсан бүх үе шатуудыг энд тайлбарласан болно. Энэ тохиргооноос гадна глобал тохиргоотой файл бас бий. ~/.skaffold/config. Үүнийг гараар эсвэл CLI ашиглан засварлаж болно - жишээлбэл:

skaffold config set --global local-cluster true

Энэ тушаал нь глобал хувьсагчийг тохируулах болно local-cluster утга руу оруулна true, үүний дараа Skaffold нь алсын бүртгэл рүү зураг оруулахыг оролдохгүй. Хэрэв та орон нутагт хөгжиж байгаа бол энэ командыг ашиглан зураг бүтээх боломжтой.

Буцах skaffold.yaml:

  • Тайзан дээр build Бид зургийг дотооддоо цуглуулж, хадгалах шаардлагатайг зааж өгсөн. Бүтэц анх удаагаа ажилласны дараа бид дараахь зүйлийг харах болно.
    // т.к. 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

    Таны харж байгаагаар Скаффолд өөрөө зургуудыг тэмдэглэв. Дашрамд хэлэхэд, шошголох хэд хэдэн бодлогыг дэмждэг.

  • Цаашид тохиргоонд үүнийг зааж өгсөн болно context: ./leeroy-app/, өөрөөр хэлбэл зураг цуглуулсан контекстийг зааж өгсөн болно.
  • Байршуулах үе шатанд бид kubectl болон шаардлагатай манифестэд зориулж маск ашиглахаар шийдсэн.
  • PortForward: бид портуудыг ихэвчлэн ашигладагтай төстэй kubectl port-forward, бид энэ командыг дуудах зааварчилгааг Skaffold-д өгдөг. Энэ тохиолдолд локал порт 9000 нь Deployment-д нэрээр 8080 руу дамжуулагдана. leeroy-web.

Эхлэх цаг боллоо skaffold dev: Баг нь байнгын "санал хүсэлтийн гогцоо" үүсгэх болно, өөрөөр хэлбэл. Энэ нь бүх зүйлийг цуглуулж кластерт байршуулаад зогсохгүй одоо байгаа хонхорцогуудын төлөв байдлын талаар танд хэлэх, өөрчлөлтийг хянах, хонгилын төлөвийг шинэчлэх болно.

Энд нээлтийн үр дүн байна skaffold dev --port-forward дахин угсрах үед:

Kubernetes хөгжүүлэлтэд зориулсан Skaffold-ийн тойм

Эхлээд та кэшийг ашиглаж байгааг харж болно. Дараа нь програмыг угсарч, байрлуулж, портуудыг дамжуулна. Тодорхойлсоноос хойш --port-forward, Скаффолд портыг дамжуулав web, түүнээс асуусан шиг, гэхдээ энд app тэр өөрийн үзэмжээр шидсэн (хамгийн ойрын үнэ төлбөргүйг сонгосон). Үүний дараа бид програмуудаас эхний бүртгэлийг хүлээн авдаг.

Энэ нь ажиллаж байгаа эсэхийг шалгацгаая?

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

Файлыг өөрчилж байна leeroy-app/app.go - хэдхэн секунд өнгөрөхөд... мөн:

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

Үүний зэрэгцээ, Скаффолд өөрөө консол дээр өмнөхтэй ижил зүйлийг харуулсан бөгөөд нэг зүйлийг эс тооцвол: энэ нь зөвхөн гарч ирсэн. leeroy-app, мөн бүгдийг нэг дор биш.

Илүү дадлага хийх

Шинэ төсөл үүсгэх үед Skaffold-ийн тохиргоог тушаалыг ашиглан ачаалах боломжтой гэдгийг дурдах нь зүйтэй. init, энэ нь маш тохиромжтой. Нэмж дурдахад та хэд хэдэн тохиргоог бичиж болно: анхдагч тохиргоон дээр хөгжүүлэлтийг хийж, дараа нь командын тусламжтайгаар шат руу шилжүүлээрэй. run (ижил процесс dev, зүгээр л өөрчлөлтийг хянахгүй), өөр тохиргоо ашиглан.

Катакода дээр байдаг гарын авлага Энэ нь жишээгээр илүү хялбар байдаг. Гэхдээ энэ нь Kubernetes, програм, Skaffold бүхий бэлэн хамгаалагдсан хязгаарлагдмал орчинд санал болгодог. Хэрэв та үндсэн мэдлэгээ өөрөө туршиж үзэх сонирхолтой бол маш сайн сонголт.

Скаффолдыг ашиглах боломжтой нэг тохиолдол бол алсын кластер дээр хөгжүүлэлт хийх явдал юм. Хүн бүр Minikube-г өөрийн техник хэрэгслээр ажиллуулж, дараа нь програмаа хөгжүүлж, зохих ёсоор ажиллахыг хүлээх нь тийм ч таатай байдаггүй... Энэ тохиолдолд Skaffold нь асуудлыг төгс шийддэг бөгөөд үүнийг жишээ нь Reddit инженерүүд баталж чадна. аль хэдийн хэлэлцсэн бичсэн манай блогт.

Тэгээд бас энэ нийтлэлийг Weaveworks-ээс та үйлдвэрлэлийн шугам хоолой үүсгэх жишээг олж болно.

дүгнэлт

Skaffold нь Kubernetes-д програмуудыг нэвтрүүлэхийг хамарсан дамжуулах хоолой барихад тохиромжтой хэрэгсэл бөгөөд үндсэндээ хөгжлийн хэрэгцээнд анхаарлаа хандуулдаг. Энэ нь хөгжүүлэгчийн үндсэн хэрэгцээг харгалзан "богино" дамжуулах хоолойг бий болгоход хялбар болгодог, гэхдээ хэрэв хүсвэл илүү том процессуудыг зохион байгуулж болно. CI/CD процесст Skaffold ашиглах тод жишээнүүдийн нэг нь өгөгдсөн Ийм туршилтын төсөл Kubernetes, gRPC, Istio болон OpenCensus Tracing-ийн чадавхийг ашиглан 10 микро үйлчилгээний.

Skaffold нь GitHub дээр аль хэдийн бараг 8000 гаруй одтой, Google-ийн хөгжүүлсэн бөгөөд нэг хэсэг юм. GoogleContainerTools - Ер нь, одоогоор төсөл нь аз жаргалтайгаар хөгжинө гэдэгт итгэх бүх үндэслэл бий.

PS

Мөн манай блог дээрээс уншина уу:

Эх сурвалж: www.habr.com

сэтгэгдэл нэмэх