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:
- Pilih atau buat project Google Cloud.
- Aktifkan penagihan untuk project Anda.
3. Mempersiapkan lingkungan Anda
- 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
- 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
- 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
- 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.
Lakukan substitusi variabel dengan menjalankan perintah followign.cat k8s/deployments/dev/frontend-dev.yaml.tmpl
Untuk meninjau contoh file setelah penggantian, jalankan perintah berikut.for template in $(find . -name '*.tmpl'); do envsubst '${PROJECT_ID} ${ZONE} ${CLUSTER} ${APP_NAME}' < ${template} > ${template%.*}; done
cat k8s/deployments/dev/frontend-dev.yaml
- Jika Anda belum pernah menggunakan Git di Cloud Shell, tetapkan nilai
user.name
danuser.email
yang ingin digunakan:git config --global user.email "YOUR_EMAIL_ADDRESS" git config --global user.name "YOUR_USERNAME"
- 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
- Buat cluster GKE Anda.
gcloud container clusters create ${CLUSTER} \ --project=${PROJECT_ID} \ --zone=${ZONE}
- 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.
- Bangun aplikasi dengan Cloud Build:
gcloud builds submit --tag gcr.io/$PROJECT_ID/$APP_NAME:1.0.0 src/
- Deploy secara manual ke lingkungan Canary dan Produksi:Buat deployment dan layanan produksi dan canary menggunakan perintah
kubectl apply
.
Layanan yang di-deploy di sini akan mengarahkan traffic ke deployment canary dan prod.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
- 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
- Ambil alamat IP eksternal untuk layanan produksi.
Setelah load balancer menampilkan alamat IP, lanjutkan ke langkah berikutnyakubectl get service $APP_NAME -n production
- Simpan IP eksternal untuk digunakan nanti.
export PRODUCTION_IP=$(kubectl get -o jsonpath="{.status.loadBalancer.ingress[0].ip}" --namespace=production services $APP_NAME)
- 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.
- Siapkan pemicu:Komponen utama dari pemicu ini adalah penggunaan parameter
branchName
untuk mencocokkanmain
dan parameterinvertRegex
yang disetel ke benar (true) dan mengubah polabranchName
agar cocok dengan apa pun yang bukanmain
. Untuk referensi, Anda dapat menemukan baris berikut dibuild/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 dibuild/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
- Untuk meninjau pemicu, buka halaman Pemicu Cloud Build di Konsol.Buka Pemicu
- Buat cabang baru:
git checkout -b new-feature-1
- 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'
- Commit perubahan dan kirim ke repositori jarak jauh:
git add . && git commit -m "updated" && git push gcp new-feature-1
- Untuk meninjau build yang sedang berlangsung, buka halaman Histori Cloud Build di Konsol.Buka BuildsSetelah build selesai, lanjutkan ke langkah berikutnya
- Ambil alamat IP eksternal untuk layanan cabang yang baru di-deploy.
Setelah load balancer menampilkan alamat IP, lanjutkan ke langkah berikutnyakubectl get service $APP_NAME -n new-feature-1
- 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)
- 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.
- Siapkan pemicu untuk cabang utama:
gcloud beta builds triggers create cloud-source-repositories \ --trigger-config build/main-trigger.json
- Untuk meninjau pemicu baru, buka halaman Pemicu Cloud Build di Konsol.Buka Pemicu
- Gabungkan cabang ke baris utama dan kirim ke repositori jarak jauh:
git checkout main git merge new-feature-1 git push gcp main
- Untuk meninjau build yang sedang berlangsung, buka halaman Histori Cloud Build di Konsol.Buka BuildsSetelah build selesai, lanjutkan ke langkah berikutnya
- Tinjau beberapa respons dari serverJalankan perintah berikut dan perhatikan bahwa sekitar 25% respons menampilkan respons baru dari Hello World v1.1
Jika Anda siap melanjutkan, tekanwhile true; do curl -w "\n" http://$PRODUCTION_IP; sleep 1; done
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.
- Siapkan pemicu tag:
gcloud beta builds triggers create cloud-source-repositories \ --trigger-config build/tag-trigger.json
- Untuk meninjau pemicu baru, buka halaman Pemicu Cloud Build di Konsol.Buka Pemicu
- Buat tag baru dan kirim ke repositori jarak jauh:
git tag 1.1 git push gcp 1.1
- Untuk meninjau build yang sedang berlangsung, buka halaman Histori Cloud Build di Konsol.Buka Builds
- 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
Jika sudah siap, tekanwhile true; do curl -w "\n" http://$PRODUCTION_IP; sleep 1; done
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
- Di Konsol Cloud, buka halaman Manage resources.
- Dalam daftar project, pilih project yang ingin Anda hapus, lalu klik Delete.
- Pada dialog, ketik project ID, lalu klik Shut down untuk menghapus project.