Kubernetes geliştirme için Skaffold'un incelenmesi

Kubernetes geliştirme için Skaffold'un incelenmesi

Bir buçuk yıl önce, 5 Mart 2018'de Google, Açık Kaynak CI/CD projesinin ilk alfa sürümünü yayınladı. iskeleAmacı, geliştiricilerin yönetimden ziyade geliştirmeye odaklanabilmesi için "basit ve tekrarlanabilir Kubernetes gelişimi" yaratmaktı. Skaffold'la ilgili ilginç ne olabilir? Görünüşe göre onu geliştirici ve hatta operasyon mühendisi için güçlü bir araç haline getirebilecek birkaç püf noktası var. Projeyi ve yeteneklerini tanıyalım.

NB: Bu arada genel yazımızda Skaffold'dan kısaca bahsetmiştik. geliştirici araçlarının gözden geçirilmesihayatları Kubernetes'e bağlı.

Teori. Amaç ve yetenekler

Genel olarak konuşursak Skaffold, geliştiriciye hızlı geri bildirim sunarak CI/CD döngüsünü (derleme, aktarma, dağıtma aşamalarında) otomatikleştirme sorununu çözer; Kubernetes kümesinde çalışan güncellenmiş bir uygulama biçiminde sonraki kod değişikliklerinin sonucunu hızlı bir şekilde alma yeteneği. Ayrıca farklı devrelerde (geliştirme, aşama, üretim...) çalışabilir ve Skaffold, kullanıma yönelik ilgili boru hatlarını tanımlamaya yardımcı olur.

Skaffold'un kaynak kodu Go'da yazılmıştır. tarafından dağıtıldı ücretsiz Apache Lisansı 2.0 (GitHub) kapsamında.

Ana işlevlere ve özelliklere bakalım. İlki aşağıdakileri içerir:

  • Skaffold, CI/CD işlem hatları oluşturmaya yönelik araçlar sunar.
  • Arka planda kaynak kodundaki değişiklikleri izlemenize ve kodu konteyner görüntülerine birleştirme, bu görüntüleri Docker Kayıt Defterinde yayınlama ve bunları Kubernetes kümesine dağıtma konusunda otomatik bir işlem yürütmenize olanak tanır.
  • Depodaki dosyaları kapsayıcıdaki çalışma dizini ile senkronize eder.
  • Container-structure-test'i kullanarak otomatik olarak testler yapar.
  • Bağlantı noktalarını iletir.
  • Bir kapsayıcıda çalışan bir uygulamanın günlüklerini okur.
  • Java, Node.js, Python, Go ile yazılmış uygulamalarda hata ayıklamaya yardımcı olur.

Şimdi özellikler hakkında:

  • Skaffold'un kendisinde küme tarafı bileşenleri yoktur. Yani bu yardımcı programı kullanmak için Kubernetes'i daha fazla yapılandırmanıza gerek yoktur.
  • Uygulamanız için farklı işlem hatları. Geliştirme aşamasında kodu yerel Minikube'ye, ardından sahneye veya prodüksiyona aktarmanız mı gerekiyor? Bu amaçla var profiller ve bir uygulama için farklı işlem hatlarını tanımlamanıza olanak tanıyan kullanıcı yapılandırmaları, ortam değişkenleri ve işaretler.
  • CLI. YAML'de yalnızca konsol yardımcı programı ve yapılandırmaları. İnternette oluşturma girişimlerine ilişkin referanslar bulabilirsiniz. deneysel GUIancak şu anda bu büyük olasılıkla birinin ona ihtiyacı olduğu anlamına geliyor, ama gerçekte değil.
  • Modülerlik. Skaffold bağımsız bir biçerdöver değildir, belirli görevler için bireysel modülleri veya mevcut çözümleri kullanmayı amaçlamaktadır.

İkincisinin çizimi:

  • Montaj aşamasında şunları kullanabilirsiniz:
    • docker yerel olarak, kaniko kullanan bir kümede veya Google Cloud Build'te derlenir;
    • Bazel yerel olarak;
    • Jib Maven ve Jib Gradle yerel olarak veya Google Cloud Build'te;
    • özel derleme komut dosyaları yerel olarak çalışır. Başka bir (daha esnek/tanıdık/...) derleme çözümü çalıştırmanız gerekiyorsa, komut dosyasında Skaffold'un çalıştıracağı şekilde açıklanır (belgelerden örnek). Bu, bir komut dosyası kullanılarak çağrılabilecek herhangi bir toplayıcıyı kullanmanıza olanak tanır;
  • Test aşamasında, daha önce bahsedilen konteyner-yapı-testi;
  • Dağıtım için aşağıdakiler sağlanır:
    • Kubectl;
    • Dümen;
    • özelleştirmek.

Bu sayede Skaffold benzersiz bir ürün olarak adlandırılabilir. CI/CD oluşturmaya yönelik çerçeve. Bunu kullanırken örnek bir iş akışını burada bulabilirsiniz (proje belgelerinden):

Kubernetes geliştirme için Skaffold'un incelenmesi

Skaffold'un çalışmaları genel anlamda neye benziyor?

  1. Yardımcı program, kaynak kodu dizinindeki değişiklikleri izler. Dosyalarda değişiklik yapılması durumunda bunlar Kubernetes kümesindeki uygulama podu ile senkronize edilir. Mümkünse görüntüyü yeniden oluşturmadan. Aksi halde yeni bir görüntü oluşturulur.
  2. Birleştirilen görüntü, konteyner yapısı testi kullanılarak kontrol edilir, etiketlenir ve Docker Kayıt Defterine gönderilir.
  3. Bundan sonra görüntü Kubernetes kümesine dağıtılır.
  4. Başlatma şu komut kullanılarak başlatıldıysa skaffold dev, ardından uygulamadan günlükleri almaya başlarız ve Skaffold, tüm eylemlerin tekrar tekrarlanması için değişikliklerin yapılmasını bekler.

Kubernetes geliştirme için Skaffold'un incelenmesi
Skaffold operasyonunun ana aşamalarının çizimi

Pratik. Skaffold'u denemek

Skaffold'un kullanımını göstermek için şu örnekten yararlanacağım: GitHub proje deposu. Bu arada aynı yerde Çeşitli özellikleri dikkate alan başka birçok örnek bulabilirsiniz. Minikube'de tüm işlemleri local olarak gerçekleştireceğim. Kurulum basittir ve birkaç dakika sürer; başlamak için kubectl'e ihtiyacınız olacak.

Skaffold'u yükleyin:

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'un deposunu gerekli örneklerle klonlayalım:

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

Her biri küçük bir Go uygulaması içeren iki bölmeli bir örnek seçtim. Uygulamalardan biri, isteği ikinci uygulamaya, yani arka uca (leeroy-app) yönlendiren ön uçtur (leeroy-web). Bakalım neye benziyor:

~/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 ve leeroy-web, bu kodu yerel olarak oluşturmak için Go kodunu ve basit Docker dosyalarını içerir:

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

Başvuru kodunu vermeyeceğim - bunu bilmeniz yeterli leeroy-web istekleri kabul eder ve onlara vekalet eder leeroy-app. Bu nedenle dosyalarda Deployment.yaml sadece şunun için bir Hizmet var: app (dahili yönlendirme için). Kapsül bağlantı noktası web uygulamaya hızlı erişim için kendimize ileteceğiz.

Benziyor 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

Yukarıda bahsedilen tüm aşamalar burada açıklanmaktadır. Bu yapılandırmaya ek olarak genel ayarlara sahip bir dosya da vardır - ~/.skaffold/config. Manuel olarak veya CLI aracılığıyla düzenlenebilir; örneğin şu şekilde:

skaffold config set --global local-cluster true

Bu komut global değişkeni ayarlayacaktır local-cluster anlam içine truebundan sonra Skaffold görüntüleri uzak kayıt defterine göndermeye çalışmaz. Yerel olarak geliştiriyorsanız görüntüleri yerel olarak oluşturmak için bu komutu kullanabilirsiniz.

Biz dönmek skaffold.yaml:

  • Sahnede build görseli yerel olarak toplayıp kaydetmeniz gerektiğini belirtiyoruz. Derleme ilk kez çalıştırıldıktan sonra aşağıdakileri göreceğiz:
    // т.к. 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üğünüz gibi Skaffold görselleri kendisi etiketledi. Bu arada, çeşitli etiketleme politikaları desteklenmektedir.

  • Ayrıca yapılandırmada belirtilmiştir context: ./leeroy-app/, yani görüntünün toplandığı bağlam belirtilir.
  • Deployment aşamasında gerekli manifestler için kubectl ve mask kullanacağımız belirlendi.
  • PortForward: bağlantı noktalarını genellikle kullanarak iletme şeklimize benzer kubectl port-forwardSkaffold'a bu komutu çağırması için talimat veriyoruz. Bu durumda, Dağıtımda yerel bağlantı noktası 9000, 8080'e şu adla iletilir: leeroy-web.

Başlatma zamanı geldi skaffold dev: Ekip devam eden bir “geri bildirim döngüsü” oluşturacaktır; yalnızca her şeyi toplayıp kümeye dağıtmakla kalmayacak, aynı zamanda size bölmelerin o andaki durumu hakkında bilgi verecek, değişiklikleri izleyecek ve bölmelerin durumunu güncelleyecektir.

İşte lansmanın sonucu skaffold dev --port-forward yeniden birleştirirken:

Kubernetes geliştirme için Skaffold'un incelenmesi

Öncelikle önbelleğin kullanıldığını görebilirsiniz. Daha sonra uygulama toplanır, dağıtılır ve bağlantı noktaları iletilir. Belirtildiğinden beri --port-forward, Skaffold bağlantı noktasını şuraya iletti: webkendisine sorulduğu gibi ama app kendi takdirine göre attı (en yakın ücretsiz olanı seçti). Bundan sonra uygulamalardan ilk logları alıyoruz.

Çalışıp çalışmadığını kontrol edelim mi?

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

Dosyayı değiştirmek leeroy-app/app.go - birkaç saniye geçti... ve:

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

Aynı zamanda Skaffold'un kendisi de konsolda bir nokta dışında aynı şeyi gösterdi: yalnızca piyasaya sürüldü leeroy-appve hepsi aynı anda değil.

Daha fazla pratik

Yeni bir proje oluştururken Skaffold için yapılandırmaların şu komut kullanılarak önyüklenebileceğini de belirtmekte fayda var. initki bu çok kullanışlıdır. Ek olarak, birkaç yapılandırma yazabilirsiniz: varsayılan yapılandırmada geliştirmeyi gerçekleştirin ve ardından komutla sahneye çıkarın. run (aynı süreç dev, yalnızca değişiklikleri izlemiyor), farklı bir yapılandırma kullanarak.

Katacoda'da var liderlik Bir örnekle daha da kolay. Ancak Kubernetes, bir uygulama ve Skaffold ile hazır bir sanal alan sunuyor. Temel bilgileri kendiniz denemek istiyorsanız harika bir seçenek.

Skaffold'un olası bir kullanım durumu, geliştirmeyi uzak bir küme üzerinde yürütmektir. Herkes Minikube'ü kendi donanımı üzerinde çalıştırmak, ardından uygulamayı kullanıma sunmak ve yeterli şekilde çalışmasını beklemek konusunda rahat değil... Bu durumda Skaffold sorunu mükemmel bir şekilde çözüyor ve bu, örneğin Reddit mühendisleri tarafından, bizim yaptığımız gibi, doğrulanabilir. zaten tartışıldı писали blogumuzda.

Ve içinde bu yayın Weaveworks'te üretim için bir üretim hattı oluşturma örneğini bulabilirsiniz.

Sonuç

Skaffold, uygulamaları Kubernetes'e dağıtmayı içeren ve öncelikli olarak geliştirme ihtiyaçlarına odaklanan işlem hatları oluşturmak için kullanışlı bir araçtır. Geliştiricinin temel ihtiyaçlarını dikkate alan "kısa" bir işlem hattı oluşturmayı oldukça kolaylaştırır, ancak istenirse daha büyük süreçleri de organize edebilirsiniz. CI/CD süreçlerinde Skaffold kullanımının açık örneklerinden biri olarak verilmiş bu tür deneme projesi Kubernetes, gRPC, Istio ve OpenCensus Tracing'in özelliklerini kullanan 10 mikro hizmetten biri.

Skaffold'un GitHub'da halihazırda neredeyse 8000'den fazla yıldızı var, Google tarafından geliştirildi ve bir parçası GoogleContainerAraçlar - genel olarak şu anda projenin sonsuza kadar mutlu bir şekilde gelişeceğine inanmak için her türlü neden var.

PS

Blogumuzda da okuyun:

Kaynak: habr.com

DDoS korumalı siteler, VPS VDS sunucuları için güvenilir hosting satın alın 🔥 DDoS korumalı, güvenilir VPS ve VDS sunucu barındırma hizmeti satın alın | ProHoster