Баррасии Skaffold барои рушди Kubernetes

Баррасии Skaffold барои рушди Kubernetes

Якуним сол пеш, 5 марти соли 2018, Google версияи аввалини алфа лоиҳаи Open Source CI/CD-и худро бо номи Скаффолд, ки ҳадафи он эҷод кардани "таҳияи оддӣ ва такроршавандаи Kubernetes" буд, то таҳиягарон на ба маъмурият, балки ба рушд тамаркуз кунанд. Дар бораи Skaffold чӣ ҷолиб буда метавонад? Тавре маълум мешавад, он дорои чанд ҳиллаест, ки метавонад онро як абзори пурқувват барои таҳиягар ва шояд ҳатто муҳандиси амалиёт гардонад. Биёед бо лоиха ва имкониятхои он шинос шавем.

NB: Дар омади гап, мо дар бораи Скаффолд дар генерали худ аллакай мухтасар сухан ронда будем баррасии асбобҳои таҳиякунанда, ки хаёти онхо бо Кубернетес алокаманд аст.

Назария. Мақсад ва қобилиятҳо

Ҳамин тавр, дар маҷмӯъ, Skaffold масъалаи автоматикунонии сикли CI/CD-ро ҳал мекунад (дар марҳилаҳои сохтан, тела додан, ҷойгиркунӣ), пешниҳоди фикру мулоҳизаҳои фаврии таҳиякунанда, яъне. қобилияти зуд гирифтани натиҷаи тағироти минбаъдаи код - дар шакли замимаи навшуда, ки дар кластери Kubernetes кор мекунад. Ва он метавонад дар схемаҳои гуногун кор кунад (дев, марҳила, истеҳсолот...), ки барои он Skaffold дар тавсифи қубурҳои мувофиқ барои интиқол кӯмак мекунад.

Рамзи сарчашмаи Skaffold дар Go навишта шудааст, паҳн мекунад таҳти иҷозатномаи ройгони Apache 2.0 (GitHub).

Биёед ба вазифаҳо ва хусусиятҳои асосӣ назар кунем. Дар аввал инҳоянд:

  • Skaffold асбобҳоро барои сохтани қубурҳои CI/CD пешниҳод мекунад.
  • Ба шумо имкон медиҳад, ки тағиротро дар коди ибтидоӣ дар замина назорат кунед ва раванди автоматикунонидашудаи ҷамъ кардани кодро ба тасвирҳои контейнерӣ иҷро кунед, ин тасвирҳоро дар Реестри Docker нашр кунед ва онҳоро дар кластери Kubernetes ҷойгир кунед.
  • Файлҳои дар анбор бударо бо директорияи кории контейнер ҳамоҳанг месозад.
  • Бо истифода аз контейнер-структураи-test ба таври худкор озмоиш мекунад.
  • Портҳои интиқол.
  • Журналҳои барномаеро, ки дар контейнер кор мекунад, мехонад.
  • Дар ислоҳи барномаҳое, ки дар Java, Node.js, Python, Go навишта шудаанд, кӯмак мекунад.

Акнун дар бораи хусусиятҳо:

  • Худи Skaffold ҷузъҳои кластерӣ надорад. Яъне барои истифодаи ин утилита дигар ба танзим даровардани Kubernetes лозим нест.
  • Қубурҳои гуногун барои аризаи шумо. Оё ба шумо лозим аст, ки ҳангоми таҳияи шумо кодро ба Minikube-и маҳаллӣ паҳн кунед ва сипас ба саҳна ё истеҳсолот? Бо ин максад мавчуданд профилҳо ва конфигуратсияҳои корбар, тағирёбандаҳои муҳити зист ва парчамҳо, ки ба шумо имкон медиҳанд, ки қубурҳои гуногунро барои як барнома тавсиф кунед.
  • CLI. Танҳо утилитаи консол ва конфигуратсияҳо дар YAML. Дар Интернет шумо метавонед истинодҳоро ба кӯшишҳои эҷод кардан пайдо кунед GUI таҷрибавӣ, аммо, дар айни замон ин эҳтимоли зиёд маънои онро дорад, ки касе ба ӯ ниёз дорад, аммо на дар ҳақиқат.
  • Модулият. Skaffold як комбайни мустақил нест, балки мекӯшад, ки модулҳои инфиродӣ ё ҳалли мавҷударо барои вазифаҳои мушаххас истифода барад.

Тасвири охирин:

  • Дар марҳилаи васлкунӣ шумо метавонед истифода баред:
    • докер ба таври маҳаллӣ, дар кластер бо истифода аз kaniko ё дар Google Cloud Build;
    • Базел ба таври маҳаллӣ;
    • Jib Maven ва Jib Gradle ба таври маҳаллӣ ё дар Google Cloud Build;
    • скриптҳои сохтани фармоишӣ ба таври маҳаллӣ иҷро мешаванд. Агар ба шумо лозим аст, ки ҳалли дигареро (фасеҳтар/ошно/...) иҷро кунед, он дар скрипт тавсиф шудааст, то Skaffold онро оғоз кунад (мисол аз ҳуҷҷатҳо). Ин ба шумо имкон медиҳад, ки ҳама гуна коллектореро истифода баред, ки онро бо истифода аз скрипт даъват кардан мумкин аст;
  • Дар марҳилаи санҷиш, аллакай зикр контейнер-сохтор-озмоиш;
  • Барои ҷойгиркунӣ инҳо пешбинӣ шудаанд:
    • Kubectl;
    • руль;
    • мутобиқ кардан.

Ба шарофати ин, Skaffold-ро метавон беназир номид чаҳорчӯба барои сохтани CI/CD. Ин аст мисоли ҷараёни корӣ ҳангоми истифодаи он (аз ҳуҷҷатҳои лоиҳа):

Баррасии Skaffold барои рушди Kubernetes

Кори Скаффолд умуман ба чй монанд аст?

  1. Утилита тағиротро дар феҳристи коди сарчашма назорат мекунад. Агар ба файлҳо тағирот ворид карда шаванд, онҳо бо поди барнома дар кластери Kubernetes ҳамоҳанг карда мешаванд. Агар имконпазир бошад, бе аз нав васл кардани тасвир. Дар акси ҳол, тасвири нав ҷамъ карда мешавад.
  2. Тасвири ҷамъшуда бо истифода аз container-structure-test тафтиш карда мешавад, барчасп карда мешавад ва ба Реестри Docker фиристода мешавад.
  3. Пас аз ин, тасвир ҷойгир карда мешавад - дар кластери Kubernetes ҷойгир карда мешавад.
  4. Агар оғозкунӣ бо истифода аз фармон оғоз карда шуда бошад skaffold dev, пас мо қабули гузоришҳоро аз барнома оғоз мекунем ва Skaffold мунтазири тағирот барои такрори ҳамаи амалҳо аст.

Баррасии Skaffold барои рушди Kubernetes
Тасвири марҳилаҳои асосии амалиёти Skaffold

Амал кунед. Кӯшиши 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 дорад. Яке аз барномаҳо frontend (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 ба 8080 дар Ҷойгиркунӣ бо ном фиристода мешавад leeroy-web.

Вақти оғоз кардан аст skaffold dev: Даста як «халқаи бозгашт»-и давомдорро эҷод мекунад, яъне. он на танҳо ҳама чизро ҷамъ мекунад ва онро дар кластер ҷойгир мекунад, балки инчунин ба шумо дар бораи ҳолати қаҳвахонаҳо дар айни замон нақл мекунад, тағиротро назорат мекунад ва ҳолати pods навсозӣ мекунад.

Дар ин ҷо натиҷаи оғози кор аст 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!!!

Дар айни замон, худи Скаффолд дар консол ҳамон чизеро, ки қаблан буд, намоиш дод, ба истиснои як нукта: он танҳо паҳн шуд leeroy-app, ва на ҳама якбора.

Амалияи бештар

Инчунин бояд қайд кард, ки ҳангоми сохтани лоиҳаи нав конфигуратсияҳоро барои Skaffold бо истифода аз фармон пурбор кардан мумкин аст. init, ки хеле қулай аст. Илова бар ин, шумо метавонед якчанд конфигуратсия нависед: коркардро аз рӯи конфигуратсияи пешфарз анҷом диҳед ва сипас бо фармон ба марҳила гузаред. run (ҳамон раванд ҳамчун dev, танҳо тағиротро назорат намекунад), бо истифода аз конфигуратсияи дигар.

Дар катакода вуҷуд дорад роҳнамо Бо як мисол боз ҳам осонтар аст. Аммо он қуттии тайёрро бо Kubernetes, барнома ва Skaffold пешниҳод мекунад. Варианти олӣ, агар шумо ба худатон кӯшиш кардан мехоҳед.

Як ҳолати имконпазири истифода барои Skaffold ин гузаронидани таҳия дар кластери дурдаст мебошад. На ҳама бароҳатанд, ки Minikube-ро дар сахтафзори худ идора кунанд, пас барномаро паҳн кунанд ва интизор шаванд, ки он ба таври кофӣ кор кунад... Дар ин ҳолат, Скаффолд мушкилотро ба таври комил ҳал мекунад, ки онро масалан, муҳандисони Reddit тасдиқ мекунанд, тавре ки мо дорем аллакай мухокима карда шуд навиштааст дар блоги мо.

Ва дар ин нашрия аз Weaveworks шумо мисоли сохтани трубопроводро барои истехсолот ёфта метавонед.

хулоса

Skaffold як воситаи қулай барои сохтани қубурҳо мебошад, ки паҳн кардани барномаҳоро ба Kubernetes дар бар мегирад ва асосан ба ниёзҳои рушд нигаронида шудааст. Ин эҷоди як лӯлаи "кӯтоҳ", ки эҳтиёҷоти асосии таҳиягарро ба инобат мегирад, хеле осон мекунад, аммо агар хоҳед, шумо метавонед равандҳои калонтарро ташкил кунед. Ҳамчун яке аз мисолҳои равшани истифодаи Skaffold дар равандҳои CI/CD дода мешавад чунин лоиҳаи санҷишӣ аз 10 хидматрасонии хурд бо истифода аз имкониятҳои Kubernetes, gRPC, Istio ва OpenCensus Tracing.

Skaffold аллакай дар GitHub тақрибан 8000+ ситора дорад, ки аз ҷониби Google таҳия шудааст ва як қисми он мебошад GoogleContainerTools — умуман, дар айни замон тамоми асосхо мав-чуданд, ки чунин бовар кунем, ки лои-ха ба таври бояду шояд инкишоф меёбад.

PS

Инчунин дар блоги мо хонед:

Манбаъ: will.com

Илова Эзоҳ