Kubernetes өнүктүрүү үчүн Skaffold карап чыгуу

Kubernetes өнүктүрүү үчүн Skaffold карап чыгуу

Бир жарым жыл мурун, 5-жылдын 2018-мартында Google CI/CD үчүн Open Source долбоорунун биринчи альфа версиясын чыгарган. Skaffold, анын максаты иштеп чыгуучулар башкарууга эмес, өнүгүүгө көңүл бурушу үчүн "жөнөкөй жана кайталануучу Kubernetes өнүгүүсүн" түзүү болгон. Skaffold жөнүндө эмне кызыктуу болушу мүмкүн? Көрүнүп тургандай, анын бир нече айла-амалдары бар, алар аны иштеп чыгуучу, балким, операциялык инженер үчүн күчтүү куралга айланта алат. Келгиле, долбоор жана анын мүмкүнчүлүктөрү менен таанышалы.

NB: Баса, биз жалпысынан Скаффолд тууралуу кыскача айтып өттүк иштеп чыгуучу куралдарды карап чыгуу, алардын жашоосу Кубернетес менен байланышкан.

Теория. Максат жана мүмкүнчүлүктөр

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

Skaffold баштапкы коду Go менен жазылган, жайылуу бекер Apache License 2.0 (GitHub) астында.

Келгиле, негизги функцияларын жана өзгөчөлүктөрүн карап көрөлү. Биринчиси төмөнкүлөрдү камтыйт:

  • Skaffold CI/CD түтүктөрүн түзүү үчүн куралдарды сунуш кылат.
  • Фондогу баштапкы коддогу өзгөрүүлөрдү көзөмөлдөөгө жана кодду контейнер сүрөттөрүнө чогултуунун, бул сүрөттөрдү Докер реестрине жарыялоонун жана аларды Kubernetes кластерине жайгаштыруунун автоматташтырылган процессин иштетүүгө мүмкүндүк берет.
  • Репозиторийдеги файлдарды контейнердеги жумушчу каталог менен синхрондоштуруу.
  • 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'те;
    • ыңгайлаштырылган куруу скрипттери жергиликтүү түрдө иштейт. Эгер сиз башка (ийкемдүү/тааныш/...) куруу чечимин иштетишиңиз керек болсо, ал Skaffold аны ишке киргизиши үчүн сценарийде сүрөттөлөт (документациядан мисал). Бул скрипт аркылуу чакыра турган ар кандай коллекторду колдонууга мүмкүндүк берет;
  • Сыноо стадиясында буга чейин айтылган контейнер-структура-сыноо;
  • Жайгаштыруу үчүн төмөнкүлөр каралган:
    • Kubectl;
    • рул;
    • өзгөчөлөштүрүү.

Мунун аркасында Skaffold уникалдуу деп атоого болот CI/CD түзүү үчүн негиз. Бул жерде аны колдонууда иш процессинин мисалы (долбоордук документациядан):

Kubernetes өнүктүрүү үчүн Skaffold карап чыгуу

Скаффолддун иши жалпысынан эмнеге окшош?

  1. Утилита баштапкы код каталогундагы өзгөрүүлөрдү көзөмөлдөйт. Эгерде файлдарга өзгөртүүлөр киргизилсе, алар Kubernetes кластериндеги тиркеме подключкасы менен синхрондолот. Мүмкүн болсо, сүрөттү кайра чогултпай туруп. Болбосо, жаңы сүрөт чогулат.
  2. Чогулган сүрөт контейнер-структура-тесттин жардамы менен текшерилет, белгиленет жана Докер реестрине жөнөтүлөт.
  3. Андан кийин, сүрөт жайгаштырылат - Kubernetes кластеринде жайгаштырылган.
  4. Эгерде ишке киргизүү команда аркылуу инициализацияланган болсо skaffold dev, андан кийин биз тиркемеден журналдарды ала баштайбыз жана Skaffold бардык аракеттерди кайра кайталоо үчүн өзгөртүүлөрдү күтөт.

Kubernetes өнүктүрүү үчүн Skaffold карап чыгуу
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

Келгиле, Скаффолдун репозиторийин керектүү мисалдар менен клондойлу:

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ге жөнөтүлөт 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!!!

Ошол эле учурда, Skaffold өзү консолдо мурункудай эле нерсени көрсөттү, бир жагдайды кошпогондо: ал гана чыкты leeroy-app, жана баары бир эле эмес.

Көбүрөөк практика

Жаңы долбоорду түзүп жатканда, Skaffold үчүн конфигурацияларды буйрукту колдонуу менен жүктөөгө болот. init, бул абдан ыңгайлуу. Мындан тышкары, сиз бир нече конфигурацияларды жаза аласыз: демейки конфигурация боюнча иштеп чыгууну жүргүзүп, андан кийин буйрук менен этапка чыгарыңыз run (ошол эле процесс dev, жөн гана өзгөрүүлөрдү көзөмөлдөбөйт), башка конфигурацияны колдонуу.

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

Skaffold үчүн мүмкүн болгон бир жагдай - алыскы кластерде иштеп чыгуу. Миникубени өз жабдыктарында иштетүү, анан тиркемени чыгаруу жана анын адекваттуу иштешин күтүү ар кимге ыңгайлуу боло бербейт... Бул учурда, Skaffold көйгөйдү эң сонун чечет, муну, мисалы, Reddit инженерлери тастыктай алат. буга чейин талкууланган жазган биздин блогдо.

жана бул китеп Weaveworks компаниясынан сиз өндүрүш үчүн түтүктү түзүүнүн мисалын таба аласыз.

жыйынтыктоо

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

Skaffold буга чейин GitHub'та дээрлик 8000+ жылдызга ээ, Google тарабынан иштелип чыккан жана анын бир бөлүгү болуп саналат. GoogleContainerTools — жалпысынан алганда, учурда долбоор бактылуу өнүгөт деп айтууга толук негиз бар.

PS

Биздин блогдон дагы окуңуз:

Source: www.habr.com

Комментарий кошуу