Kubernetes inkişafı üçün Skaffoldun nəzərdən keçirilməsi

Kubernetes inkişafı üçün Skaffoldun nəzərdən keçirilməsi

Bir il yarım əvvəl, 5 mart 2018-ci ildə Google, CI/CD üçün Açıq Mənbə layihəsinin ilk alfa versiyasını buraxdı. Skaffold, məqsədi "sadə və təkrarlana bilən Kubernetes inkişafı" yaratmaq idi ki, tərtibatçılar idarəetmədən çox inkişafa diqqət yetirə bilsinlər. Skaffold haqqında nə maraqlı ola bilər? Göründüyü kimi, onu tərtibatçı və bəlkə də əməliyyat mühəndisi üçün güclü bir alət edə biləcək bir neçə hiylə var. Layihə və onun imkanları ilə tanış olaq.

NB: Yeri gəlmişkən, biz ümumimizdə Skaffold haqqında qısaca danışdıq developer alətlərinin nəzərdən keçirilməsi, həyatı Kubernetes ilə bağlıdır.

Nəzəriyyə. Məqsəd və imkanlar

Beləliklə, ümumiyyətlə desək, Skaffold CI/CD dövrünün avtomatlaşdırılması problemini həll edir (qurma, təkan, yerləşdirmə mərhələlərində), tərtibatçıya operativ rəy təklif edir, yəni. sonrakı kod dəyişikliklərinin nəticəsini tez bir zamanda almaq imkanı - Kubernetes klasterində işləyən yenilənmiş proqram şəklində. Və o, müxtəlif sxemlərdə (inkişaf, mərhələ, istehsal...) işləyə bilər ki, bunun üçün Skaffold işə salınması üçün müvafiq boru kəmərlərini təsvir etməyə kömək edir.

Skaffoldun mənbə kodu Go-da yazılmışdır, yayılır pulsuz Apache Lisenziyası 2.0 (GitHub) altında.

Əsas funksiyalara və xüsusiyyətlərə baxaq. Birinciyə aşağıdakılar daxildir:

  • Skaffold CI/CD boru kəmərləri yaratmaq üçün alətlər təklif edir.
  • Mənbə kodundakı dəyişiklikləri fonda izləməyə və kodu konteyner şəkillərinə yığmaq, bu şəkilləri Docker Reyestrində dərc etmək və Kubernetes klasterinə yerləşdirmək üçün avtomatlaşdırılmış prosesi icra etməyə imkan verir.
  • Anbardakı faylları konteynerdəki iş kataloqu ilə sinxronlaşdırır.
  • Konteyner-struktur-testindən istifadə edərək avtomatik sınaqlar.
  • İrəli portlar.
  • Konteynerdə işləyən tətbiqin qeydlərini oxuyur.
  • Java, Node.js, Python, Go-da yazılmış proqramların sazlanmasına kömək edir.

İndi xüsusiyyətlər haqqında:

  • Skaffoldun özündə çoxluq tərəfi komponentləri yoxdur. Yəni, bu yardım proqramından istifadə etmək üçün Kubernetes-i əlavə konfiqurasiya etməyə ehtiyac yoxdur.
  • Tətbiqiniz üçün müxtəlif boru kəmərləri. Siz inkişaf etdirərkən kodu yerli Minikube-yə, sonra səhnəyə və ya istehsala yaymalısınız? Bu məqsədlə var Profil və istifadəçi konfiqurasiyaları, mühit dəyişənləri və bir proqram üçün müxtəlif boru kəmərlərini təsvir etməyə imkan verən bayraqlar.
  • CLI. Yalnız YAML-də konsol yardım proqramı və konfiqurasiyalar. İnternetdə yaratmaq cəhdlərinə istinadlar tapa bilərsiniz eksperimental GUI, lakin, hazırda bu, çox güman ki, kiminsə ona ehtiyacı olduğunu bildirir, amma əslində deyil.
  • Modulluq. Skaffold müstəqil kombayn deyil, lakin xüsusi tapşırıqlar üçün fərdi modullardan və ya mövcud həllərdən istifadə etməyə çalışır.

Sonuncunun təsviri:

  • Montaj mərhələsində istifadə edə bilərsiniz:
    • docker yerli olaraq, kaniko istifadə edərək klasterdə və ya Google Cloud Build-də qurur;
    • Bazel yerli;
    • Jib Maven və Jib Gradle yerli və ya Google Cloud Build-də;
    • xüsusi qurma skriptləri yerli olaraq işləyir. Başqa (daha çevik/tanış/...) qurma həllini işə salmaq lazımdırsa, o, skriptdə təsvir edilmişdir ki, Skaffold onu işə salsın (sənədlərdən nümunə). Bu, bir skriptdən istifadə edərək çağırıla bilən hər hansı bir kollektordan istifadə etməyə imkan verir;
  • Test mərhələsində artıq qeyd olunanlar konteyner-struktur-sınaq;
  • Yerləşdirmə üçün aşağıdakılar təmin edilir:
    • Kubectl;
    • sükan;
    • özəlləşdirmək.

Bunun sayəsində Skaffoldu unikal adlandırmaq olar CI/CD qurmaq üçün çərçivə. Onu istifadə edərkən bir nümunə iş axını (layihə sənədlərindən):

Kubernetes inkişafı üçün Skaffoldun nəzərdən keçirilməsi

Skaffoldun işi ümumi mənada necə görünür?

  1. Utilit mənbə kodu kataloqunda dəyişiklikləri izləyir. Fayllara dəyişikliklər edilərsə, onlar Kubernetes klasterindəki proqram podu ilə sinxronlaşdırılır. Mümkünsə, şəkli yenidən yığmadan. Əks halda, yeni bir şəkil yığılır.
  2. Yığılmış şəkil konteyner strukturu testindən istifadə edərək yoxlanılır, etiketlənir və Docker Registry-ə göndərilir.
  3. Bundan sonra şəkil yerləşdirilir - Kubernetes klasterində yerləşdirilir.
  4. Əgər işə salma əmri ilə işə salınıbsa skaffold dev, sonra biz proqramdan logları almağa başlayırıq və Skaffold bütün hərəkətləri yenidən təkrarlamaq üçün dəyişiklikləri gözləyir.

Kubernetes inkişafı üçün Skaffoldun nəzərdən keçirilməsi
Skaffold əməliyyatının əsas mərhələlərinin təsviri

Təcrübə edin. Skaffold sınanır

Skaffold istifadəsini nümayiş etdirmək üçün mən bir nümunə götürəcəyəm GitHub layihə deposu... Yeri gəlmişkən, eyni yerdə Müxtəlif xüsusiyyətləri nəzərə alan bir çox başqa nümunə tapa bilərsiniz. Bütün hərəkətləri yerli olaraq Minikube-də yerinə yetirəcəyəm. Quraşdırma sadədir və bir neçə dəqiqə çəkir və başlamaq üçün sizə kubectl lazımdır.

Skaffold quraşdırın:

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

Skaffoldun anbarını lazımi nümunələrlə klonlayaq:

git clone https://github.com/GoogleContainerTools/skaffold
cd skaffold/examples/microservices

Hər birində bir kiçik Go tətbiqi olan iki poddan ibarət nümunə seçdim. Tətbiqlərdən biri sorğunu ikinci proqrama - arxa tərəfə (leeroy-app) yönləndirən frontenddir (leeroy-web). Gəlin görək nə kimi görünür:

~/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 və leeroy-web bu kodu yerli olaraq qurmaq üçün Go kodu və sadə Dockerfiles ehtiva edir:

~/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 .

Tətbiq kodunu verməyəcəyəm - bunu bilmək kifayətdir leeroy-web sorğuları qəbul edir və onlara etibarnamə verir leeroy-app. Buna görə də fayllarda Deployment.yaml yalnız bir xidmət var app (daxili marşrutlaşdırma üçün). Pod portu web proqrama tez daxil olmaq üçün onu özümüzə yönləndirəcəyik.

Nə bənzəyir 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

Yuxarıda göstərilən bütün mərhələlər burada təsvir edilmişdir. Bu konfiqurasiyaya əlavə olaraq qlobal parametrləri olan bir fayl da var - ~/.skaffold/config. O, əl ilə və ya CLI vasitəsilə redaktə edilə bilər - məsələn, bu kimi:

skaffold config set --global local-cluster true

Bu əmr qlobal dəyişəni təyin edəcək local-cluster mənaya keçir true, bundan sonra Skaffold şəkilləri uzaq reyestrə köçürməyə çalışmayacaq. Yerli olaraq inkişaf edirsinizsə, bu əmrdən istifadə edərək şəkilləri yerli olaraq yarada bilərsiniz.

Geriyə skaffold.yaml:

  • Səhnədə build təsviri yerli olaraq toplamalı və yadda saxlamağınız lazım olduğunu qeyd edirik. Quraşdırma ilk dəfə işlədikdən sonra aşağıdakıları görəcəyik:
    // т.к. 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

    Gördüyünüz kimi, Skaffold şəkilləri özü etiketləyib. Yeri gəlmişkən, bir neçə etiketləmə siyasəti dəstəklənir.

  • Daha sonra konfiqurasiyada göstərilir context: ./leeroy-app/, yəni. təsvirin toplandığı kontekst müəyyən edilir.
  • Yerləşdirmə mərhələsində kubectl və zəruri manifestlər üçün maskadan istifadə edəcəyimiz müəyyən edilmişdir.
  • PortForward: istifadə edərək adətən portları necə yönləndirdiyimizə bənzəyir kubectl port-forward, biz Skaffold-a bu əmri çağırmaq üçün göstərişlər veririk. Bu halda, yerli port 9000 adı ilə Yerləşdirmədə 8080-ə yönləndirilir. leeroy-web.

Başlamaq vaxtıdır skaffold dev: Komanda davam edən “geri əlaqə dövrəsi” yaradacaq, yəni. o, nəinki hər şeyi toplayacaq və onu klasterə yerləşdirəcək, həm də sizə hazırda podların vəziyyəti haqqında məlumat verəcək, dəyişikliklərə nəzarət edəcək və podların vəziyyətini yeniləyəcək.

Budur işə salınma nəticəsi skaffold dev --port-forward yenidən yığarkən:

Kubernetes inkişafı üçün Skaffoldun nəzərdən keçirilməsi

Birincisi, önbelleğin istifadə edildiyini görə bilərsiniz. Sonra proqram yığılır, yerləşdirilir və portlar yönləndirilir. Müəyyən edildiyindən --port-forward, Skaffold limanı yönləndirdi web, ondan soruşulduğu kimi, amma burada app öz mülahizəsinə görə atdı (ən yaxın pulsuz olanı seçdi). Bundan sonra tətbiqlərdən ilk qeydləri alırıq.

Gəlin yoxlayaq ki, işləyirmi?

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

Faylın dəyişdirilməsi leeroy-app/app.go - bir neçə saniyə keçir... və:

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

Eyni zamanda, Skaffold özü konsolda əvvəlki kimi eyni şeyi göstərdi, bir məqam istisna olmaqla: yalnız yayıldı leeroy-app, və hamısı birdən deyil.

Daha çox təcrübə

Həm də qeyd etmək lazımdır ki, yeni bir layihə yaratarkən, Skaffold üçün konfiqurasiyalar əmrdən istifadə edərək yüklənə bilər. init, bu çox rahatdır. Bundan əlavə, siz bir neçə konfiqurasiya yaza bilərsiniz: standart konfiqurasiyada inkişafı həyata keçirin və sonra komanda ilə mərhələyə keçin. run (eyni proses dev, sadəcə dəyişikliklərə nəzarət etmir), fərqli konfiqurasiyadan istifadə etməklə.

Katakoda var bələdçi Bir nümunə ilə daha asandır. Lakin o, Kubernetes, proqram və Skaffold ilə hazır sandbox təklif edir. Əsasları özünüz sınamaqda maraqlısınızsa, əla seçimdir.

Skaffold üçün mümkün istifadə hallarından biri uzaq klasterdə inkişaf etdirməkdir. Hər kəs Minikube-ni öz avadanlığı ilə idarə etmək, sonra tətbiqi yaymaq və onun adekvat işləməsini gözləmək rahat deyil... Bu halda, Skaffold problemi mükəmməl həll edir, məsələn, Reddit mühəndisləri tərəfindən təsdiqlənə bilər, bizdə olduğu kimi. artıq müzakirə olunub писали blogumuzda.

bu nəşrin Weaveworks-dən istehsal üçün boru kəmərinin yaradılması nümunəsini tapa bilərsiniz.

Nəticə

Skaffold, tətbiqlərin Kubernetes-ə yayılmasını əhatə edən və ilk növbədə inkişaf ehtiyaclarına yönəlmiş boru kəmərlərinin tikintisi üçün əlverişli vasitədir. Tərtibatçının əsas ehtiyaclarını nəzərə alan "qısa" bir boru kəməri yaratmağı olduqca asanlaşdırır, lakin istəsəniz, daha böyük proseslər təşkil edə bilərsiniz. CI/CD proseslərində Skaffold istifadəsinin bariz nümunələrindən biri kimi bəxş edilmiş belə sınaq layihəsi Kubernetes, gRPC, Istio və OpenCensus Tracing imkanlarından istifadə edən 10 mikroservis.

Skaffold artıq GitHub-da 8000-dən çox ulduza malikdir, Google tərəfindən hazırlanmışdır və bir hissəsidir. GoogleContainerTools — Ümumiyyətlə, hazırda layihənin bundan sonra da xoşbəxt inkişaf edəcəyinə inanmaq üçün hər cür əsas var.

PS

Bloqumuzda da oxuyun:

Mənbə: www.habr.com

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