Skaffold-ի վերանայում Kubernetes-ի զարգացման համար

Skaffold-ի վերանայում Kubernetes-ի զարգացման համար

Մեկուկես տարի առաջ՝ 5 թվականի մարտի 2018-ին, Google-ը թողարկեց իր բաց կոդով նախագծի առաջին ալֆա տարբերակը CI/CD-ի համար, որը կոչվում էր. Սկավառակ, որի նպատակն էր ստեղծել «պարզ և կրկնվող Kubernetes զարգացում», որպեսզի մշակողները կարողանան կենտրոնանալ զարգացման վրա, այլ ոչ թե կառավարման: Ի՞նչը կարող է հետաքրքիր լինել Skaffold-ի մասին: Ինչպես պարզվում է, մի քանի հնարքներ ունի իր թեւը, որը կարող է այն դարձնել ուժեղ գործիք մշակողի համար, եւ գուցե նույնիսկ գործողությունների ինժեները: Եկեք ծանոթանանք նախագծին եւ դրա հնարավորություններին:

NBԻ դեպ, Սքաֆոլդի մասին մենք արդեն համառոտ խոսել ենք մեր ընդհանուր առմամբ մշակողի գործիքների վերանայում, ում կյանքը կապված է Կուբերնետեսի հետ։

Տեսություն. Նպատակը եւ հնարավորությունները

Այսպիսով, ընդհանուր առմամբ, Skaffold-ը լուծում է CI/CD ցիկլի ավտոմատացման խնդիրը (կառուցման, մղման, տեղակայման փուլերում)՝ առաջարկելով ծրագրավորողին արագ արձագանք, այսինքն. կոդերի հետագա փոփոխությունների արդյունքը արագ ստանալու ունակությունը `Kubernetes կլաստերում աշխատող թարմացված հավելվածի տեսքով: Եվ այն կարող է աշխատել տարբեր սխեմաներում (dev, stage, production...), որոնց համար Skaffold-ն օգնում է նկարագրել համապատասխան խողովակաշարերը՝ թողարկման համար:

Skaffold-ի սկզբնական կոդը գրված է Go-ում, տարածվում է անվճար Apache License 2.0 (GitHub) համաձայն:

Եկեք նայենք հիմնական գործառույթներին և առանձնահատկություններին: Առաջինը ներառում է հետևյալը.

  • Skaffold-ն առաջարկում է CI/CD խողովակաշարեր ստեղծելու գործիքներ:
  • Թույլ է տալիս հետևել սկզբնաղբյուրի փոփոխություններին հետին պլանում և գործարկել կոդի հավաքման ավտոմատացված գործընթաց կոնտեյների պատկերների մեջ՝ հրապարակելով այս պատկերները Docker Registry-ում և տեղակայելով դրանք Kubernetes կլաստերում:
  • Համաժամացնում է պահեստի ֆայլերը կոնտեյների աշխատանքային գրացուցակի հետ:
  • Ավտոմատ փորձարկումներ՝ օգտագործելով կոնտեյներ-կառուցվածք-թեստ:
  • Փոխանցման նավահանգիստներ.
  • Կարդում է կոնտեյներով աշխատող հավելվածի տեղեկամատյանները:
  • Օգնում է վրիպազերծել 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-ը կարելի է անվանել եզակի CI/CD կառուցելու շրջանակ. Ահա աշխատանքային հոսքի օրինակ՝ այն օգտագործելիս (նախագծային փաստաթղթերից).

Skaffold-ի վերանայում Kubernetes-ի զարգացման համար

Ինչպիսի՞ն է Սքաֆոլդի աշխատանքը ընդհանուր առումներով:

  1. Կոմունալը վերահսկում է սկզբնական կոդի գրացուցակի փոփոխությունները: Եթե ​​ֆայլերում փոփոխություններ են կատարվում, դրանք համաժամացվում են Kubernetes կլաստերի հավելվածի հետ: Հնարավորության դեպքում, առանց պատկերը նորից հավաքելու: Հակառակ դեպքում հավաքվում է նոր պատկեր։
  2. Հավաքված պատկերը ստուգվում է կոնտեյներ-structure-test-ի միջոցով, հատկորոշվում և ուղարկվում Docker Registry:
  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

Եկեք կլոնավորենք Skaffold-ի պահեստը անհրաժեշտ օրինակներով.

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 կոդ և պարզ 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 վերահավաքելիս.

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!!!

Միեւնույն ժամանակ, Skaffold- ն ինքնին նույն բանը ցուցադրեց վահանակում, ինչպես նախկինում, բացառությամբ մեկ կետի. Այն միայն դուրս եկավ leeroy-app, և ոչ միանգամից։

Ավելի շատ պրակտիկա

Հարկ է նաև նշել, որ նոր նախագիծ ստեղծելիս Skaffold-ի կոնֆիգուրացիաները կարող են բեռնաթափվել՝ օգտագործելով հրամանը. init, որը շատ հարմար է։ Բացի այդ, դուք կարող եք գրել մի քանի կոնֆիգուրներ. իրականացնել մշակում լռելյայն կազմաձևի վրա, այնուհետև հրամանի միջոցով դուրս գալ փուլ: run (նույն գործընթացը, ինչ dev, պարզապես չի վերահսկում փոփոխությունները), օգտագործելով այլ կազմաձև:

Կատակոդայի վրա կա ղեկավարությունը Օրինակով ավելի հեշտ է. Բայց այն առաջարկում է պատրաստի ավազատուփ Kubernetes-ով, հավելվածով և Skaffold-ով։ Հիանալի տարբերակ, եթե դուք հետաքրքրված եք ինքներդ փորձելով հենց հիմունքները:

Skafffold- ի համար հնարավոր գործը հեռակառավարվող կլաստերի վրա զարգացում է իրականացնում: Բոլորին չէ, որ հարմար է Minikube-ն աշխատեցնել սեփական ապարատով, այնուհետև տեղադրել հավելվածը և ակնկալել, որ այն կգործի համարժեք... Այս դեպքում Skaffold-ը հիանալի լուծում է խնդիրը, ինչը կարող են հաստատել, օրինակ, Reddit-ի ինժեներները, ինչպես մենք ունենք: արդեն քննարկվել է писали մեր բլոգում։

Եվ այս հրապարակումը Weaveworks-ից կարող եք գտնել արտադրության համար խողովակաշար ստեղծելու օրինակ:

Ամփոփում

Skaffold-ը հարմար գործիք է խողովակաշարերի կառուցման համար, որոնք ներառում են հավելվածներ Kubernetes-ում և հիմնականում կենտրոնացած են զարգացման կարիքների վրա: Դա բավականին հեշտացնում է «կարճ» խողովակաշարի ստեղծումը, որը հաշվի է առնում մշակողի հիմնական կարիքները, բայց ցանկության դեպքում կարող եք ավելի մեծ գործընթացներ կազմակերպել: Որպես CI / CD գործընթացներում skaffold- ի օգտագործման հստակ օրինակներից մեկը տրված է այդպիսի թեստային նախագիծ 10 միկրոծառայություններ՝ օգտագործելով Kubernetes, gRPC, Istio և OpenCensus Tracing-ի հնարավորությունները:

Skaffold-ն արդեն ունի գրեթե 8000+ աստղ GitHub-ում, մշակված է Google-ի կողմից և մաս է կազմում GoogleContainerTools - Ընդհանուր առմամբ, այս պահին կա բոլոր պատճառները հավատալու, որ նախագիծը երբեւէ կզարգանա երջանիկ:

PS

Կարդացեք նաև մեր բլոգում.

Source: www.habr.com

Добавить комментарий