
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ı. Amacı, 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. hayatları 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. ü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 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. ancak ş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 (). 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 ;
- 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):

Skaffold'un çalışmaları genel anlamda neye benziyor?
- 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.
- Birleştirilen görüntü, konteyner yapısı testi kullanılarak kontrol edilir, etiketlenir ve Docker Kayıt Defterine gönderilir.
- Bundan sonra görüntü Kubernetes kümesine dağıtılır.
- 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.

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: . Bu arada Ç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.1Skaffold'un deposunu gerekli örneklerle klonlayalım:
git clone https://github.com/GoogleContainerTools/skaffold
cd skaffold/examples/microservicesHer 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 filesleeroy-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
buildgö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.1MBGö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 benzerkubectl 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:

Ö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 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 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 bu tür 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ı - 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
