Konteynırlarda sürekli konuşlandırmanın ön keşfi

Yazar | Yitian Coder

Baş Editör | Xu Weilong

Mühür görüntüsü | Görsel Çin'de CSDN indirme

Sürekli entegrasyonu ve sürekli dağıtımı anlamak için önce bileşenlerini ve bileşenler arasındaki ilişkiyi anlamalıyız. Aşağıdaki resim, şimdiye kadar gördüğüm en basit ve en net sürekli dağıtım ve entegrasyon şemasıdır.

Resim kaynağı: sonatype.com

Sürekli dağıtım

Şekilde görüldüğü gibi geliştirme süreci şu şekildedir:

Programcı, kaynak kodu kaynak kontrol kitaplığından indirir, programı yazar ve tamamlandıktan sonra kodu kaynak kitaplığa gönderir.Sürekli Entegrasyon aracı, kaynak kodunu kaynak kitaplığından indirir, kaynak kodu derler ve ardından çalışma zamanı kitaplığına gönderir ( Depo) ve ardından Sürekli Teslimat aracı Kod Deposundan kod indirir, bir yayın sürümü oluşturur ve bunu farklı işletim ortamlarına (DEV, QA, UAT, PROD gibi) yayınlar.

Şekilde, sol kısım, esas olarak geliştirme ve programcılar ile ilgili olan sürekli entegrasyondur; sağ kısım, esas olarak test, çalıştırma ve bakım ile ilgili olan sürekli dağıtımdır. Sürekli teslim (Sürekli Dağıtım), aynı zamanda sürekli dağıtım (Sürekli Dağıtım) olarak da adlandırılır, eğer alt bölümlere ayrılmışlarsa, yine de küçük bir fark vardır, ancak burada, topluca sürekli dağıtım olarak adlandırılan çok fazla ayırt etmiyoruz. Bu makale sürekli dağıtıma odaklanmaktadır.

Sürekli entegrasyon ve dağıtımda aşağıdaki ana oyuncular bulunur:

Kaynak kod kitaplığı: Kaynak kodunu depolamaktan sorumlu olan, yaygın olarak kullanılan Git ve SVN'dir.

Sürekli entegrasyon ve dağıtım araçları: Çalıştırılabilir kitaplıklarda çalıştırılabilir programların otomatik olarak derlenmesinden ve paketlenmesinden ve depolanmasından sorumludur. Daha popüler olanlar Jenkins, GitLab, Travis CI, CircleCI vb.

Depo Yöneticisi: Program bileşenlerini yönetmekten sorumlu olan ve aynı zamanda çalışma zamanı olarak da adlandırılan Depodur. En yaygın kullanılan Nexus'tur. Özel bir kitaplıktır ve rolü program bileşenlerini yönetmektir.

Kütüphane yöneticisinin iki işlevi vardır:

Üçüncü taraf kitaplıklarını yönetin: Uygulamalar genellikle birçok üçüncü taraf kitaplığı kullanır ve farklı teknoloji yığınları farklı kitaplıklar gerektirir ve genellikle üçüncü taraf halk kitaplıklarında depolanır ve bu da yönetilmesi pek uygun değildir. Genellikle şirketler, çeşitli üçüncü taraf yazılımlarını merkezi olarak yönetmek için özel bir yönetim kitaplığı oluşturacaklardır.Örneğin, bir Maven kitaplığı (Java), bir ayna kitaplığı (Docker) veya bir NPM kitaplığı (JavaScript) olarak kullanılabilir. , Firma yazılımlarının standardizasyonunu sağlamak.

Dahili prosedürlerin sunumunu yönetin: Şirketler tarafından çeşitli ortamlarda (DEV, QA, UAT, PROD gibi) yayınlanan tüm programlar, bu program tarafından yönetilir ve birleşik bir sürüm numarası atanır, böylece herhangi bir teslimat belgelenebilir ve program geri dönüşü için uygundur.

Sürekli dağıtım adımları

Her şirketin Sürekli Dağıtım için farklı gereksinimleri vardır ve adımları farklıdır, ancak esas olarak aşağıdaki adımları içerir:

Kaynak kodunu indirin: Kaynak kodunu kaynak kodu havuzundan (github gibi) indirin.

Kodu derleyin: Bu adım, derlenen diller için gereklidir

Ölçek: Programı test edin.

Bir ayna oluşturun: Burada iki adım var, biri bir ayna oluşturmak, diğeri aynayı ayna kitaplığında depolamak.

Dağıtım görüntüsü: Oluşturulan görüntüyü kapsayıcıya dağıtın

Yukarıdaki işlem, genelleştirilmiş bir sürekli dağıtım sürecidir Dar bir şekilde tanımlanmış süreç, kitaplık yöneticisinden çalıştırılabilir programları geri getirmektir Bu, kaynak kodunun indirilmesi ve kodun derlenmesi bağlantısını kaydeder, bunun yerine çalıştırılabilir programları doğrudan kitaplık yöneticisinden indirir. Ancak her şirketin ayrı bir kütüphane yöneticisi olmadığından, burada her şirket için geçerli olan genelleştirilmiş bir sürekli dağıtım süreci benimsenmiştir.

Sürekli dağıtım örneği

Aşağıda, sürekli dağıtımın nasıl tamamlanacağını göstermek için belirli bir örnek kullanıyoruz. Jenkins'i sürekli bir dağıtım aracı olarak kullanıyoruz ve bir Go programını k8s ortamına dağıtmak için kullanıyoruz.

Sürecimiz temelde yukarıda bahsettiğimiz dar süreçtir, ancak Nexus olmadığı için onu biraz değiştirdik ve kaynak programı doğrudan kaynak kitaplıktan indirdik. Adımlar şu şekildedir:

Kaynak kodunu indirin: kaynak kodunu github'dan Jenkins işletim ortamına indirin

Test: Bu adım için gerçek içerik yok

Görüntü oluştur: Bir görüntü oluşturun ve Docker hub'a yükleyin.

Görüntüyü dağıt: oluşturulan görüntüyü k8s'ye dağıt

Bir Jenkins projesi oluşturmadan önce bazı hazırlıklar yapın:

  • Docker Hub hesabı oluşturun

Görüntüyü yükleyebilmek için Docker Hub'da bir hesap ve görüntü deposu oluşturmanız gerekir. Spesifik süreç burada ayrıntılı olarak açıklanmamaktadır, lütfen ilgili bilgilere bakın.

  • Jenkins'te Kimlik Bilgileri Oluşturun

Gelecekte Jenkins komut dosyasında değişkenler tarafından referans alınabilecek Docker hub'ına erişmek için kullanıcı ve parolayı ayarlamanız gerekir, böylece parola programda açık kodda görünmez.

Bir yönetici hesabıyla Jenkins ana sayfasında oturum açtıktan sonra, Manage Jenkins- "Credentials-" System - "Global Credentials -" Add Credentials'ı bulun ve aşağıdaki şekilde gösterildiği gibi Docker Hub kullanıcı adınızı ve şifrenizi girin. "ID", daha sonra komut dosyasında alıntı yapacağınız şeydir.

  • Docker ve k8s önceden yüklenmiş olarak bir Jenkins görüntüsü oluşturun

Jenkins'in varsayılan konteynerinde Docker ve k8'ler yoktur, bu yüzden daha sonra detaylı olarak açıklanacak olan Jenkins imajına dayalı yeni bir imaj oluşturmamız gerekiyor.

Aşağıdaki resim dosyasıdır (Dockerfile-modifiye-jenkins)

Jenkins / jenkins'ten: lts

KULLANICI kökü

ENV DOCKERVERSION = 19.03.4

RUN curl -fsSLO https://download.docker.com/linux/static/stable/x86_64/docker-${DOCKERVERSION}.tgz \

tar xzvf penceresi - $ {DOCKERVERSION} .tgz --şerit 1 \

-C / usr / local / bin docker / docker \

rm docker - $ {DOCKERVERSION} .tgz

RUN curl -LO https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/ amd64 / kubectl \

chmod x ./kubectl \

mv ./kubectl / usr / local / bin / kubectl

Yukarıdaki görüntü, Docker ve kubectl'i "jenkins / jenkins: lts" temelinde yükler, böylece bu iki yazılım desteklenir. Docker'ın 19.03.4 sürümü görüntüde kullanılmıştır. Burada kurulu olan sadece "Docker CLI" dir, Docker motoru yoktur. Kullanırken yine de sanal makinenin hacmini konteynere bağlamanız ve sanal makinenin Docker motorunu kullanmanız gerekir. Bu nedenle, kapsayıcıdaki Docker sürümünün sanal makinenin Docker sürümüyle tutarlı olmasını sağlamak en iyisidir.

Docker sürümünü görüntülemek için aşağıdaki komutu kullanın:

vagrant @ ubuntu-xenial: / $ docker sürümü

Ayrıntılar için lütfen Kubernetes üzerinde Jenkins ile bir CI / CD ardışık düzeni yapılandırma bölümüne bakın: https://developer.ibm.com/tutorials/configure-a-cicd-pipeline-with-jenkins-on-kubernetes/

Hazırlıklar tamamlandı ve şimdi Jenkins projesi resmi olarak oluşturuldu:

  • Jenkins komut dosyası:

Projenin oluşturulması Jenkins ana sayfasında yapılır.Adı "jenkins-k8sdemo". En önemli kısmı betik kodudur. Ayrıca Go programı ile aynı kaynak kodu kütüphanesinde saklanır. Dosya adı da "jenkins- k8sdemo ". Projenin script sayfası aşağıdaki şekilde gösterilmektedir.

Jenkins projelerini kurmaya ve oluşturmaya aşina değilseniz, lütfen k8'lere Jenkins yükleme ve SSS bölümüne bakın.

Aşağıdaki jenkins-k8sdemo komut dosyasıdır:

def POD_LABEL = "k8sdemopod - $ {UUID.randomUUID.toString}"

podTemplate (etiket: POD_LABEL, bulut: 'kubernetes', kapsayıcılar :,

ciltler :) {

düğüm (POD_LABEL) {

def kubBackendDirectory = "/ script / kubernetes / arka uç"

stage ('Checkout') {

container ('modifiye-jenkins') {

sh'echo github'dan kaynak al '

git'https: //github.com/jfeng45/k8sdemo '

}

}

stage ('Build image') {

def imageName = "jfeng45 / jenkins-k8sdemo: $ {env.BUILD_NUMBER}"

def dockerDirectory = "$ {kubBackendDirectory} / docker / Dockerfile-k8sdemo-arka uç"

container ('modifiye-jenkins') {

withCredentials () {

sh "" "

docker girişi -u $ {DOCKER_HUB_USER} -p $ {DOCKER_HUB_PASSWORD}

docker build -f $ {WORKSPACE} $ {dockerDirectory} -t $ {imageName}.

docker push $ {imageName}

"" "

}

}

}

stage ('Dağıt') {

container ('modifiye-jenkins') {

sh "kubectl apply -f $ {WORKSPACE} $ {kubBackendDirectory} /backend-deployment.yaml"

sh "kubectl apply -f $ {WORKSPACE} $ {kubBackendDirectory} /backend-service.yaml"

}

}

}

}

Kodu parça parça inceleyelim:

Kapsayıcı görüntüsünü ayarlayın:

podTemplate (etiket: POD_LABEL, bulut: 'kubernetes', kapsayıcılar :,

ciltler :)

Bir önceki adımda oluşturduğumuz "jfeng45 / modifiye-jenkins: 1.0" 'ı kullanarak Jenkins çocuk düğümü Pod'unun kapsayıcı görüntüsünü buraya ayarlayın. Komut dosyasındaki (sahne) tüm adımlar bu resmi kullanır. "Birimler:", birimleri Jenkins kapsayıcısına bağlamak için kullanılır, böylece Jenkins çocuk düğümleri sanal makinenin Docker motorunu kullanabilir.

Jenkins komut dosyası komutları ve bağlama birimlerinin ayarlanması için lütfen jenkinsci / kubernetes-eklentisine bakın

https://github.com/jenkinsci/kubernetes-plugin

  • Bir ayna oluşturun:

Aşağıdaki kod, Go programının Docker imaj dosyasını oluşturur.Burada Docker eklentisini kullanmıyoruz, ancak Docker komutunu doğrudan çağırıyoruz.Faydaları daha sonra tartışılacaktır. Docker kitaplığına erişmek için daha önce kurduğumuz "Docker hub" kimlik bilgilerine başvurur. Komut dosyasında, önce "Docker hub" 'a giriş yapıyoruz, ardından bir yansıtma oluşturmak için önceki adımda GitHub'dan indirilen kaynak kodunu kullanıyoruz ve son olarak yansıtmayı "Docker hub" a yüklüyoruz. onların arasında

"ÇALIŞMA ALANI" Jenkins önceden tanımlanmış bir değişkendir. GitHub'dan indirilen kaynak kodu "{ÇALIŞMA ALANI}" içinde saklanır.

stage ('Build image') {

def imageName = "jfeng45 / jenkins-k8sdemo: $ {env.BUILD_NUMBER}"

def dockerDirectory = "$ {kubBackendDirectory} / docker / Dockerfile-k8sdemo-arka uç"

container ('modifiye-jenkins') {

withCredentials () {

sh "" "

docker girişi -u $ {DOCKER_HUB_USER} -p $ {DOCKER_HUB_PASSWORD}

docker build -f $ {WORKSPACE} $ {dockerDirectory} -t $ {imageName}.

docker push $ {imageName}

"" "

}

}

}

Jenkins komutları hakkında daha fazla bilgi edinmek istiyorsanız lütfen Kubernetes ile Jenkins CI / CD Ardışık Düzeni Kurma konusuna bakın.

https://akomljen.com/set-up-a-jenkins-ci-cd-pipeline-with-kubernetes/

Go programının imaj dosyasını burada yeniden oluşturmadık, ancak daha önce k8s tarafından oluşturulan Go programının imaj dosyasını yeniden kullandık. Go programının imaj dosyası yolu "\ script \ kubernetes \ backend \ docker \ Dockerfile-k8sdemo- arka uç ".

Kodu aşağıdaki gibidir. Bunun faydaları daha sonra tartışılacaktır.

# vagrant @ ubuntu-xenial: ~ / app / k8sdemo / script / kubernetes / arka uç $

# docker build -t k8sdemo-arka uç.

Golang'DAN: inşaatçı olarak en son

# Konteyner içindeki Mevcut Çalışma Dizinini ayarlayın

WORKDIR / uygulama

KOPYA go.mod go.sum ./

RUN go mod indir

KOPYALA ..

WORKDIR / uygulama / cmd

# Go uygulamasını oluşturun

#RUN CGO_ENABLED = 0 GOOS = linux go build -a -installsuffix cgo -o main.exe

ÇALIŞTIR go build -o main.exe

######## Sıfırdan yeni bir aşamaya başlayın #######

ALPİN'DEN: en son

ÇALIŞTIR apk - önbellek yok ca-sertifikaları ekle

WORKDIR / kök /

ÇALIŞTIR mkdir / lib64 ln -s /lib/libc.musl-x86_64.so.1 /lib64/ld-linux-x86-64.so.2

# Önceden oluşturulmuş ikili dosyayı önceki aşamadan kopyalayın

KOPYA --from = oluşturucu /app/cmd/main.exe.

# Yürütülebilir dosyayı çalıştırma komutu

# CMD exec / bin / bash -c "tuzak: TERM INT; sonsuz uyku ve bekle"

CMD

Go görüntü dosyaları hakkında daha fazla bilgi için lütfen Optimize edilmiş Go görüntü dosyaları ve çukurlar oluşturma konusuna bakın.

https://blog.csdn.net/weixin_38748858/article/details/102714799

Dağıtım görüntüsü:

Ardından, Go programını k8s'e dağıtın. Kubectl eklentisi burada kullanılmaz. Bunun yerine, mevcut k8s dağıtım ve hizmet yapılandırma dosyalarını çağırmak için kubectl komutunu kullanın (oluşturulan Go görüntüsü dosyada belirtilecektir). Faydaları daha sonra tartışılacaktır. To.

stage ('Dağıt') {

container ('modifiye-jenkins') {

sh "kubectl apply -f $ {WORKSPACE} $ {kubBackendDirectory} /backend-deployment.yaml"

sh "kubectl apply -f $ {WORKSPACE} $ {kubBackendDirectory} /backend-service.yaml"

}

}

K8'lerin dağıtımı ve hizmet yapılandırma dosyalarının ayrıntıları için, lütfen uygulamaları k8'lere geçirirken neleri değiştirmem gerekiyor?

https://blog.csdn.net/weixin_38748858/article/details/102758381

  • Bildirge neden işe yaramaz?

Pipeline'ı komut dosyalarında yazmanın iki yolu vardır: "Scripted Pipleline" ve "Declarative Pipleline" Burada ilk yöntem kullanılır. "Bildirimli Pipleline" yeni bir yöntem. Kullanmamamın nedeni Bildirime Dayalı modu kullanmaya başlamam ama onu çağırmamamdı. Sonra "Scripted Pipleline" a geçtim ve başarılı oldu. Daha sonra, Bildirimi ayarlama yöntemini, özellikle birimin nasıl monte edileceğini keşfettim, ancak ona baktıktan sonra, "Komut Dosyalı Pipleline" dan çok daha karmaşıktı, bu yüzden tembeldim ve değiştirmedim.

Bildirimli modda takılı birimleri nasıl ayarlayacağınızı öğrenmek istiyorsanız, lütfen Jenkins Pipeline Kubernetes Agent paylaşılan Birimleri konusuna bakın.

https://devops.stackexchange.com/questions/4695/jenkins-pipeline-kubernetes-agent-shared-volumes

  • Otomatik proje:

Jenkins'teki projelerin artık manuel olarak başlatılması gerekiyor.Projeyi otomatik olarak başlatmanız gerekiyorsa, bir webhook oluşturmanız gerekir. Hem GitHub hem de dockerhub web kancalarını destekler ve sayfalarında ayar seçenekleri vardır. "Webhook" bir ters arama URL'sidir. GitHub ve dockerhub, her yeni kod veya yansıtma gönderildiğinde bu URL'yi çağırır. URL, ilgili projenin otomatik olarak başlatılması için Jenkins projesinin adresine ayarlanır.

test sonucu

Artık Jenkins projesi tam olarak yapılandırılmıştır ve sonuçları doğrulamak için projeyi çalıştırmanız gerekir. Projeye başladıktan sonra,

"Konsol Çıkışı" nı kontrol edin, aşağıdakiler çıktının bir parçasıdır (tüm çıktı çok uzun, lütfen eke bakın) ve dağıtımın başarılı olduğunu gösterir.

. . .

kubectl apply -f /home/jenkins/workspace/test1/script/kubernetes/backend/backend-deployment.yaml

deployment.apps / k8sdemo-backend-deployment oluşturuldu

sh kubectl apply -f /home/jenkins/workspace/test1/script/kubernetes/backend/backend-service.yaml

service / k8sdemo-arka uç hizmeti oluşturuldu

}

// kapsayıcı

}

// sahne

}

// düğüm

}

// podTemplate

Boru Hattının Sonu

Tamamlandı: BAŞARI

Çalışan sonuçları görüntüleyin:

Kapsül adını alın:

vagrant @ ubuntu-xenial: / home $ kubectl pod al

İSİM HAZIR DURUM YENİDEN BAŞLATMA YAŞI

envar-demo 1/1 Koşu 1532d

k8sdemo-backend-deployment-6b99dc6b8c-8kxt91/1 Çalıştırma 050s

k8sdemo-database-deployment-578fc88c88-mm6x81/1 Çalıştırma 920d

k8sdemo-jenkins-deployment-675dd574cb-r57sb 1/1 Çalıştırma 02d23h

Bölmede oturum açın ve programı çalıştırın:

vagrant @ ubuntu-xenial: / home $ kubectl exec -ti k8sdemo-arka uç-dağıtım-6b99dc6b8c-8kxt9 - / bin / sh

~ # ./main.exe

DEBU veritabanına bağlan

DEBU dataSourceName: dbuser: dbuser @ tcp (k8sdemo-veritabanı-hizmeti: 3306) / service_config? Charset = utf8

DEBU FindAll

DEBU oluşturuldu = 2019-10-21

DEBU kullanıcıyı bul: {1 Tony IT 2019-10-21}

DEBU kullanıcı listesini bul:

DEBU kullanıcı listesi:

Sonuç doğrudur.

Jenkins ilkesi

Örnek kısım bitti, aşağıda en iyi uygulamaları tartışalım. Bundan önce, önce Jenkins ilkesini bulmalıyız.

  • Yürütülebilir komut

Her zaman bir sorum var, hangi komutların kabuk aracılığıyla Jenkins tarafından çalıştırılabileceği? Jenkins, Docker ve k8'lerden farklıdır. Bunları öğrendiğiniz sürece ikincisi kendi komut setine sahiptir. Jenkins, diğer sistemlerle entegre olarak çalışır, bu nedenle çalıştırılabilir komutları diğer sistemlerle ilişkilidir, bu da hangi komutların çalıştırılabilir hangilerinin çalıştırılamayacağını bilmenizi zorlaştırır. Cevabı almak için ilkesini anlamanız gerekir. Jenkins komut dosyasını çalıştırdığında, ana düğüm otomatik olarak bir çocuk düğüm (Docker konteyneri) oluşturur ve tüm Jenkins komutları bu konteynerde çalıştırılır. Dolayısıyla çalıştırılabilecek komutlar konteyner ile yakından ilgilidir. Genel olarak konuşursak, Linux komutlarını kabuk üzerinden çalıştırabilirsiniz. Sonra şu soru geliyor:

1. Bash'i neden kullanamıyorum?

Çünkü kullandığınız alt düğümün kapsayıcısı, Bash'e sahip olmayan Alpine gibi modern bir Linux sürümünü kullanabilir.

2. Neden Docker komutlarını veya Kubectl'i çalıştıramıyorum?

Varsayılan kapsayıcısı jenkinsci / jnlp-slave olduğundan ve önceden yüklenmiş Docker veya kubectl'e sahip değildir. Varsayılan kapsayıcıyı kullanmak yerine, kendi kabınızı belirleyebilir ve yukarıdaki yazılımı içine önceden yükleyebilir, ardından bu komutları çalıştırabilirsiniz.

  • Dosyalar nasıl paylaşılır

Bir Jenkins projesi tamamlamak için genellikle birkaç adıma (aşamaya) bölünür Örneğin, indirdiğiniz kaynak kodun birkaç adım arasında paylaşılması gerekir. Nasıl paylaşılır? Jenkins, kaynak kod havuzundan ve diğer yerlerden indirilen tüm dosyaları depolayan her proje için bir ÇALIŞMA ALANI (disk alanı) ayırır.Farklı aşamalar dosyaları ÇALIŞMA ALANI aracılığıyla paylaşabilir.

ÇALIŞMA ALANI ile ilgili ayrıntılar için, lütfen Jenkins Projesi Yapıları ve Çalışma Alanı'na bakın.

https://stackoverflow.com/questions/39397329/jenkins-project-artifacts-and-workspace

  • En İyi Uygulamalar

En iyi uygulamaları özetlemek için, sürekli konuşlandırmanın tüm geliştirme sürecindeki rolünü ve konumunu anlamak gerekir ve temelde çeşitli bağlantıları birbirine bağlamada rol oynar. Programın dağıtımı k8s ve Docker tarafından tamamlanır, bu nedenle program dağıtımı için betikler de k8s'de bulunur ve k8s tarafından korunur. Jenkins'te benzer bir betik seti tutmak istemiyoruz, bu yüzden en iyi yol Jenkins betiklerini minimuma sıkıştırmak ve olabildiğince çok k8s betiklerini doğrudan çağırmaktır.

Ek olarak, eğer kod yazabiliyorsanız, sayfada yapılandırmayın.Sadece kod tekrar tekrar çalıştırılabilir ve kararlı sonuçlar elde edilebilir.Sayfa konfigürasyonu nakledilemez ve her konfigürasyonun aynı sonuçları üreteceğinin garantisi yoktur.

  • Eklenti kullanımını en aza indirin

Jenkins'in birçok eklentisi vardır ve temelde başarmak istediğiniz şey için karşılık gelen eklentiler vardır. Örneğin, Docker işlevini kullanmanız gerekiyorsa, bir "Docker Pipeline" eklentisi ve k8s işlevini kullanmak istiyorsanız, bir "kubectl" eklentisi vardır. Ama pek çok sorun getirecek.

İlk olarak, her eklentinin kendi ayar yöntemi vardır (genellikle Jenkins eklenti sayfasında ayarlanır), ancak bu ayar diğer sürekli dağıtım araçlarıyla uyumlu değildir. Gelecekte diğer sürekli dağıtım araçlarına geçmek isterseniz, bu ayarların atılması gerekir.

İkincisi, her eklentinin kendi komut formatı vardır, bu nedenle yeni bir komut seti öğrenmeniz gerekir.

Üçüncüsü, bu eklentiler genellikle yapabileceklerinizi sınırlandıran işlevlerin yalnızca bir kısmını destekler.

Örneğin, bir Docker imaj dosyası oluşturmanız gerekiyor, komut aşağıdaki gibidir, "jfeng45 / jenkins-k8sdemo" adlı bir imaj oluşturacaktır, imajın varsayılan dosyası projenin kök dizinindeki Dockerfile'dır.

app = docker.build ("jfeng45 / jenkins-k8sdemo")

Ancak Docker imaj dosyası oluşturma komutunun birçok parametre seçeneği vardır.Örneğin, imaj dosya adınız Dockerfile değil ve dizin proje kök dizininde değil, nasıl yazmalısınız? Bu, önceki sürümde desteklenmiyor, ancak sonraki sürümler bunu destekliyor, ancak sonuçta pek kullanışlı değil ve yeni komutları öğrenmeniz gerekiyor. En iyi yol, Docker komutunu doğrudan kullanmaktır, bu da yukarıda bahsedilen üç sorunu mükemmel şekilde çözer. Cevap, daha önce bahsedilen Jenkins prensibinde yatmaktadır.Aslında çoğu eklentiye gerek yoktur.Sadece bir Jenkins çocuk düğüm kabı oluşturmanız ve bunu başarılı bir şekilde çözmek için ilgili yazılımı yüklemeniz gerekir.

Aşağıda, eklentiyi kullanan ve kullanılmayan betikler arasında bir karşılaştırma yapılmıştır.Kullanılmayanlar daha uzun görünmektedir.O zaman eklentileri kullanan betikler Jenkins'teki kimlik bilgisi ayarlarıyla daha iyi entegre olduğu için kullanılmayan betikler yoktur. Ancak bu küçük eksikliğin yanı sıra, başka yönlerden kullanılmayan betikler, eklenti kullananlardan çok daha üstündür.

Eklenti komut dosyası kullanın (eklenti komutunu kullanarak):

stage ('Docker görüntüleri oluştur') {

kapsayıcı ('docker') {

app = docker.build ("jfeng45 / codedemo", "-f $ {WORKSPACE} / script / kubernetes / arka uç / docker / Dockerfile-k8sdemo-test.")

docker.withRegistry ('', 'dockerhub') {

// Görüntüyü itin ve sürüm oluşturma amaçları için derleme numaramızla etiketleyin.

app.push ("$ {env.BUILD_NUMBER}")

}

}

}

Eklenti kullanmayan komut dosyaları (doğrudan Docker komutlarını kullanın):

stage ('Bir görüntü oluşturucu görüntüsü oluştur') {

def imageName = "jfeng45 / codedemo: $ {env.BUILD_NUMBER}"

def dockerDirectory = "$ {kubBackendDirectory} / docker / Dockerfile-k8sdemo-arka uç"

container ('modifiye-jenkins') {

withCredentials () {

sh "" "

docker girişi -u $ {DOCKER_HUB_USER} -p $ {DOCKER_HUB_PASSWORD}

docker build -f $ {WORKSPACE} $ {dockerDirectory} -t $ {imageName}.

docker push $ {imageName}

"" "

}

}

}

  • Mümkün olduğunca k8s ve Dcoker kullanın

Örneğin, bir uygulama imajı oluşturmak istiyorsak, bir Docker dosyası yazıp bu Docker dosyasını bir Jenkins betiğinde çağırarak onu oluşturabiliriz veya betikte bir görüntü oluşturmak için bir Jenkins betiği yazabiliriz. Daha iyi yöntem eski yöntemdir. Docker ve k8'lerin ikisi de fiili standartlar olduğundan, nakli çok uygundur.

  • Jenkins betiğinde ne kadar az kod varsa o kadar iyidir

Önceki iki ilkeye katılıyorsanız, bu mantıklıdır ve nedeni yukarıdakiyle aynıdır.

  • yaygın sorun:

1. Değişkenler çift tırnak içine alınmalıdır

Jenkins betikleri tek tırnak veya çift tırnak kullanabilir, ancak bir değişkenden tırnak içinde alıntı yaparsanız çift tırnak kullanın.

Doğru komut:

sh "kubectl apply -f $ {WORKSPACE} $ {kubBackendDirectory} /backend-deployment.yaml"

Yanlış komut:

sh'kubectl apply -f $ {WORKSPACE} $ {kubBackendDirectory} /backend-deployment.yaml '

2. docker bulunamadı

Jenkins kapsayıcısında Docker yoksa, ancak Docker komutunu yeniden çağırırsanız, "Konsol Çıktı" nda aşağıdaki hata görünecektir:

docker inspect -f. k8sdemo-arka uç: en yeni

/var/jenkins_home/workspace/k8sdec@2@tmp/durable-01e26997/script.sh: 1: /var/jenkins_home/workspace/k8sdec@2@tmp/durable-01e26997/script.sh: docker: bulunamadı

3. Jenkins düştü

Jenkins'te hata ayıklarken yeni bir imaj dosyası oluşturdum ve bunu "Docker hub" a yükledim ve Jenkins'in çalışmadığını gördüm. Bölmeyi kontrol ettim, bir sorun buldu, k8s Jenkins'in görüntü dosyasını bulamadı (görüntü dosyası diskten kayboldu). Jenkins dağıtım dosyası "imagePullPolicy: Never" olarak ayarlandığından, görüntü gittiğinde otomatik olarak yeniden indirilmeyecektir. Daha sonra sebebini buldum.Vagrant'ın varsayılan disk boyutu 10G.Yeterli alan yoksa, yer açmak için diğer imaj dosyalarını otomatik olarak diskten silecek.Sonuç olarak, Jenkins imaj dosyası silinecek.Çözüm, Vagrant diskini genişletmek. boyut.

Aşağıdaki, disk alanını 16G olarak değiştiren değiştirilmiş Vagrantfile'dır.

Vagrant.configure (2) do | config |

. . .

config.vm.box = "ubuntu / xenial64"

config.disksize.size = '16GB'

. . .

son

Ayrıntılar için bkz. Bir Vagrant VM'de disk boyutunu nasıl artırabilirim?

https://askubuntu.com/questions/317338/how-can-i-increase-disk-size-on-a-vagrant-vm

Kaynak kodu

Tam kaynak kodunun github bağlantısı: https://github.com/jfeng45/k8sdemo

Aşağıda, projenin bu makale ile ilgili bölümleri bulunmaktadır:

ek:

Aşağıda, Jenkins projesi çalıştırıldıktan sonra tam "Konsol Çıkışı" verilmiştir:

Dayanıklılık düzeyinde çalışıyor: MAX_SURVIVABILITY

Ardışık Düzen Başlangıcı

podTemplate

{

düğüm

Hala görevi planlamayı bekliyorum

"K8sdemopod-030ed100-cb28-4770-b6de-c491970e5baa-twb8s-k9pn3" çevrimdışı

Ajan k8sdemopod-030ed100-cb28-4770-b6de-c491970e5baa-twb8s-k9pn3, Kubernetes Kapsül Şablonu şablonundan sağlanmıştır

Ajan spesifikasyonu (k8sdemopod-030ed100-cb28-4770-b6de-c491970e5baa):

* jfeng45 / değiştirilmiş jenkins: 1.0

K8sdemopod-030ed100-cb28-4770-b6de-c491970e5baa-twb8s-k9pn3 in / home / jenkins / workspace / jenkins-k8sdemo üzerinde çalışıyor

{

sahne

{(Ödeme)

konteyner

{

sh

echo github'dan kaynak al

github'dan kaynak al

git

Kimlik bilgisi belirtilmedi

Uzak Git deposunu klonlama

Klonlama havuzu https://github.com/jfeng45/k8sdemo

> git init / home / jenkins / çalışma alanı / jenkins-k8sdemo # zaman aşımı = 10

Https://github.com/jfeng45/k8sdemo'dan yukarı akış değişiklikleri getiriliyor

> git --version # timeout = 10

> git fetch --tags --force --progress - https://github.com/jfeng45/k8sdemo refs / Heads / *: refs / remotes / origin / *

> git config remote.origin.url https://github.com/jfeng45/k8sdemo # timeout = 10

> git config --add remote.origin.fetch refs / Heads / *: refs / remotes / origin / * # timeout = 10

> git config remote.origin.url https://github.com/jfeng45/k8sdemo # timeout = 10

Https://github.com/jfeng45/k8sdemo'dan yukarı akış değişiklikleri getiriliyor

> git fetch --tags --force --progress - https://github.com/jfeng45/k8sdemo refs / Heads / *: refs / remotes / origin / *

Revizyon 90c57dcd8ff362d01631a54125129090b503364b (refs / remotes / origin / master) kontrol ediliyor

> git rev-ayrıştırma refs / remotes / origin / master ^ {commit} # timeout = 10

> git rev-ayrıştırma refs / remotes / origin / origin / master ^ {commit} # timeout = 10

> git config core.sparsecheckout # timeout = 10

> git ödeme -f 90c57dcd8ff362d01631a54125129090b503364b

> git branch -a -v --no-abbrev # zaman aşımı = 10

> git ödeme -b ana 90c57dcd8ff362d01631a54125129090b503364b

Teslim mesajı: "jenkins sürekli dağıtım dosyaları eklendi"

}

> git rev-list --no-walk 90c57dcd8ff362d01631a54125129090b503364b # timeout = 10

// kapsayıcı

}

// sahne

sahne

{(Görüntü oluştur)

konteyner

{

withCredentials

$ DOCKER_HUB_USER veya $ DOCKER_HUB_PASSWORD için desteklenen kalıp eşleşmeleri maskeleme

{

sh

docker girişi -u **** -p ****

UYARI! CLI aracılığıyla --password kullanımı güvenli değildir. --Password-stdin kullanın.

UYARI! Parolanız /home/jenkins/.docker/config.json içinde şifrelenmemiş olarak saklanacaktır.

Bu uyarıyı kaldırmak için bir kimlik bilgisi yardımcısı yapılandırın. Bkz.

https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Giriş Başarılı

docker build -f / home / jenkins / workspace / jenkins-k8sdemo / script / kubernetes / backend / docker / Dockerfile-k8sdemo-backend -t **** / jenkins-k8sdemo: 7.

Docker daemon 218.6kB'ye derleme bağlamı gönderme

Adım 1/13: golang'DAN: inşaatçı olarak en son

--- > dc7582e06f8e

Adım 2/13: WORKDIR / uygulama

--- > C5770704333e'de çalışıyor

Ara kabın çıkarılması C5770704333e

--- > 73445078c82d

Adım 3/13: KOPYALA go.mod go.sum ./

--- > 6762344c7bc8

Adım 4/13: RUN go mod download

--- > 56a1f253c3f5'te çalışıyor

Jay Chou'nun konseri için bir koltuk seçimi işlevi tasarlarsanız, onu nasıl tasarlarsınız?
önceki
Çin İHA "Eski Savaş Topu" Anıları
Sonraki
Damai Cloud'un yerel uç bilişimini keşfedin, böylece izleyiciler de tiyatro izlerken kişiselleştirilebilir
Saç dökülmeden yazılımın yayınlanmasını kolaylaştıran sihirli bir beceri olan özellik bayrağı
Yapay zeka mühendisleri için fırsatlar nerede? Makine öğrenimi mühendislerinin en acil eksikliği | Makalenin sonunda refah
Kahraman eve gidiyor! Zhuhai Destek Hubei Tıp Ekibinin 56 üyesi bugün evlerine doğru yola çıktı
Zhuhai, şu anda ilk yurtdışı ithalattır! Bağlantı noktası nasıl engellenir? Değişiklik nedir? Cevap burada
Hint otobüs toplu tecavüz davasında dört suçlu sonunda idam edildi! Ölmeden önce, hala değişim için başvuruyor
"Salgın" ile savaşan kadın Roket Ordusu doktorlarının ön cephe kaydı: Bu, askeri kariyerimizdeki son savaş olabilir
"The New York Times", Trump'ın iki aylık konuşmasını düzenledi ve sürekli "dönüşüm" değişikliğiyle alay etti
Guangzhou-Shenzhen Şehirlerarası Projesinin güney uzantısı Haziran ayında başladı ve Büyük Körfez Bölgesi'nde toplam uzunluğu yaklaşık 410 kilometre olan 5 şehirlerarası proje imzalandı.
"Şangay'ın Yeni İlk On Dönüm Noktası Binası" Çıktı
Ghosn, Japonya'ya binmeden ve ayrılmadan önce "büyük bir kutuda" saklanıyordu. Japon hükümeti bunu "açıkça yasadışı" olarak nitelendirdi.
"Çin Yer İsimleri Konferansı" nın "Küçük Şiir Ustası" Kang Zhen'e karşı suçlu değil
To Top