Cloud Build ile Google Kubernetes Engine'e (GKE) sürekli dağıtım

Bu kod laboratuvarında, Cloud Build ile GKE için sürekli bir teslim ardışık düzeni oluşturmayı öğreneceksiniz. Aşağıdaki adımları tamamlayacaksınız:

  • Bir GKE kümesi oluşturun.
  • Uygulama yapısını inceleyin.
  • Uygulamayı manuel olarak dağıtın.
  • Kaynağınız için bir depo oluşturun.
  • Cloud Builder'da otomatik tetikleyiciler ayarlayın.
  • Dalları özel ad alanlarına otomatik olarak dağıtın.
  • Master'ı bir kanarya olarak otomatik olarak dağıtın.
  • Etiketleri üretime otomatik olarak dağıtın.

Aşama 1

Cloud Shell'i etkinleştirin

  1. Cloud Console'dan Cloud Shell'i Etkinleştir'i tıklayın T0byfD1PUBO2uy6hu04OwnlV4mgc1WDuh9t5olz3GFYQ0THbOPMcxRTBlt4l9Ig523TrIE8OiDGVAZSexL-Gy7dmYxJqJMj3grF63Jak46L4G6NgAjUy00 .

Sr6VDRmFjEcuTE9bMUwBtNf995nRp3mp70akEI84G_5pepblksIXowZz0eI0hpGnUeBR64GV7AGfK9WDA8KWi1bdkF1s2t08mDbKuREzaw1bdkF1s2t08mDbKuREzaw1SaFTkW445x9mXuFTk

Cloud Shell'i daha önce hiç başlatmadıysanız, bunun ne olduğunu açıklayan bir ara ekran (ekranın alt kısmında) sunulur. Durum buysa, Devam'ı tıklayın (ve bir daha asla görmezsiniz). İşte tek seferlik ekran şu şekildedir:

wn9pxVcsCtAf_7DPu1QwAtAdHv8SpAZEsNaTwGJLUO70WNr9NJXFHi71YUHpciUTGq4M-WG_OIufKMqZD7MEbI1co3UGcOJUz3AFWCdEwjJ6ZvJtWZ

Cloud Shell'in sağlanması ve bağlanması yalnızca birkaç dakika sürecektir.

r1PKWLufIh3MNDDxbEmLQW9xOmLJtSapKUtOhCQIqUxcNOsPBxCY9PbLbYPtvXVAlzwZUIN-KgNbjGmt549Jimz3nwrV9JSqpa5Y87KeK7Lc26wzAtz

Bu sanal makine, ihtiyacınız olan tüm geliştirme araçlarına sahiptir. Kalıcı bir 5 GB ana dizin sunar ve Google Cloud'da çalışarak ağ performansını ve kimlik doğrulamasını büyük ölçüde geliştirir. Bu kod laboratuarındaki çalışmalarınızın tamamı olmasa da çoğu, yalnızca bir tarayıcıyla veya Chromebook'unuzla yapılabilir.

Cloud Shell'e bağlandıktan sonra, kimliğinizin zaten doğrulanmış olduğunu ve projenin zaten proje kimliğinize ayarlanmış olduğunu görmelisiniz.

  1. Kimlik doğrulamasının yapıldığını onaylamak için Cloud Shell'de aşağıdaki komutu çalıştırın:
gcloud auth list

Komut çıkışı

 Credentialed Accounts
ACTIVE  ACCOUNT
*       <my_account>@<my_domain.com>

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
gcloud config list project

Komut çıkışı

[core]
project = <PROJECT_ID>

Değilse, şu komutla ayarlayabilirsiniz:

gcloud config set project <PROJECT_ID>

Komut çıkışı

Updated property [core/project].

Adım 2

Bazı değişkenler ayarlayın.

export PROJECT=$(gcloud info --format='value(config.project)')
export ZONE=us-central1-b
export CLUSTER=gke-deploy-cluster

Değerleri gcloud config .

gcloud config set project $PROJECT
gcloud config set compute/zone $ZONE

Ön ayarlı hesabınızı ve projenizi görmek için aşağıdaki komutları çalıştırın. Gcloud ile kaynaklar oluşturduğunuzda, burada depolanırlar.

gcloud config list project
gcloud config list compute/zone

Aşama 3

Google Cloud Console'da aşağıdaki API'lerin etkinleştirildiğinden emin olun:

  • GKE API
  • Container Registry API
  • Cloud Build API
  • Cloud Source Repositories API
gcloud services enable container.googleapis.com \
    containerregistry.googleapis.com \
    cloudbuild.googleapis.com \
    sourcerepo.googleapis.com

4. adım

Örnek kodu almak için aşağıdaki komutu çalıştırın.

git clone https://github.com/GoogleCloudPlatform/cicd-workshop.git -b cloud-builder-gke-continuous-deploy
cd container-builder-workshop

Adım 5

Kümenizi üç düğümle başlatın.

gcloud container clusters create ${CLUSTER} \
    --project=${PROJECT} \
    --zone=${ZONE} \
    --scopes "https://www.googleapis.com/auth/projecthosting,storage-rw"

Kümeyi oluşturmak biraz zaman alabilir.

6. Adım

Kümenize Cloud Build hakları verin.

export PROJECT_NUMBER="$(gcloud projects describe \
    $(gcloud config get-value core/project -q) --format='get(projectNumber)')"

gcloud projects add-iam-policy-binding ${PROJECT} \
    --member=serviceAccount:${PROJECT_NUMBER}@cloudbuild.gserviceaccount.com \
    --role=roles/container.developer

Çevreniz hazır!

Sürekli dağıtım ardışık gceme örnek uygulama olan gceme . Uygulama Go dilinde yazılmıştır ve kök dizinde bulunur. Bir Compute Engine örneğinde gceme ikili dosyasını çalıştırdığınızda, uygulama örneğin meta verilerini bir bilgi kartında şu şekilde görüntüler:

gceme bilgi kartı

Uygulama, aşağıdaki işlem modlarını destekleyerek bir mikro hizmeti taklit eder:

  • Arka uç modunda gceme , 8080 numaralı bağlantı noktasını dinler ve Compute Engine örnek meta verilerini JSON biçiminde döndürür.
  • Ön uç modunda, gceme , arka uç gceme hizmetini sorgular ve ortaya çıkan gceme kullanıcı arayüzünde oluşturur.

5c6e7f9cf8bcf1dc.png

Uygulamayı iki farklı ortama dağıtacaksınız:

  • Üretim : Kullanıcılarınızın eriştiği canlı site.
  • Canary : Yazılımınızı tüm kullanıcılara yayınlanmadan önce canlı trafikle doğrulamak için kullanacağınız, kullanıcı trafiğinizin yalnızca küçük bir yüzdesini alan daha küçük kapasiteli bir site.

Aşama 1

Dağıtımı mantıksal olarak izole etmek için Kubernetes ad alanını oluşturun.

kubectl create ns production

Adım 2

kubectl apply komutlarını kullanarak üretim ve canary dağıtımlarını ve hizmetleri oluşturun.

kubectl apply -f kubernetes/deployments/prod -n production
kubectl apply -f kubernetes/deployments/canary -n production
kubectl apply -f kubernetes/services -n production

Aşama 3

Üretim ortamı ön uçlarının ölçeğini büyütün. Varsayılan olarak, ön ucun yalnızca bir kopyası konuşlandırılır. Her zaman çalışan en az dört kubectl scale olduğundan emin olmak için kubectl scale komutunu kullanın.

kubectl scale deployment gceme-frontend-production -n production --replicas 4

4. adım

Ön uç için çalışan beş Kapsülünüz olduğunu doğrulayın; bunlardan dördü üretim trafiği için, biri de canary sürümleri için. Bu, kanarya sürümünüzdeki değişikliklerin yalnızca 5 kişiden 1'ini (% 20) etkileyeceği anlamına gelir.

Ayrıca arka uç için biri üretim, biri de kanarya için olmak üzere iki Kapsülünüz olmalıdır.

kubectl get pods -n production -l app=gceme -l role=frontend
kubectl get pods -n production -l app=gceme -l role=backend

Adım 5

Üretim hizmetleri için harici IP adresini alın.

kubectl get service gceme-frontend -n production

bc1c994824b6246c.png

6. Adım

Ön uç hizmet yük dengeleyici IP adresini daha sonra kullanmak üzere bir ortam değişkeninde saklayın.

export FRONTEND_SERVICE_IP=$(kubectl get -o jsonpath="{.status.loadBalancer.ingress[0].ip}"  --namespace=production services gceme-frontend)

7. Adım

Tarayıcınızda ön uç harici IP adresini açarak her iki hizmetin de çalıştığını doğrulayın.

8. Adım

/version yoluna basarak hizmetin sürüm çıktısını kontrol edin. 1.0.0 okumalıdır.

curl http://$FRONTEND_SERVICE_IP/version

Tebrikler! Örnek uygulamayı dağıttınız! Ardından, değişikliklerinizi sürekli ve güvenilir bir şekilde dağıtmak için bir ardışık düzen kuracaksınız.

Aşama 1

gceme örnek uygulamasının bir kopyasını oluşturun ve bunu Cloud Source Repositories'e gceme .

Adım 2

sample-app dizinini kendi Git deposu olarak başlatın.

gcloud source repos create default
git init
git config credential.helper gcloud.sh
git remote add gcp https://source.developers.google.com/p/$PROJECT/r/default

Aşama 3

Git kaydetmeleriniz için kullanıcı adını ve e-posta adresini ayarlayın. [EMAIL_ADDRESS] adresini Git e-posta adresinizle değiştirin. [USERNAME] nı Git kullanıcı adınızla değiştirin.

git config --global user.email "[EMAIL_ADDRESS]"
git config --global user.name "[USERNAME]"

4. adım

Dosyaları ekleyin, kesin ve aktarın.

git add .
git commit -m "Initial commit"
git push gcp master

Aşama 1

Ana dal dışında herhangi bir dalda yapılan değişiklikleri izlemek için bir derleme tetikleyicisi ayarlayın.

cat <<EOF > branch-build-trigger.json
{
  "triggerTemplate": {
    "projectId": "${PROJECT}",
    "repoName": "default",
    "branchName": "[^(?!.*master)].*"
  },
  "description": "branch",
  "substitutions": {
    "_CLOUDSDK_COMPUTE_ZONE": "${ZONE}",
    "_CLOUDSDK_CONTAINER_CLUSTER": "${CLUSTER}"
  },
  "filename": "builder/cloudbuild-dev.yaml"
}
EOF

curl -X POST \
    https://cloudbuild.googleapis.com/v1/projects/${PROJECT}/triggers \
    -H "Content-Type: application/json" \
    -H "Authorization: Bearer $(gcloud config config-helper --format='value(credential.access_token)')" \
    --data-binary @branch-build-trigger.json

Adım 2

Yalnızca ana daldaki değişiklikleri izlemek için bir derleme tetikleyicisi ayarlayın.

cat <<EOF > master-build-trigger.json
{
  "triggerTemplate": {
    "projectId": "${PROJECT}",
    "repoName": "default",
    "branchName": "master"
  },
  "description": "master",
  "substitutions": {
    "_CLOUDSDK_COMPUTE_ZONE": "${ZONE}",
    "_CLOUDSDK_CONTAINER_CLUSTER": "${CLUSTER}"
  },
  "filename": "builder/cloudbuild-canary.yaml"
}
EOF


curl -X POST \
    https://cloudbuild.googleapis.com/v1/projects/${PROJECT}/triggers \
    -H "Content-Type: application/json" \
    -H "Authorization: Bearer $(gcloud config config-helper --format='value(credential.access_token)')" \
    --data-binary @master-build-trigger.json

Aşama 3

Kod deposuna bir etiket gönderildiğinde yürütülecek bir derleme tetikleyicisi ayarlayın.

cat <<EOF > tag-build-trigger.json
{
  "triggerTemplate": {
    "projectId": "${PROJECT}",
    "repoName": "default",
    "tagName": ".*"
  },
  "description": "tag",
  "substitutions": {
    "_CLOUDSDK_COMPUTE_ZONE": "${ZONE}",
    "_CLOUDSDK_CONTAINER_CLUSTER": "${CLUSTER}"
  },
  "filename": "builder/cloudbuild-prod.yaml"
}
EOF


curl -X POST \
    https://cloudbuild.googleapis.com/v1/projects/${PROJECT}/triggers \
    -H "Content-Type: application/json" \
    -H "Authorization: Bearer $(gcloud config config-helper --format='value(credential.access_token)')" \
    --data-binary @tag-build-trigger.json

İnceleme tetikleyicileri, Tetikleyiciler sayfasında ayarlanır.

Geliştirme dalları, geliştiricilerinizin entegrasyon için canlı siteye göndermeden önce kod değişikliklerini test etmek için kullandıkları bir ortam kümesidir. Bu ortamlar, uygulamanızın küçültülmüş sürümleridir, ancak canlı ortamla aynı mekanizmalarla dağıtılmaları gerekir.

Bir geliştirme dalı oluşturun

Bir özellik dalından bir geliştirme ortamı oluşturmak için, dalı Git sunucusuna gönderebilir ve Cloud Build'in ortamınızı dağıtmasına izin verebilirsiniz.

Bir geliştirme dalı oluşturun ve bunu Git sunucusuna gönderin.

git checkout -b new-feature

Siteyi değiştirin

Uygulamanın değiştirildiğini göstermek için gceme kartlarını maviden turuncuya değiştirmeniz gerekir.

Aşama 1

html.go açın ve blue iki örneğini orange ile değiştirin.

Adım 2

Açık main.go ve değişim gelen sürüm numarası 1.0.0 için 2.0.0 . Sürüm aşağıdaki satırda tanımlanmıştır:

const version string = "2.0.0"

Dağıtımı başlatın

Aşama 1

Geliştirme ortamınızın bir yapısını başlatmak için değişikliklerinizi taahhüt edin ve zorlayın.

git add html.go main.go
git commit -m "Version 2.0.0"
git push gcp new-feature

Adım 2

Değişiklik Git deposuna gönderildikten sonra, yapınızın new-feature dalı için başladığını görebileceğiniz Geçmiş sayfası kullanıcı arayüzüne gidin.

İşin ayrıntılarını incelemek için yapıyı tıklayın.

Aşama 3

Bu tamamlandığında, uygulamanızın erişilebilir olduğunu doğrulayın.

Üretim hizmetleri için harici IP adresini alın.

kubectl get service gceme-frontend -n new-feature

bc1c994824b6246c.png

export FRONTEND_SERVICE_IP=$(kubectl get -o jsonpath="{.status.loadBalancer.ingress[0].ip}" --namespace=new-feature services gceme-frontend)

curl http://$FRONTEND_SERVICE_IP/version

Şu anda çalışan sürüm olan 2.0.0 ile yanıt verdiğini görmelisiniz.

Tebrikler! Geliştirme ortamını siz ayarlayın.

Artık uygulamanızın geliştirme ortamında en son kodunuzu çalıştırdığını doğruladığınıza göre, bu kodu canary ortamında dağıtın.

Aşama 1

Bir kanarya dalı oluşturun ve onu Git sunucusuna gönderin.

git checkout master
git merge new-feature
git push gcp master

Yine, Git deposuna gönderdikten sonra, yapınızın master dal için başladığını görebileceğiniz Geçmiş sayfası kullanıcı arayüzüne gidin.

İşin ayrıntılarını incelemek için yapıyı tıklayın.

Adım 2

Tamamlandığında, trafiğin bir kısmının yeni sürümünüz tarafından sunulduğundan emin olmak için hizmet URL'sini kontrol edebilirsiniz. 2.0.0 sürümünü döndüren beş istekten yaklaşık birini görmelisiniz.

export FRONTEND_SERVICE_IP=$(kubectl get -o jsonpath="{.status.loadBalancer.ingress[0].ip}" --namespace=production services gceme-frontend)
while true; do curl http://$FRONTEND_SERVICE_IP/version; sleep 1;  done

Bu komutu Control+C (Macintosh'ta Command+C ) tuşlarına basarak durdurabilirsiniz.

Tebrikler! Kanarya salınımı yaptınız.

Artık kanarya tahliyeniz başarılı olduğuna ve herhangi bir müşteri şikayeti duymadığınıza göre, üretim filonuzun geri kalanına konuşlandırabilirsiniz.

Aşama 1

Kanarya dalını birleştirin ve Git sunucusuna gönderin.

git tag v2.0.0
git push gcp v2.0.0

v2.0.0 etiketi için başladığını görebileceğiniz Geçmiş sayfası kullanıcı arayüzünde işi inceleyin .

İşin ayrıntılarını incelemek için yapıyı tıklayın.

Adım 2

Tamamlandığında, tüm trafiğin yeni sürümünüz olan 2.0.0 tarafından sunulduğundan emin olmak için hizmet URL'sini kontrol edebilirsiniz. Turuncu kartlarınızı görmek için tarayıcınızı kullanarak siteye de gidebilirsiniz.

export FRONTEND_SERVICE_IP=$(kubectl get -o jsonpath="{.status.loadBalancer.ingress[0].ip}" --namespace=production services gceme-frontend)
while true; do curl http://$FRONTEND_SERVICE_IP/version; sleep 1;  done

Aşama 3

Bu komutu Control+C (Macintosh'ta Command+C ) tuşlarına basarak durdurabilirsiniz.

Tebrikler! Uygulamanızı üretime dağıttınız.