Преглед на Skaffold за развој на Kubernetes

Преглед на Skaffold за развој на Kubernetes

Пред една и пол година, на 5 март 2018 година, Google ја објави првата алфа верзија на својот проект со отворен код за CI/CD наречена Скеле, чија цел беше да се создаде „едноставен и повторлив развој на Kubernetes“, така што програмерите би можеле да се фокусираат на развојот наместо на администрацијата. Што може да биде интересно за Skaffold? Како што се испоставува, има неколку трикови во ракавот што може да го направат моќна алатка за развивачот, а можеби дури и за оперативниот инженер. Ајде да се запознаеме со проектот и неговите можности.

NB: Патем, веќе накратко зборувавме за Skaffold во нашата општа преглед на алатки за програмери, чии животи се поврзани со Кубернетес.

Теорија. Цел и способности

Значи, генерално кажано, Skaffold го решава проблемот со автоматизирање на циклусот CI/CD (во фазите на градење, туркање, распоредување), нудејќи му на развивачот брза повратна информација, т.е. можност за брзо примање на резултатот од последователните промени на кодот - во форма на ажурирана апликација која работи во кластерот Kubernetes. И може да работи во различни кола (dev, фаза, продукција...), за кои Skaffold помага да се опишат соодветните цевководи за пуштање.

Изворниот код на Skaffold е напишан во Go, дистрибуирани од под бесплатната лиценца Apache 2.0 (GitHub).

Ајде да ги погледнеме главните функции и карактеристики. Првите го вклучуваат следново:

  • Skaffold нуди алатки за создавање CI/CD цевководи.
  • Ви овозможува да ги следите промените во изворниот код во заднина и да извршите автоматизиран процес на составување код во слики од контејнери, објавувајќи ги овие слики во регистарот на Docker и распоредувајќи ги во кластерот Kubernetes.
  • Ги синхронизира датотеките во складиштето со работниот директориум во контејнерот.
  • Автоматски тестира со користење на контејнер-структура-тест.
  • Напред порти.
  • Ги чита дневниците на апликацијата што работи во контејнер.
  • Помага во дебагирање на апликации напишани во Java, Node.js, Python, Go.

Сега за карактеристиките:

  • Самиот скеле нема компоненти од страна на кластерот. Тоа е, нема потреба дополнително да го конфигурирате Kubernetes за да ја користи оваа алатка.
  • Различни цевководи за вашата апликација. Дали треба да го префрлите кодот на локалниот Minikube додека развивате, а потоа да го поставите на сцената или продукцијата? За таа цел постојат профили и кориснички конфигурации, променливи на животната средина и знаменца, кои ви дозволуваат да опишете различни цевководи за една апликација.
  • CLI. Само алатка и конфигурации на конзолата во YAML. На Интернет можете да најдете референци за обиди за создавање експериментален GUI, сепак, во моментов ова најверојатно само значи дека некому му треба, но не навистина.
  • Модуларност. Skaffold не е самостоен жетвар, туку има за цел да користи поединечни модули или постоечки решенија за специфични задачи.

Илустрација на второто:

  • Во фазата на склопување, можете да користите:
    • docker build локално, во кластер користејќи kaniko или во Google Cloud Build;
    • Базел локално;
    • Jib Maven и Jib Gradle локално или во Google Cloud Build;
    • прилагодените скрипти за градење работат локално. Ако треба да извршите друго (пофлексибилно/попознато/...) решение за изградба, тоа е опишано во скриптата, така што Skaffold го лансира (пример од документација). Ова ви овозможува да користите кој било колектор што може да се повика со помош на скрипта;
  • Во фазата на тестирање, веќе споменатите контејнер-структура-тест;
  • За распоредување се обезбедени следниве:
    • Кубектл;
    • Кочил;
    • приспособете.

Благодарение на ова, Skaffold може да се нарече уникатен рамка за градење CI/CD. Еве пример на работен тек кога го користите (од проектната документација):

Преглед на Skaffold за развој на Kubernetes

Како генерално изгледа делото на Скафолд?

  1. Алатката ги следи промените во директориумот на изворниот код. Ако се направат модификации на датотеките, тие се синхронизираат со подлогата за апликација во кластерот Kubernetes. Ако е можно, без повторно составување на сликата. Во спротивно, се составува нова слика.
  2. Собраната слика се проверува со користење на контејнер-структура-тест, означена и испратена до регистарот на Docker.
  3. По ова, сликата е распоредена - распоредена во кластерот Kubernetes.
  4. Ако лансирањето беше иницијализирано со помош на командата skaffold dev, потоа почнуваме да добиваме логови од апликацијата, а Skaffold чека промени за повторно да ги повтори сите дејства.

Преглед на Skaffold за развој на Kubernetes
Илустрација на главните фази на работењето на Skaffold

Вежбајте. Обидувајќи се на Skaffold

За да ја покажам употребата на Skaffold, ќе земам пример од Складиште на проектот GitHub. Патем, таму Можете да најдете многу други примери кои земаат предвид различни специфики. Сите акции ќе ги извршувам локално во Миникубе. Инсталирањето е едноставно и трае неколку минути, а ќе ви треба 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

Ајде да го клонираме складиштето на Skaffold со потребните примери:

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

Избрав пример со две мешунки, од кои секоја содржи една мала апликација Go. Едната апликација е предниот дел (leeroy-web), кој го пренасочува барањето кон втората апликација - задниот дел (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 код и едноставни Dockerfiles за локално градење на овој код:

~/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 се препраќа на 8080 во Deployment со името leeroy-web.

Време е за лансирање skaffold dev: Тимот ќе создаде тековна „јамка за повратни информации“, т.е. не само што ќе собере сè и ќе го распореди во кластерот, туку ќе ви каже и за состојбата на мешунките во моментот, ќе ги следи промените и ќе ја ажурира состојбата на мешунките.

Еве го резултатот од лансирањето skaffold dev --port-forward при повторно составување:

Преглед на Skaffold за развој на Kubernetes

Прво, можете да видите дека кешот се користи. Следно, апликацијата се составува, се распоредува и портите се препраќаат. Од наведено --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!!!

Во исто време, самиот Skaffold го прикажа истото во конзолата како порано, со исклучок на една точка: само се појави leeroy-app, и не одеднаш.

Повеќе вежбање

Исто така, вреди да се спомене дека при креирање на нов проект, конфигурациите за Skaffold може да се подигнат со помош на командата init, што е многу погодно. Покрај тоа, можете да напишете неколку конфигурации: изведете развој на стандардната конфигурација, а потоа префрлете се на сцена со командата run (ист процес како dev, едноставно не ги следи промените), користејќи друга конфигурација.

На катакода има лидерство Уште полесно е со пример. Но, нуди готов песок со Kubernetes, апликација и Skaffold. Одлична опција ако сте заинтересирани сами да ги испробате основите.

Еден можен случај за употреба на Skaffold е да се спроведе развој на оддалечен кластер. Не секому му е удобно да работи Minikube на свој хардвер, а потоа да ја исфрли апликацијата и да очекува таа да функционира соодветно... Во овој случај, Skaffold го решава проблемот совршено, што може да го потврдат, на пример, инженерите на Reddit, како што имаме веќе разговарано пишува во нашиот блог.

И во оваа публикација од Weaveworks можете да најдете пример за создавање на цевковод за производство.

Заклучок

Skaffold е удобна алатка за изградба на цевководи кои вклучуваат пуштање апликации во Kubernetes и првенствено се фокусирани на развојните потреби. Сосема е лесно да се создаде „краток“ гасовод кој ги зема предвид основните потреби на развивачот, но ако сакате, можете да организирате поголеми процеси. Како еден од јасните примери за користење на Skaffold во процесите на CI/CD се дава како тест проект од 10 микроуслуги кои ги користат можностите на Kubernetes, gRPC, Istio и OpenCensus Tracing.

Skaffold веќе има речиси 8000+ ѕвезди на GitHub, развиен од Google и е дел од GoogleContainerTools — генерално, во моментов постојат сите причини да се верува дека проектот ќе се развива среќно до крајот на краиштата.

PS

Прочитајте и на нашиот блог:

Извор: www.habr.com

Купете доверлив хостинг за сајтови со DDoS заштита, VPS VDS сервери 🔥 Купете сигурен веб-хостинг со DDoS заштита, VPS VDS сервери | ProHoster