1. Ringkasan
Di lab ini, Anda akan mempelajari cara menyiapkan pipeline continuous delivery untuk GKE dengan Cloud Build. Lab ini menyoroti cara memicu tugas Cloud Build untuk berbagai peristiwa git serta pola sederhana untuk rilis canary otomatis di GKE.
Anda akan menyelesaikan langkah-langkah berikut:
- Buat 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 dalam 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 - Aktifkan 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 contoh dan beralih 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_IDAnda:Pada langkah ini, Anda akan membuat instance berbagai file konfigurasi yang unik untuk lingkungan saat ini.Untuk meninjau contoh template yang diperbarui, jalankan perintah berikut. Lakukan penggantian variabel dengan menjalankan perintah berikut.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%.*}; donecat k8s/deployments/dev/frontend-dev.yaml - Jika sebelumnya Anda belum pernah menggunakan Git di Cloud Shell, tetapkan nilai
user.namedanuser.emailyang ingin Anda gunakan: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} - Beri Cloud Build hak ke cluster Anda.Cloud Build akan men-deploy aplikasi ke Cluster GKE Anda dan akan 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/ - Men-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 merutekan traffic ke deployment canary dan produksi.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 - Tinjau jumlah pod yang berjalan. Konfirmasi bahwa Anda memiliki empat Pod yang berjalan untuk frontend, termasuk tiga untuk traffic produksi dan satu untuk rilis terbatas. Artinya, perubahan pada rilis terbatas 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. Teksnya akan berbunyi Hello World v1.0
curl http://$PRODUCTION_IP
Selamat! Anda telah men-deploy aplikasi contoh. Selanjutnya, Anda akan menyiapkan pemicu untuk men-deploy perubahan Anda secara berkelanjutan.
5. Mengotomatiskan deployment untuk cabang git
Di bagian ini, Anda akan menyiapkan pemicu yang akan menjalankan tugas Cloud Build saat melakukan commit pada cabang selain main. File Cloud Build yang digunakan di sini akan otomatis membuat namespace dan deployment untuk cabang yang sudah ada atau baru, sehingga developer dapat melihat pratinjau kode mereka sebelum diintegrasikan dengan cabang utama.
- Siapkan pemicu:Komponen utama pemicu ini adalah penggunaan parameter
branchNameuntuk mencocokkanmaindan parameterinvertRegexyang disetel ke benar (true) dan mengubah polabranchNameagar cocok dengan apa pun yang bukanmain. Sebagai referensi, Anda dapat menemukan baris berikut dibuild/branch-trigger.json. Selain itu, beberapa baris terakhir file Cloud Build yang digunakan dengan pemicu ini membuat namespace yang dinamai sesuai cabang yang memicu tugas, lalu men-deploy aplikasi dan layanan dalam namespace baru. Sebagai referensi, Anda dapat menemukan baris berikut di"branchName": "main", "invertRegex": true
build/branch-cloudbuild.yaml Setelah memahami mekanisme yang digunakan, buat pemicu dengan perintah gcloud di bawah.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 - 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.pydan ubah respons dari 1.0 menjadi 1.1@app.route('/') def hello_world(): return 'Hello World v1.1' - Lakukan commit pada perubahan dan kirim ke repositori jarak jauh:
git add . && git commit -m "updated" && git push gcp new-feature-1 - Untuk meninjau build yang sedang diproses, buka halaman Histori Build 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) - Tinjau aplikasiPeriksa output versi layanan. Teksnya akan berbunyi Hello World v1.0
curl http://$BRANCH_IP
6. Mengotomatiskan deployment untuk cabang utama git
Sebelum kode dirilis ke produksi, biasanya kode dirilis ke sebagian kecil traffic live sebelum memigrasikan semua traffic ke code base baru.
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 live ke revisi 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 berjalan, buka halaman Histori Cloud Build di Konsol.Buka BuildsSetelah build selesai, lanjutkan ke langkah berikutnya
- Tinjau beberapa respons dari server Jalankan perintah berikut dan perhatikan bahwa sekitar 25% respons menampilkan respons baru Hello World v1.1
Jika Anda sudah siap melanjutkan, tekanwhile true; do curl -w "\n" http://$PRODUCTION_IP; sleep 1; doneCtrl+cuntuk 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 men-deploy update ke produksi, sehingga 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 diproses, buka halaman Cloud Build History di Konsol.Buka Builds
- Tinjau beberapa respons dari server Jalankan perintah berikut dan perhatikan bahwa 100% respons menampilkan respons baru Hello World v1.1. Proses ini mungkin memerlukan waktu beberapa saat karena pod baru di-deploy dan diperiksa kondisinya dalam GKE
Jika Anda sudah siap melanjutkan, tekanwhile true; do curl -w "\n" http://$PRODUCTION_IP; sleep 1; doneCtrl+cuntuk 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 Cloud Console, buka halaman Mengelola resource.
- Dalam daftar project, pilih project yang ingin Anda hapus, lalu klik Delete.
- Pada dialog, ketik project ID, lalu klik Shut down untuk menghapus project.