Deployment berkelanjutan ke Google Kubernetes Engine (GKE) dengan Cloud Build

1. Ringkasan

Di lab ini, Anda akan mempelajari cara menyiapkan pipeline continuous delivery untuk GKE dengan Cloud Build. Lab ini membahas cara memicu tugas Cloud Build untuk berbagai peristiwa git serta pola sederhana untuk rilis terbatas otomatis di GKE.

Anda akan menyelesaikan langkah-langkah berikut:

  • Membuat Aplikasi GKE
  • Mengotomatiskan deployment untuk cabang git
  • Mengotomatiskan deployment untuk cabang utama git
  • Mengotomatiskan deployment untuk tag git

2. Sebelum memulai

Untuk panduan referensi ini, Anda memerlukan project Google Cloud. Anda dapat membuat project baru, atau memilih project yang sudah dibuat:

  1. Pilih atau buat project Google Cloud.

BUKA HALAMAN SELECTOR PROJECT

  1. Aktifkan penagihan untuk project Anda.

AKTIFKAN PENAGIHAN

3. Mempersiapkan lingkungan Anda

  1. Buat variabel lingkungan untuk digunakan di seluruh tutorial ini:
    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. Mengaktifkan API berikut:
    • 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. Buat clone sumber sampel dan beralihlah ke direktori lab:
    git clone https://github.com/GoogleCloudPlatform/software-delivery-workshop.git gke-progression
    
    cd gke-progression/labs/gke-progression
    rm -rf ../../.git
    
  4. Ganti nilai placeholder di repositori contoh dengan PROJECT_ID:Pada langkah ini, Anda akan membuat instance dari berbagai file konfigurasi yang unik bagi lingkungan Anda saat ini.Untuk meninjau contoh template yang diperbarui, jalankan perintah berikut.
    cat k8s/deployments/dev/frontend-dev.yaml.tmpl
    
    Lakukan substitusi variabel dengan menjalankan perintah followign.
    for template in $(find . -name '*.tmpl'); do envsubst '${PROJECT_ID} ${ZONE} ${CLUSTER} ${APP_NAME}' < ${template} > ${template%.*}; done
    
    Untuk meninjau contoh file setelah penggantian, jalankan perintah berikut.
    cat k8s/deployments/dev/frontend-dev.yaml
    
  5. Jika Anda belum pernah menggunakan Git di Cloud Shell, tetapkan nilai user.name dan user.email yang ingin digunakan:
    git config --global user.email "YOUR_EMAIL_ADDRESS"
    git config --global user.name "YOUR_USERNAME"
    
  6. Simpan kode dari repositori contoh di Cloud Source Repositories:
    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. Buat cluster GKE Anda.
    gcloud container clusters create ${CLUSTER} \
        --project=${PROJECT_ID} \
        --zone=${ZONE}
    
  8. Berikan hak Cloud Build ke cluster Anda.Cloud Build akan men-deploy aplikasi ke Cluster GKE Anda dan memerlukan hak untuk melakukannya.
    gcloud projects add-iam-policy-binding ${PROJECT_ID} \
        --member=serviceAccount:${PROJECT_NUMBER}@cloudbuild.gserviceaccount.com \
        --role=roles/container.developer
    

Lingkungan Anda sudah siap!

4. Membuat Aplikasi GKE

Di bagian ini, Anda akan mem-build dan men-deploy aplikasi produksi awal yang digunakan selama tutorial ini.

  1. Bangun aplikasi dengan Cloud Build:
    gcloud builds submit --tag gcr.io/$PROJECT_ID/$APP_NAME:1.0.0 src/
    
  2. Deploy secara manual ke lingkungan Canary dan Produksi:Buat deployment dan layanan produksi dan canary menggunakan perintah kubectl apply.
    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
    
    Layanan yang di-deploy di sini akan mengarahkan traffic ke deployment canary dan prod.
  3. Meninjau jumlah pod yang berjalan. Konfirmasikan bahwa Anda memiliki empat Pod yang berjalan untuk frontend, termasuk tiga untuk traffic produksi dan satu lagi untuk rilis terbatas. Artinya, perubahan pada rilis terbatas Anda hanya akan memengaruhi 1 dari 4 (25%) pengguna.
    kubectl get pods -n production -l app=$APP_NAME -l role=frontend
    
  4. Ambil alamat IP eksternal untuk layanan produksi.
    kubectl get service $APP_NAME -n production
    
    Setelah load balancer menampilkan alamat IP, lanjutkan ke langkah berikutnya
  5. Simpan IP eksternal untuk digunakan nanti.
    export PRODUCTION_IP=$(kubectl get -o jsonpath="{.status.loadBalancer.ingress[0].ip}"  --namespace=production services $APP_NAME)
    
  6. Tinjau aplikasi. Periksa output versi layanan. Aplikasi tersebut akan menampilkan Hello World v1.0
    curl http://$PRODUCTION_IP
    

Selamat! Anda telah men-deploy aplikasi contoh. Selanjutnya, Anda akan menyiapkan pemicu untuk menerapkan perubahan secara berkelanjutan.

5. Mengotomatiskan deployment untuk cabang git

Di bagian ini, Anda akan menyiapkan pemicu yang akan menjalankan tugas Cloudbuild pada commit cabang mana pun selain main. File Cloud Build yang digunakan di sini akan secara otomatis membuat namespace dan deployment untuk setiap cabang yang ada atau baru, sehingga developer dapat melihat pratinjau kode sebelum integrasi dengan cabang utama.

  1. Siapkan pemicu:Komponen utama dari pemicu ini adalah penggunaan parameter branchName untuk mencocokkan main dan parameter invertRegex yang disetel ke benar (true) dan mengubah pola branchName agar cocok dengan apa pun yang bukan main. Untuk referensi, Anda dapat menemukan baris berikut di build/branch-trigger.json.
      "branchName": "main",
      "invertRegex": true
    
    Selain itu, beberapa baris terakhir file Cloud Build yang digunakan dengan pemicu ini akan membuat namespace yang dinamai menurut cabang yang memicu tugas, lalu men-deploy aplikasi dan layanan dalam namespace baru. Sebagai referensi, Anda dapat menemukan baris berikut di 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
    
    Setelah memahami mekanisme yang digunakan, buat pemicu dengan perintah gcloud di bawah ini.
    gcloud beta builds triggers create cloud-source-repositories \
      --trigger-config build/branch-trigger.json
    
  2. Untuk meninjau pemicu, buka halaman Pemicu Cloud Build di Konsol.Buka Pemicu
  3. Buat cabang baru:
    git checkout -b new-feature-1
    
  4. Ubah kode untuk menunjukkan v1.1Edit src/app.py dan ubah respons dari 1.0 menjadi 1.1
    @app.route('/')
    def hello_world():
        return 'Hello World v1.1'
    
  5. Commit perubahan dan kirim ke repositori jarak jauh:
    git add . && git commit -m "updated" && git push gcp new-feature-1
    
  6. Untuk meninjau build yang sedang berlangsung, buka halaman Histori Cloud Build di Konsol.Buka BuildsSetelah build selesai, lanjutkan ke langkah berikutnya
  7. Ambil alamat IP eksternal untuk layanan cabang yang baru di-deploy.
    kubectl get service $APP_NAME -n new-feature-1
    
    Setelah load balancer menampilkan alamat IP, lanjutkan ke langkah berikutnya
  8. Simpan IP eksternal untuk digunakan nanti.
    export BRANCH_IP=$(kubectl get -o jsonpath="{.status.loadBalancer.ingress[0].ip}"  --namespace=new-feature-1 services $APP_NAME)
    
  9. Meninjau applicationCheck output versi layanan. Aplikasi tersebut akan menampilkan Hello World v1.0
    curl http://$BRANCH_IP
    

6. Mengotomatiskan deployment untuk cabang utama git

Sebelum kode dirilis ke produksi, merilis kode ke sebagian kecil traffic live sebelum memigrasikan semua traffic ke code base baru merupakan hal yang umum.

Di bagian ini, Anda akan menerapkan pemicu yang diaktifkan saat kode di-commit ke cabang utama. Pemicu men-deploy deployment canary yang menerima 25% dari semua traffic langsung ke revisi yang baru.

  1. Siapkan pemicu untuk cabang utama:
    gcloud beta builds triggers create cloud-source-repositories \
      --trigger-config build/main-trigger.json
    
  2. Untuk meninjau pemicu baru, buka halaman Pemicu Cloud Build di Konsol.Buka Pemicu
  3. Gabungkan cabang ke baris utama dan kirim ke repositori jarak jauh:
    git checkout main
    git merge new-feature-1
    git push gcp main
    
  4. Untuk meninjau build yang sedang berlangsung, buka halaman Histori Cloud Build di Konsol.Buka BuildsSetelah build selesai, lanjutkan ke langkah berikutnya
  5. Tinjau beberapa respons dari serverJalankan perintah berikut dan perhatikan bahwa sekitar 25% respons menampilkan respons baru dari Hello World v1.1
    while true; do curl -w "\n" http://$PRODUCTION_IP; sleep 1;  done
    
    Jika Anda siap melanjutkan, tekan Ctrl+c untuk keluar dari loop.

7. Mengotomatiskan deployment untuk tag git

Setelah deployment canary divalidasi dengan sebagian kecil traffic, Anda akan merilis deployment ke seluruh traffic live lainnya.

Di bagian ini, Anda akan menyiapkan pemicu yang diaktifkan saat membuat tag di repositori. Pemicu memberi label pada gambar dengan tag yang sesuai, lalu menerapkan update ke produksi untuk memastikan 100% traffic mengakses gambar yang diberi tag.

  1. Siapkan pemicu tag:
    gcloud beta builds triggers create cloud-source-repositories \
      --trigger-config build/tag-trigger.json
    
  2. Untuk meninjau pemicu baru, buka halaman Pemicu Cloud Build di Konsol.Buka Pemicu
  3. Buat tag baru dan kirim ke repositori jarak jauh:
    git tag 1.1
    git push gcp 1.1
    
  4. Untuk meninjau build yang sedang berlangsung, buka halaman Histori Cloud Build di Konsol.Buka Builds
  5. Tinjau beberapa respons dari serverJalankan perintah berikut dan perhatikan bahwa 100% respons menunjukkan respons baru Hello World v1.1. Proses ini mungkin memerlukan waktu beberapa saat karena pod baru di-deploy dan health diperiksa dalam GKE
    while true; do curl -w "\n" http://$PRODUCTION_IP; sleep 1;  done
    
    Jika sudah siap, tekan Ctrl+c untuk keluar dari loop.Selamat! Anda telah membuat pemicu CI/CD di Cloud Build untuk cabang dan tag guna men-deploy aplikasi ke GKE.

8. Pembersihan

Menghapus project

  1. Di Konsol Cloud, buka halaman Manage resources.
  2. Dalam daftar project, pilih project yang ingin Anda hapus, lalu klik Delete.
  3. Pada dialog, ketik project ID, lalu klik Shut down untuk menghapus project.