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

1. Genel Bakış

Bu laboratuvarda, Cloud Build ile GKE için sürekli teslim ardışık düzeni ayarlamayı öğreneceksiniz. Bu laboratuvarda, farklı git etkinlikleri için Cloud Build işlerinin nasıl tetikleneceği ve GKE'deki otomatik canary sürümleri için basit bir kalıp açıklanmaktadır.

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 daha önce oluşturduğunuz bir projeyi seçebilirsiniz:

  1. Bir Google Cloud projesi seçin veya oluşturun.

PROJE SEÇİCİ SAYFASINA GİT

  1. Projeniz için faturalandırmayı etkinleştirin.

FATURALANDIRMAYI ETKİNLEŞTİRME

3. Ortamınız hazırlanıyor

  1. Bu eğitim boyunca kullanılacak ortam değişkenlerini 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
    
  2. 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
    
  3. Ö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
    
  4. Örnek depodaki yer tutucu değerleri PROJECT_ID değerinizle değiştirin:Bu adımda, geçerli ortamınıza özel çeşitli yapılandırma dosyalarının örneklerini oluşturacaksınız.Güncellenen şablonların bir örneğini incelemek için aşağıdaki komutu çalıştırın.
    cat k8s/deployments/dev/frontend-dev.yaml.tmpl
    
    . Aşağıdaki komutu çalıştırarak değişken değişikliği gerçekleştirin.
    for template in $(find . -name '*.tmpl'); do envsubst '${PROJECT_ID} ${ZONE} ${CLUSTER} ${APP_NAME}' < ${template} > ${template%.*}; done
    
    . Değiştirme işleminden sonra dosyanın örneğini incelemek için aşağıdaki komutu çalıştırın.
    cat k8s/deployments/dev/frontend-dev.yaml
    
  5. Daha önce Cloud Shell'de Git'i kullanmadıysanız kullanmak istediğiniz user.name ve user.email değerlerini ayarlayın:
    git config --global user.email "YOUR_EMAIL_ADDRESS"
    git config --global user.name "YOUR_USERNAME"
    
  6. Örnek depodaki kodu Cloud Source Repositories'de depolayı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
    
  7. GKE kümenizi oluşturun.
    gcloud container clusters create ${CLUSTER} \
        --project=${PROJECT_ID} \
        --zone=${ZONE}
    
  8. Kümenize Cloud Build hakları verin.Cloud Build, uygulamayı GKE Kümenize dağıtacaktır ve bunun 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ğitimde kullandığınız ilk üretim uygulamasını derleyip dağıtacaksınız.

  1. Uygulamayı Cloud Build ile derleyin:
    gcloud builds submit --tag gcr.io/$PROJECT_ID/$APP_NAME:1.0.0 src/
    
  2. Canary ve Üretim ortamlarına manuel olarak dağıtım yapma:kubectl apply komutlarını kullanarak üretim ve canary dağıtımları ile hizmetlerini oluşturun.
    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
    
    . Burada dağıtılan hizmet, trafiği hem canary hem de üretim dağıtımlarına yönlendirir.
  3. Çalışan kapsül sayısını gözden geçirin. 3'ü üretim trafiği, biri canary sürümleri için olmak üzere ön uç için çalışan dört kapsülünüz olduğunu doğrulayın. Bu, canary sürümünüzdeki değişikliklerin yalnızca 4 kullanıcıdan 1'ini (%25) etkileyeceği anlamına gelir.
    kubectl get pods -n production -l app=$APP_NAME -l role=frontend
    
  4. Üretim hizmetleri için harici IP adresini alın. ziyaret edin.
    kubectl get service $APP_NAME -n production
    
    Yük dengeleyici, IP adresini döndürdükten sonra sıradaki adıma geçin
  5. Harici IP'yi daha sonra kullanmak üzere depolayın.
    export PRODUCTION_IP=$(kubectl get -o jsonpath="{.status.loadBalancer.ingress[0].ip}"  --namespace=production services $APP_NAME)
    
  6. 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şikliklerinizin sürekli olarak dağıtılması için tetikleyici oluşturacaksınız.

5. Git dalları için dağıtımları otomatikleştirme

Bu bölümde, main dışında herhangi bir dal için Cloudbuild işi yürütecek bir tetikleyici ayarlayacaksınız. Burada kullanılan Cloud Build dosyası mevcut veya yeni dallar için otomatik olarak ad alanı ve dağıtım oluşturarak geliştiricilerin ana dala entegrasyondan önce kodlarını önizlemelerine olanak tanır.

  1. Tetikleyiciyi ayarlayın:Bu tetikleyicinin temel bileşeni, main ile eşleştirmek için branchName parametresinin, doğru olarak ayarlanmış ve branchName kalıbını main olmayan öğelerle eşleşecek şekilde değiştiren invertRegex parametresinin kullanılmasıdır. Size referans olması için build/branch-trigger.json dilinde aşağıdaki satırları bulabilirsiniz.
      "branchName": "main",
      "invertRegex": true
    
    . Ayrıca, bu tetikleyiciyle kullanılan Cloud Build dosyasının son birkaç satırında, işi tetikleyen dalın adını taşıyan bir ad alanı oluşturulur. Ardından, uygulama ve hizmet yeni ad alanına dağıtılır. Size referans olması için build/branch-cloudbuild.yaml
      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/services
    
    dilinde aşağıdaki satırları bulabilirsiniz Artık kullanılan mekanizmaları anladığınıza göre aşağıdaki gcloud komutuyla tetikleyiciyi oluşturun.
    gcloud beta builds triggers create cloud-source-repositories \
      --trigger-config build/branch-trigger.json
    
  2. Tetikleyiciyi incelemek için Console'da Cloud Build Tetikleyicileri sayfasına gidin.Tetikleyiciler'e git
  3. Yeni bir dal oluşturun:
    git checkout -b new-feature-1
    
  4. Kodu, v1.1Edit src/app.py değerini belirtecek şekilde değiştirin ve yanıtı 1.0 yerine 1.1 olarak değiştirin
    @app.route('/')
    def hello_world():
        return 'Hello World v1.1'
    
  5. Değişikliği kaydedin ve uzak depoya aktarın:
    git add . && git commit -m "updated" && git push gcp new-feature-1
    
  6. Devam eden derlemeyi incelemek için Console'daki Cloud Derleme Geçmişi sayfasına gidin.Derlemelere gidin. Derleme tamamlandığında, sonraki adıma geçin
  7. Yeni dağıtılan şube hizmetinin harici IP adresini alın. ziyaret edin.
    kubectl get service $APP_NAME -n new-feature-1
    
    Yük dengeleyici, IP adresini döndürdükten sonra sıradaki adıma geçin
  8. Harici IP'yi daha sonra kullanmak üzere depolayın.
    export BRANCH_IP=$(kubectl get -o jsonpath="{.status.loadBalancer.ingress[0].ip}"  --namespace=new-feature-1 services $APP_NAME)
    
  9. Uygulamanın 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, üretim sürümüne yayınlanmadan önce, tüm trafiği yeni kod tabanına taşımadan önce canlı trafiğin küçük bir alt grubuna kod yayınlamak yaygın bir uygulamadır.

Bu bölümde, kod ana dala kaydedildiğinde etkinleştirilen bir tetikleyici uygularsınız. Tetikleyici, tüm canlı trafiğin% 25'ini yeni düzeltmeye alan canary dağıtımını dağıtır.

  1. Ana dal için tetikleyici oluşturun:
    gcloud beta builds triggers create cloud-source-repositories \
      --trigger-config build/main-trigger.json
    
  2. Yeni tetikleyiciyi incelemek için Console'da Cloud Build Tetikleyicileri sayfasına gidin.Tetikleyiciler'e gidin.
  3. Dalı ana satırla birleştirin ve uzak depoya aktarın:
    git checkout main
    git merge new-feature-1
    git push gcp main
    
  4. Devam eden derlemeyi incelemek için Console'daki Cloud Derleme Geçmişi sayfasına gidin.Derlemelere gidin. Derleme tamamlandığında, sonraki adıma geçin
  5. Sunucudan gelen birden çok yanıtı inceleyin Aşağıdaki komutu çalıştırın. Yanıtların yaklaşık% 25'inin Hello World v1.1 sürümünün yeni yanıtını gösterdiğini unutmayın.
    while true; do curl -w "\n" http://$PRODUCTION_IP; sleep 1;  done
    
    Devam etmeye hazır olduğunuzda döngüden çıkmak için Ctrl+c düğmesine basın.

7. Git etiketleri için dağıtımları otomatikleştirme

Canary dağıtımı, küçük bir trafik 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 ayarlayacaksınız. Tetikleyici, resmi uygun etiketle etiketler, ardından güncellemeleri üretime dağıtır ve trafiğin% 100'ünün etiketlenen resme erişmesini sağlar.

  1. Etiket tetikleyicisini ayarlayın:
    gcloud beta builds triggers create cloud-source-repositories \
      --trigger-config build/tag-trigger.json
    
  2. Yeni tetikleyiciyi incelemek için Console'da Cloud Build Tetikleyicileri sayfasına gidin.Tetikleyiciler'e gidin.
  3. Yeni bir etiket oluşturun ve uzak depoya aktarın:
    git tag 1.1
    git push gcp 1.1
    
  4. Devam eden derlemeyi incelemek için Console'daki Cloud Build Geçmişi sayfasına gidin.Derlemeler'e git
  5. Server'dan gelen birden fazla yanıtı inceleyin Aşağıdaki komutu çalıştırın. Yanıtların% 100'ünün Hello World v1.1'in yeni yanıtını gösterdiğini unutmayın. Yeni kapsüller dağıtılıp GKE'de durum denetimi yapılırken bu işlem biraz zaman alabilir
    while true; do curl -w "\n" http://$PRODUCTION_IP; sleep 1;  done
    
    Devam etmeye hazır olduğunuzda döngüden çıkmak için Ctrl+c düğmesine basın.Tebrikler! Uygulamalarınızı GKE'ye dağıtacak dallar ve etiketler için Cloud Build'de CI/CD tetikleyicileri oluşturdunuz.

8. Temizleme

Projeyi silme

  1. Cloud Console'da Kaynakları yönetin sayfasına gidin.
  2. Proje listesinden silmek istediğiniz projeyi seçin ve ardından Sil'i tıklayın.
  3. İletişim kutusuna proje kimliğini yazın ve projeyi silmek için Kapat'ı tıklayın.