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 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:

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

PROJE SEÇİCİ SAYFASINA GİTME

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

FATURALANDIRMAYI ETKİNLEŞTİRME

3. Ortamınızı hazırlama

  1. 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
    
  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 ile 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.
    cat k8s/deployments/dev/frontend-dev.yaml.tmpl
    
    Aşağıdaki komutu çalıştırarak değişken değiştirme işlemini 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 bir örneğini incelemek için aşağıdaki komutu çalıştırın.
    cat k8s/deployments/dev/frontend-dev.yaml
    
  5. Cloud Shell'de daha önce Git 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 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
    
  7. GKE kümenizi oluşturun.
    gcloud container clusters create ${CLUSTER} \
        --project=${PROJECT_ID} \
        --zone=${ZONE}
    
  8. 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.

  1. Uygulamayı Cloud Build ile oluşturun:
    gcloud builds submit --tag gcr.io/$PROJECT_ID/$APP_NAME:1.0.0 src/
    
  2. Kanarya ve Production ortamlarına manuel olarak dağıtma:kubectl apply komutlarını kullanarak Production ve canary dağıtımlarını ve 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ı 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
    
  4. Üretim hizmetlerinin harici IP adresini alın.
    kubectl get service $APP_NAME -n production
    
    Yük dengeleyici IP adresini döndürdüğünde sonraki adıma geçin.
  5. 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)
    
  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ş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.

  1. Tetikleyiciyi ayarlayın:Bu tetikleyicinin temel bileşeni, branchName parametresinin main ile eşleşecek şekilde kullanılması ve invertRegex parametresinin true olarak ayarlanıp branchName kalıbını main olmayan her şeyle eşleşecek şekilde değiştirmesidir. Referans olarak kullanmak için aşağıdaki satırları build/branch-trigger.json içinde bulabilirsiniz.
      "branchName": "main",
      "invertRegex": true
    
    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ı build/branch-cloudbuild.yaml içinde bulabilirsiniz.
      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
    
    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.Tetikleyicilere git
  3. Yeni bir dal oluşturma:
    git checkout -b new-feature-1
    
  4. 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'
    
  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 konsolda Cloud Build Geçmişi sayfasına gidin.Derlemeler'e gidin. Derleme tamamlandıktan sonra sonraki adıma geçin.
  7. Yeni dağıtılan şube hizmetinin harici IP adresini alın.
    kubectl get service $APP_NAME -n new-feature-1
    
    Yük dengeleyici IP adresini döndürdüğünde sonraki adıma geçin.
  8. 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)
    
  9. 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.

  1. Ana dal için tetikleyiciyi ayarlayın:
    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 çizgiyle birleştirin ve uzak depoya gönderin:
    git checkout main
    git merge new-feature-1
    git push gcp main
    
  4. 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.
  5. 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.
    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 tuş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.

  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 gönderin:
    git tag 1.1
    git push gcp 1.1
    
  4. Devam eden derlemeyi incelemek için konsoldaki Cloud Build Geçmişi sayfasına gidin.Derlemelere git
  5. 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.
    while true; do curl -w "\n" http://$PRODUCTION_IP; sleep 1;  done
    
    Devam etmeye hazır olduğunuzda Ctrl+c tuş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

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