Kubernetes әзірлеу үшін Skaffold шолуы

Kubernetes әзірлеу үшін Skaffold шолуы

Бір жарым жыл бұрын, 5 жылдың 2018 наурызында Google CI/CD үшін ашық бастапқы жобасының бірінші альфа нұсқасын шығарды. Скаффолд, оның мақсаты әзірлеушілер басқаруға емес, дамуға назар аударуы үшін «қарапайым және қайталанатын Kubernetes әзірлеуін» жасау болды. Skaffold туралы не қызықты болуы мүмкін? Белгілі болғандай, оны әзірлеушіге, тіпті операциялық инженерге де қуатты құрал ете алатын бірнеше айла бар. Жобамен және оның мүмкіндіктерімен танысайық.

NB: Айтпақшы, біз генералымызда Скаффолд туралы қысқаша айтқан болатынбыз әзірлеуші ​​құралдарын шолу, олардың өмірі Кубернетеспен байланысты.

Теория. Мақсаты мен мүмкіндіктері

Сонымен, жалпы айтқанда, Skaffold CI/CD циклін автоматтандыру мәселесін шешеді (құрастыру, басу, орналастыру кезеңдерінде), әзірлеушіге жедел кері байланыс ұсынады, яғни. кейінгі код өзгерістерінің нәтижесін жылдам алу мүмкіндігі - Kubernetes кластерінде жұмыс істейтін жаңартылған қолданба түрінде. Және ол әртүрлі тізбектерде жұмыс істей алады (әзірлеу, кезең, өндіріс...), ол үшін Skaffold шығару үшін сәйкес құбырларды сипаттауға көмектеседі.

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

Негізгі функциялары мен мүмкіндіктерін қарастырайық. Біріншісіне мыналар жатады:

  • Skaffold CI/CD құбыржолдарын жасауға арналған құралдарды ұсынады.
  • Фондағы бастапқы кодтағы өзгерістерді бақылауға және кодты контейнерлік кескіндерге жинаудың, бұл кескіндерді Docker тізілімінде жариялаудың және оларды Kubernetes кластеріне орналастырудың автоматтандырылған процесін іске қосуға мүмкіндік береді.
  • Репозиторийдегі файлдарды контейнердегі жұмыс каталогымен синхрондайды.
  • Container-structure-test арқылы автоматты түрде сыналады.
  • Форвардтар.
  • Контейнерде жұмыс істейтін қолданбаның журналдарын оқиды.
  • Java, Node.js, Python, Go тілдерінде жазылған қолданбаларды жөндеуге көмектеседі.

Енді мүмкіндіктер туралы:

  • Skaffold өзінде кластерлік құрамдас бөліктер жоқ. Яғни, бұл қызметтік бағдарламаны пайдалану үшін Kubernetes қосымшасын конфигурациялаудың қажеті жоқ.
  • Қолданбаңызға арналған әртүрлі құбырлар. Сізге кодты әзірлеу кезінде жергілікті Minikube-ге, содан кейін сахнаға немесе өндіріске шығару керек пе? Осы мақсатта бар Профиль және бір қолданба үшін әртүрлі конфигурацияларды сипаттауға мүмкіндік беретін пайдаланушы конфигурациялары, орта айнымалылары және жалаушалары.
  • CLI. YAML ішіндегі тек консольдік утилита мен конфигурациялар. Интернетте сіз жасау әрекеттеріне сілтеме таба аласыз эксперименттік GUI, дегенмен, қазіргі уақытта бұл біреуге оның қажет екенін білдіреді, бірақ шын мәнінде емес.
  • Модульдік. Skaffold дербес комбайн емес, бірақ нақты тапсырмалар үшін жеке модульдерді немесе бар шешімдерді пайдалануға ұмтылады.

Соңғысының иллюстрациясы:

  • Құрастыру кезеңінде сіз мыналарды пайдалана аласыз:
    • докерді жергілікті түрде, kaniko көмегімен кластерде немесе Google Cloud Build жүйесінде құрастыру;
    • Bazel жергілікті;
    • Jib Maven және Jib Gradle жергілікті немесе Google Cloud Build жүйесінде;
    • пайдаланушы құрастыру сценарийлері жергілікті түрде іске қосылады. Егер сізге басқа (икемді/таныс/...) құрастыру шешімін іске қосу қажет болса, ол Skaffold оны іске қосатындай сценарийде сипатталған (құжаттамадан мысал). Бұл сценарий арқылы шақыруға болатын кез келген коллекторды пайдалануға мүмкіндік береді;
  • Тестілеу кезеңінде қазірдің өзінде айтылған контейнер-құрылым-сынау;
  • Орналастыру үшін мыналар қарастырылған:
    • Kubectl;
    • руль;
    • теңшеу.

Осының арқасында Skaffold бірегей деп атауға болады CI/CD құру үшін негіз. Міне, оны пайдалану кезінде жұмыс үрдісінің мысалы (жоба құжаттамасынан):

Kubernetes әзірлеу үшін Skaffold шолуы

Скаффолдтың жұмысы жалпы алғанда қалай көрінеді?

  1. Утилита бастапқы код каталогындағы өзгерістерді бақылайды. Егер файлдарға өзгертулер енгізілсе, олар Kubernetes кластеріндегі қолданбалар қондырмасымен синхрондалады. Мүмкін болса, кескінді қайта құрастырмай. Әйтпесе, жаңа сурет жиналады.
  2. Жиналған кескін контейнер-структура-сынағы арқылы тексеріліп, белгіленіп, Docker тізіліміне жіберіледі.
  3. Осыдан кейін кескін орналастырылады - Kubernetes кластерінде орналастырылады.
  4. Егер іске қосу пәрмен арқылы инициализацияланған болса skaffold dev, содан кейін біз қолданбадан журналдарды қабылдай бастаймыз және Skaffold барлық әрекеттерді қайталау үшін өзгерістерді күтеді.

Kubernetes әзірлеу үшін Skaffold шолуы
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 қолданбасы бар екі бөлімшесі бар мысалды таңдадым. Бір қолданба сұранысты екінші қолданбаға - бэкендке (leeroy-app) қайта бағыттайтын фронтендік (leeroy-web) болып табылады. Оның қалай көрінетінін көрейік:

~/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 қолданбаға жылдам қол жеткізу үшін оны өзімізге жібереміз.

Lo Bar Bar G Barlo G Glo G G G G G G Bar G Bir G G G G Glo G Birlo G Bir G G Bir G G Bar G Glo G G Glo G Glo Glo G G G G Bir G G G G G G G G G G G G G G G G 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, Skaffold портты келесіге жіберді 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-ке қосымшаларды шығаруды қамтитын және ең алдымен әзірлеу қажеттіліктеріне бағытталған құбырларды салуға арналған ыңғайлы құрал. Бұл әзірлеушінің негізгі қажеттіліктерін ескеретін «қысқа» құбырды құруды жеңілдетеді, бірақ қажет болса, үлкенірек процестерді ұйымдастыруға болады. CI/CD процестерінде Skaffold пайдаланудың айқын мысалдарының бірі ретінде беріледі мұндай сынақ жобасы Kubernetes, gRPC, Istio және OpenCensus Tracing мүмкіндіктерін пайдаланатын 10 микросервис.

Skaffold қазірдің өзінде GitHub сайтында 8000-нан астам жұлдызға ие, оны Google әзірлеген және оның бөлігі болып табылады. GoogleContainerTools — жалпы алғанда, қазіргі уақытта жоба бақытты түрде дамиды деуге толық негіз бар.

PS

Біздің блогта да оқыңыз:

Ақпарат көзі: www.habr.com

пікір қалдыру