Преглед Скаффолда за развој Кубернетеса

Преглед Скаффолда за развој Кубернетеса

Пре годину и по дана, 5. марта 2018, Гоогле је објавио прву алфа верзију свог Опен Соурце пројекта за ЦИ/ЦД под називом Скаффолд, чији је циљ био стварање „једноставног и поновљивог развоја Кубернетеса“ како би програмери могли да се фокусирају на развој, а не на администрацију. Шта би могло бити занимљиво у вези са Скаффолдом? Како се испоставило, има неколико трикова у рукаву који га могу учинити моћним алатом за програмере, а можда чак и за оперативног инжењера. Хајде да се упознамо са пројектом и његовим могућностима.

NB: Иначе, о Скаффолду смо већ укратко говорили у нашем генералу преглед алата за програмере, чији су животи повезани са Кубернетесом.

Тхеори. Сврха и могућности

Дакле, уопштено говорећи, Скаффолд решава проблем аутоматизације ЦИ/ЦД циклуса (у фазама буилд, пусх, деплои), нудећи програмеру брзе повратне информације, тј. могућност брзог примања резултата накнадних промена кода - у облику ажуриране апликације која ради у Кубернетес кластеру. И може да ради у различитим круговима (дев, стаге, продуцтион...), за шта Скаффолд помаже да опише одговарајуће цевоводе за увођење.

Скаффолдов изворни код је написан у Го, дистрибуира под бесплатном Апацхе лиценцом 2.0 (ГитХуб).

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

  • Скаффолд нуди алате за креирање ЦИ/ЦД цевовода.
  • Омогућава вам да пратите промене у изворном коду у позадини и покренете аутоматизовани процес састављања кода у слике контејнера, објављујући ове слике у Доцкер регистру и постављајући их у Кубернетес кластер.
  • Синхронизује датотеке у спремишту са радним директоријумом у контејнеру.
  • Аутоматски тестира користећи тест структуре контејнера.
  • Проследи портове.
  • Чита евиденције апликације која ради у контејнеру.
  • Помаже у отклањању грешака у апликацијама написаним на Јави, Ноде.јс, Питхон, Го.

Сада о карактеристикама:

  • Сам Скаффолд нема компоненте на страни кластера. Односно, нема потребе да додатно конфигуришете Кубернетес да користи овај услужни програм.
  • Различити цевоводи за вашу апликацију. Да ли треба да уведете код на локални Миникубе док развијате, а затим да га поставите на сцену или у продукцију? За ову сврху постоје профили и корисничке конфигурације, променљиве окружења и ознаке, које вам омогућавају да опишете различите цевоводе за једну апликацију.
  • ПГ. Само конзолни услужни програм и конфигурације у ИАМЛ-у. На Интернету можете пронаћи референце на покушаје стварања експериментални ГУИ, међутим, у овом тренутку то највероватније само значи да је некоме потребан, али не баш.
  • Модуларност. Скаффолд није самостални комбајн, већ настоји да користи појединачне модуле или постојећа решења за специфичне задатке.

Илустрација последњег:

  • У фази монтаже можете користити:
    • доцкер буилд локално, у кластеру који користи канико или у Гоогле Цлоуд Буилд-у;
    • Базел локално;
    • Јиб Мавен и Јиб Градле локално или у Гоогле Цлоуд Буилд-у;
    • прилагођене скрипте за изградњу покрећу се локално. Ако треба да покренете неко друго (флексибилније/познатије/...) решење за прављење, оно је описано у скрипти тако да га Скаффолд покреће (пример из документације). Ово вам омогућава да користите било који колектор који се може позвати помоћу скрипте;
  • У фази тестирања, већ поменути контејнер-структура-тест;
  • За примену је обезбеђено следеће:
    • Кубецтл;
    • Хелм;
    • прилагоди.

Захваљујући томе, Скаффолд се може назвати јединственим оквир за изградњу ЦИ/ЦД. Ево примера тока рада када га користите (из пројектне документације):

Преглед Скаффолда за развој Кубернетеса

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

  1. Услужни програм прати промене у директоријуму изворног кода. Ако се изврше измене датотека, оне се синхронизују са модулом апликације у Кубернетес кластеру. Ако је могуће, без поновног састављања слике. У супротном, саставља се нова слика.
  2. Састављена слика се проверава коришћењем теста структуре контејнера, означава се и шаље у Доцкер регистар.
  3. Након овога, слика се поставља - распоређује у Кубернетес кластер.
  4. Ако је покретање иницијализовано помоћу команде skaffold dev, онда почињемо да примамо дневнике из апликације, а Скаффолд чека промене да би поново поновио све радње.

Преглед Скаффолда за развој Кубернетеса
Илустрација главних фаза операције Скаффолд

Вежбајте. Покушавам Скаффолд

Да бих демонстрирао употребу Скаффолда, узећу пример из ГитХуб спремиште пројекта. Између осталог, тамо Можете пронаћи много других примера који узимају у обзир различите специфичности. Све акције ћу изводити локално у Миникубеу. Инсталација је једноставна и траје неколико минута, а за почетак ће вам требати кубецтл.

Инсталирајте Скаффолд:

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

Изабрао сам пример са две махуне, од којих свака садржи једну малу Го апликацију. Једна апликација је фронтенд (леерои-веб), који преусмерава захтев на другу апликацију - бацкенд (леерои-апп). Да видимо како то изгледа:

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

леерои-апп и леерои-веб садрже Го код и једноставне Доцкер фајлове за локално креирање овог кода:

~/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. Може се уређивати ручно или преко ЦЛИ-а - на пример, овако:

skaffold config set --global local-cluster true

Ова команда ће поставити глобалну променљиву local-cluster у смисао true, након чега Скаффолд неће покушати да гурне слике у удаљени регистар. Ако развијате локално, ову наредбу можете користити за локално прављење слика.

Назад на 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/, тј. наведен је контекст у коме се слика прикупља.
  • У фази имплементације, одређено је да ћемо користити кубецтл и маску за неопходне манифесте.
  • PortForward: слично као што обично прослеђујемо портове користећи kubectl port-forward, дајемо упутства Скаффолду да позове ову команду. У овом случају, локални порт 9000 се прослеђује на 8080 у Деплоимент са именом leeroy-web.

Време је за лансирање skaffold dev: Тим ће креирати сталну „петљу повратних информација“, тј. не само да ће све прикупити и распоредити у кластер, већ ће вам рећи и о тренутном стању подова, пратити промене и ажурирати стање подова.

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

Преглед Скаффолда за развој Кубернетеса

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

Више вежбања

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

На катакоди постоји вођство Са примером је још лакше. Али нуди готов сандбок са Кубернетес-ом, апликацијом и Скаффолд-ом. Одлична опција ако сте заинтересовани да сами испробате саме основе.

Један од могућих случајева употребе Скаффолд-а је спровођење развоја на удаљеном кластеру. Није свима пријатно покренути Миникубе на свом хардверу, затим покренути апликацију и очекивати да она адекватно функционише... У овом случају, Скаффолд савршено решава проблем, што могу потврдити, на пример, Реддит инжењери, као што имамо већ дискутовано писали у нашем блогу.

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

Закључак

Скаффолд је згодан алат за изградњу цевовода који подразумевају пуштање апликација у Кубернетес и првенствено су фокусирани на потребе развоја. Олакшава креирање „кратког“ цевовода који узима у обзир основне потребе програмера, али ако желите, можете организовати веће процесе. Као један од јасних примера коришћења Скаффолда у ЦИ/ЦД процесима се даје такав тест пројекат од 10 микросервиса који користе могућности Кубернетес, гРПЦ, Истио и ОпенЦенсус Трацинг.

Скаффолд већ има скоро 8000+ звезда на ГитХуб-у, развио га је Гоогле и део је ГооглеЦонтаинерТоолс — генерално, у овом тренутку постоје сви разлози да се верује да ће се пројекат срећно развијати.

ПС

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

Извор: ввв.хабр.цом

Додај коментар