1. Genel Bakış
Bu laboratuvarda, Cloud Build ile GKE için sürekli teslim ardışık düzeni oluşturmayı öğreneceksiniz. Bu laboratuvarda, farklı Git etkinlikleri için Cloud Build işlerinin nasıl tetikleneceği ve GKE'de otomatik erken sürüm yayınları için basit bir kalıp gösterilmektedir.
Aşağıdaki adımları tamamlayacaksınız:
- GKE uygulamasını oluşturma
- Git dalları için dağıtımları otomatikleştirme
- Git ana dalı için dağıtımları otomatikleştirme
- Git etiketleri için dağıtımları otomatikleştirme
2. Başlamadan önce
Bu referans kılavuzu için bir Google Cloud projesine ihtiyacınız vardır. Yeni bir proje oluşturabilir veya önceden oluşturduğunuz bir projeyi seçebilirsiniz:
- Bir Google Cloud projesi seçin veya oluşturun.
- Projeniz için faturalandırmayı etkinleştirin.
3. Ortamınızı hazırlama
- Bu eğitimde kullanmak üzere ortam değişkenleri oluşturun:
export PROJECT_ID=$(gcloud config get-value project) export PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format='value(projectNumber)') export ZONE=us-central1-b export CLUSTER=gke-progression-cluster export APP_NAME=myapp - Aşağıdaki API'leri etkinleştirin:
- Resource Manager
- GKE
- Cloud Source Repositories
- Cloud Build
- Container Registry
gcloud services enable \ cloudresourcemanager.googleapis.com \ container.googleapis.com \ sourcerepo.googleapis.com \ cloudbuild.googleapis.com \ containerregistry.googleapis.com \ --async - Örnek kaynağı klonlayın ve laboratuvar dizinine geçin:
git clone https://github.com/GoogleCloudPlatform/software-delivery-workshop.git gke-progression cd gke-progression/labs/gke-progression rm -rf ../../.git - Örnek depodaki yer tutucu değerleri
PROJECT_IDile değiştirin:Bu adımda, mevcut ortamınıza özgü çeşitli yapılandırma dosyalarının örneklerini oluşturursunuz.Güncellenen şablonların bir örneğini incelemek için aşağıdaki komutu çalıştırın. Aşağıdaki komutu çalıştırarak değişken değiştirme işlemini gerçekleştirin.cat k8s/deployments/dev/frontend-dev.yaml.tmpl Değiştirme işleminden sonra dosyanın bir örneğini incelemek için aşağıdaki komutu çalıştırın.for template in $(find . -name '*.tmpl'); do envsubst '${PROJECT_ID} ${ZONE} ${CLUSTER} ${APP_NAME}' < ${template} > ${template%.*}; donecat k8s/deployments/dev/frontend-dev.yaml - Cloud Shell'de daha önce Git kullanmadıysanız kullanmak istediğiniz
user.nameveuser.emaildeğerlerini ayarlayın:git config --global user.email "YOUR_EMAIL_ADDRESS" git config --global user.name "YOUR_USERNAME" - Örnek depodaki kodu Cloud Source Repositories'de saklayın:
gcloud source repos create gke-progression git init git config credential.helper gcloud.sh git remote add gcp https://source.developers.google.com/p/$PROJECT_ID/r/gke-progression git branch -m main git add . && git commit -m "initial commit" git push gcp main - GKE kümenizi oluşturun.
gcloud container clusters create ${CLUSTER} \ --project=${PROJECT_ID} \ --zone=${ZONE} - Cloud Build'e kümenizde haklar verin.Cloud Build, uygulamayı GKE kümenize dağıtacağından bu işlemi gerçekleştirmek için haklara ihtiyacı olacaktır.
gcloud projects add-iam-policy-binding ${PROJECT_ID} \ --member=serviceAccount:${PROJECT_NUMBER}@cloudbuild.gserviceaccount.com \ --role=roles/container.developer
Ortamınız hazır.
4. GKE uygulamanızı oluşturma
Bu bölümde, bu eğiticide kullanacağınız ilk üretim uygulamasını oluşturup dağıtacaksınız.
- Uygulamayı Cloud Build ile oluşturun:
gcloud builds submit --tag gcr.io/$PROJECT_ID/$APP_NAME:1.0.0 src/ - Kanarya ve Production ortamlarına manuel olarak dağıtma:
kubectl applykomutlarını kullanarak Production ve canary dağıtımlarını ve hizmetlerini oluşturun. Burada dağıtılan hizmet, trafiği hem canary hem de üretim dağıtımlarına yönlendirir.kubectl create ns production kubectl apply -f k8s/deployments/prod -n production kubectl apply -f k8s/deployments/canary -n production kubectl apply -f k8s/services -n production - Çalışan kapsül sayısını inceleyin. Üretim trafiği için üç ve canary sürümleri için bir olmak üzere ön uçta dört kapsülün çalıştığını doğrulayın. Bu, canary sürümünüzdeki değişikliklerin kullanıcıların yalnızca 4'te 1'ini (%25) etkileyeceği anlamına gelir.
kubectl get pods -n production -l app=$APP_NAME -l role=frontend - Üretim hizmetlerinin harici IP adresini alın.
Yük dengeleyici IP adresini döndürdüğünde sonraki adıma geçin.kubectl get service $APP_NAME -n production - Harici IP'yi daha sonra kullanmak üzere saklayın.
export PRODUCTION_IP=$(kubectl get -o jsonpath="{.status.loadBalancer.ingress[0].ip}" --namespace=production services $APP_NAME) - Uygulamayı inceleyin. Hizmetin sürüm çıkışını kontrol edin. Hello World v1.0 yazmalıdır.
curl http://$PRODUCTION_IP
Tebrikler! Örnek uygulamayı dağıttınız. Ardından, değişikliklerinizi sürekli olarak dağıtmak için tetikleyiciler ayarlarsınız.
5. Git dalları için dağıtımları otomatikleştirme
Bu bölümde, main dışındaki herhangi bir dalda commit işlemi yapıldığında Cloud Build işini yürütecek bir tetikleyici ayarlayacaksınız. Burada kullanılan Cloud Build dosyası, mevcut veya yeni dallar için otomatik olarak bir ad alanı ve dağıtım oluşturur. Böylece geliştiriciler, ana dal ile entegrasyondan önce kodlarını önizleyebilir.
- Tetikleyiciyi ayarlayın:Bu tetikleyicinin temel bileşeni,
branchNameparametresininmainile eşleşecek şekilde kullanılması veinvertRegexparametresinin true olarak ayarlanıpbranchNamekalıbınımainolmayan her şeyle eşleşecek şekilde değiştirmesidir. Referans olarak kullanmak için aşağıdaki satırlarıbuild/branch-trigger.jsoniçinde bulabilirsiniz. Ayrıca, bu tetikleyiciyle kullanılan Cloud Build dosyasının son birkaç satırı, işi tetikleyen dala göre adlandırılmış bir ad alanı oluşturur, ardından uygulamayı ve hizmeti yeni ad alanına dağıtır. Referans olması için aşağıdaki satırları"branchName": "main", "invertRegex": true
build/branch-cloudbuild.yamliçinde bulabilirsiniz. Kullanılan mekanizmaları anladığınıza göre aşağıdaki gcloud komutuyla tetikleyiciyi oluşturun.kubectl get ns ${BRANCH_NAME} || kubectl create ns ${BRANCH_NAME} kubectl apply --namespace ${BRANCH_NAME} --recursive -f k8s/deployments/dev kubectl apply --namespace ${BRANCH_NAME} --recursive -f k8s/servicesgcloud beta builds triggers create cloud-source-repositories \ --trigger-config build/branch-trigger.json - Tetikleyiciyi incelemek için Console'da Cloud Build Tetikleyicileri sayfasına gidin.Tetikleyicilere git
- Yeni bir dal oluşturma:
git checkout -b new-feature-1 - Kodu v1.1'i belirtecek şekilde değiştirin.
src/app.pyöğesini düzenleyin ve yanıtı 1.0'dan 1.1'e değiştirin.@app.route('/') def hello_world(): return 'Hello World v1.1' - Değişikliği kaydedin ve uzak depoya aktarın:
git add . && git commit -m "updated" && git push gcp new-feature-1 - Devam eden derlemeyi incelemek için konsolda Cloud Build Geçmişi sayfasına gidin.Derlemeler'e gidin. Derleme tamamlandıktan sonra sonraki adıma geçin.
- Yeni dağıtılan şube hizmetinin harici IP adresini alın.
Yük dengeleyici IP adresini döndürdüğünde sonraki adıma geçin.kubectl get service $APP_NAME -n new-feature-1 - Harici IP'yi daha sonra kullanmak üzere saklayın.
export BRANCH_IP=$(kubectl get -o jsonpath="{.status.loadBalancer.ingress[0].ip}" --namespace=new-feature-1 services $APP_NAME) - Uygulamayı inceleyin. Hizmetin sürüm çıkışını kontrol edin. Hello World v1.0 yazmalıdır.
curl http://$BRANCH_IP
6. Git ana dalı için dağıtımları otomatikleştirme
Kod üretime sunulmadan önce, tüm trafiği yeni kod tabanına taşımadan önce kodu canlı trafiğin küçük bir alt kümesine sunmak yaygın bir uygulamadır.
Bu bölümde, kod ana dala gönderildiğinde etkinleştirilen bir tetikleyici uygulayacaksınız. Tetikleyici, yeni düzeltmeye tüm canlı trafiğin% 25'ini alan canary dağıtımını dağıtır.
- Ana dal için tetikleyiciyi ayarlayın:
gcloud beta builds triggers create cloud-source-repositories \ --trigger-config build/main-trigger.json - Yeni tetikleyiciyi incelemek için Console'da Cloud Build Tetikleyicileri sayfasına gidin. Tetikleyiciler'e gidin.
- Dalı ana çizgiyle birleştirin ve uzak depoya gönderin:
git checkout main git merge new-feature-1 git push gcp main - Devam eden derlemeyi incelemek için Console'da Cloud Build Geçmişi sayfasına gidin.Derlemelere gidinDerleme tamamlandıktan sonra sonraki adıma geçin.
- Sunucudan gelen birden fazla yanıtı inceleyin. Aşağıdaki komutu çalıştırın ve yanıtların yaklaşık% 25'inin Hello World v1.1'in yeni yanıtını gösterdiğini unutmayın.
Devam etmeye hazır olduğunuzda döngüden çıkmak içinwhile true; do curl -w "\n" http://$PRODUCTION_IP; sleep 1; doneCtrl+ctuşuna basın.
7. Git etiketleri için dağıtımları otomatikleştirme
Canary dağıtımı, trafiğin küçük bir alt kümesiyle doğrulandıktan sonra dağıtımı canlı trafiğin geri kalanına yayınlarsınız.
Bu bölümde, depoda bir etiket oluşturduğunuzda etkinleştirilen bir tetikleyici ayarlarsınız. Tetikleyici, resmi uygun etiketle etiketler ve ardından güncellemeleri üretime dağıtarak trafiğin% 100'ünün etiketli resme erişmesini sağlar.
- Etiket tetikleyicisini ayarlayın:
gcloud beta builds triggers create cloud-source-repositories \ --trigger-config build/tag-trigger.json - Yeni tetikleyiciyi incelemek için Console'da Cloud Build Tetikleyicileri sayfasına gidin. Tetikleyiciler'e gidin.
- Yeni bir etiket oluşturun ve uzak depoya gönderin:
git tag 1.1 git push gcp 1.1 - Devam eden derlemeyi incelemek için konsoldaki Cloud Build Geçmişi sayfasına gidin.Derlemelere git
- Sunucudan gelen birden fazla yanıtı inceleyin. Aşağıdaki komutu çalıştırın ve yanıtların% 100'ünün Hello World v1.1'in yeni yanıtını gösterdiğini unutmayın. Yeni pod'ler GKE'de dağıtılıp sağlık kontrolü yapıldığından bu işlem biraz zaman alabilir.
Devam etmeye hazır olduğunuzdawhile true; do curl -w "\n" http://$PRODUCTION_IP; sleep 1; doneCtrl+ctuşuna basarak döngüden çıkın.Tebrikler! Uygulamalarınızı GKE'ye dağıtmak için Cloud Build'de dallar ve etiketler için CI/CD tetikleyicileri oluşturmuş olmanız gerekir.
8. Temizleme
Projeyi silme
- Cloud Console'da Kaynakları yönetin sayfasına gidin.
- Proje listesinde silmek istediğiniz projeyi seçin ve Sil'i tıklayın.
- İletişim kutusunda proje kimliğini yazın ve projeyi silmek için Kapat'ı tıklayın.