
Пред една и пол година, на 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. На Интернет можете да најдете референци за обиди за создавање , сепак, во моментов ова најверојатно само значи дека некому му треба, но не навистина.
- Модуларност. Skaffold не е самостоен жетвар, туку има за цел да користи поединечни модули или постоечки решенија за специфични задачи.
Илустрација на второто:
- Во фазата на склопување, можете да користите:
- docker build локално, во кластер користејќи kaniko или во Google Cloud Build;
- Базел локално;
- Jib Maven и Jib Gradle локално или во Google Cloud Build;
- прилагодените скрипти за градење работат локално. Ако треба да извршите друго (пофлексибилно/попознато/...) решение за изградба, тоа е опишано во скриптата, така што Skaffold го лансира (). Ова ви овозможува да користите кој било колектор што може да се повика со помош на скрипта;
- Во фазата на тестирање, веќе споменатите ;
- За распоредување се обезбедени следниве:
- Кубектл;
- Кочил;
- приспособете.
Благодарение на ова, Skaffold може да се нарече уникатен рамка за градење CI/CD. Еве пример на работен тек кога го користите (од проектната документација):

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

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

Прво, можете да видите дека кешот се користи. Следно, апликацијата се составува, се распоредува и портите се препраќаат. Од наведено --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 и е дел од — генерално, во моментов постојат сите причини да се верува дека проектот ќе се развива среќно до крајот на краиштата.
PS
Прочитајте и на нашиот блог:
- «";
- «";
- «";
- «".
Извор: www.habr.com
