“Continuous Delivery with Jenkins in Kubernetes Engine”
Daftar Isi
Apa itu Kubernetes Engine?
Kubernetes Engine adalah versi Kubernetes yang dihosting oleh Google Cloud – pengelola cluster dan sistem orkestrasi yang andal untuk container. Kubernetes adalah proyek open source yang dapat berjalan di banyak lingkungan berbeda—dari laptop hingga cluster multi-node dengan ketersediaan tinggi; dari mesin virtual hingga bare metal. Seperti yang disebutkan sebelumnya, aplikasi Kubernetes dibangun di atas container – ini adalah aplikasi ringan yang dibundel dengan semua dependensi dan library yang diperlukan untuk menjalankannya. Struktur dasar ini membuat aplikasi Kubernetes sangat tersedia, aman, dan cepat untuk diterapkan—kerangka kerja yang ideal untuk pengembang cloud.
Apa itu Jenkins?
Jenkins adalah server otomatisasi open-source yang memungkinkan Anda secara fleksibel mengatur pipeline build, pengujian, dan penerapan Anda. Jenkins memungkinkan pengembang untuk beralih dengan cepat pada proyek tanpa khawatir tentang masalah overhead yang dapat berasal dari pengiriman berkelanjutan.
Apa itu Continuous Delivery / Continuous Deployment?
Saat Anda perlu menyiapkan pipeline continuous delivery (CD), penerapan Jenkins di Kubernetes Engine memberikan manfaat penting dibandingkan penerapan berbasis VM standar.
Saat proses build Anda menggunakan container, satu host virtual dapat menjalankan pekerjaan di beberapa sistem operasi. Kubernetes Engine menyediakan eksekutor build singkat—ini hanya digunakan saat build aktif berjalan, yang menyisakan sumber daya untuk tugas cluster lain seperti tugas pemrosesan batch. Manfaat lain dari eksekutor build singkat adalah kecepatan—mereka diluncurkan dalam hitungan detik.
Kubernetes Engine juga dilengkapi dengan penyeimbang beban global Google, yang dapat Anda gunakan untuk mengotomatiskan perutean lalu lintas web ke instance Anda. Penyeimbang beban menangani penghentian SSL dan menggunakan alamat IP global yang dikonfigurasi dengan jaringan tulang punggung Google—digabungkan dengan bagian depan web Anda, penyeimbang beban ini akan selalu mengatur pengguna Anda di jalur tercepat yang memungkinkan ke instans aplikasi. Sekarang setelah Anda belajar sedikit tentang Kubernetes, Jenkins, dan bagaimana keduanya berinteraksi dalam pipa CD, saatnya untuk membangun satu.
Download source code
- Setting zone
gcloud config set compute/zone us-east1-d
- Copy Sample Code
gsutil cp gs://spls/gsp051/continuous-deployment-on-kubernetes.zip .
- Unzip File
unzip continuous-deployment-on-kubernetes.zip
- Masuk ke directori
cd continuous-deployment-on-kubernetes
Menyiapkan Jenkins
- Buat Cluster Kubernet
gcloud container clusters create jenkins-cd \ --num-nodes 2 \ --machine-type n1-standard-2 \ --scopes "https://www.googleapis.com/auth/source.read_write,cloud-platform"
- Cek Cluster
gcloud container clusters list
- Get credential
gcloud container clusters get-credentials jenkins-cd
- Test Connection ke cluster
kubectl cluster-info
Setup Helm
- Tambah helm repo
helm repo add jenkins https://charts.jenkins.io
- Update repo
helm repo update
Configure dan Install Jenkins
Tambahkan beberapa plugin :
Kubernetes:1.29.4 Workflow-multibranch:latest Git:4.7.1 Configuration-as-code:1.51 Google-oauth-plugin:latest Google-source-plugin:latest Google-storage-plugin:latest
- Download custom value
gsutil cp gs://spls/gsp330/values.yaml jenkins/values.yaml
- Deploy dengan helm
helm install cd jenkins/jenkins -f jenkins/values.yaml --wait
- Cek list pod jenkins
kubectl get pods
- Konfigurasi service jenkins
kubectl create clusterrolebinding jenkins-deploy --clusterrole=cluster-admin --serviceaccount=default:cd-jenkins
- Buat port forwading
export POD_NAME=$(kubectl get pods --namespace default -l "app.kubernetes.io/component=jenkins-master" -l "app.kubernetes.io/instance=cd" -o jsonpath="{.items[0].metadata.name}") kubectl port-forward $POD_NAME 8080:8080 >> /dev/null &
- Cek list service
kubectl get svc
Connect Jenkins
- Buat password admin
printf $(kubectl get secret cd-jenkins -o jsonpath="{.data.jenkins-admin-password}" | base64 --decode);echo
- Klik Web Preview -> Preview on port 8080
Deploying Application
- Di cloud shell masuk ke directory
cd sample-app
- Buat namespace
kubectl create ns production
- Deploy production dan canary
kubectl apply -f k8s/production -n production kubectl apply -f k8s/canary -n production kubectl apply -f k8s/services -n production
- Scale up production environment frontends
kubectl scale deployment gceme-frontend-production -n production --replicas 4
- cek list pod frontend
kubectl get pods -n production -l app=gceme -l role=frontend
- cek list pod backend
kubectl get pods -n production -l app=gceme -l role=backend
- cek external IP untuk prodaction
kubectl get service gceme-frontend -n production
- store frontend service load balancer
export FRONTEND_SERVICE_IP=$(kubectl get -o jsonpath="{.status.loadBalancer.ingress[0].ip}" --namespace=production services gceme-frontend)
Buat Jenkins Pipeline
- Buat repo
gcloud source repos create default
- init
git init git config credential.helper gcloud.sh git remote add origin https://source.developers.google.com/p/$DEVSHELL_PROJECT_ID/r/default
git config --global user.email "[EMAIL_ADDRESS]" git config --global user.name "[USERNAME]"
- commit dan push
git add . git commit -m "Initial commit" git push origin master
Tambahkan jenkins credential
- Masuk ke jenkins -> Manage Jenkins -> Manage Credentials
- Klik jenkins
- Klik Global credentials (unrestricted)
- Klik Add Credentials
- Pilih Google Service Account from metadata -> Ok
Buat Jenkins job
- Klik new Item
- nama project sample-app -> pilih Multibranch Pipeline -> Ok
- Pada bagian Branch Sources -> Klik Add Source dan Pilih Git
- Paste clone URL
https://source.developers.google.com/p/[PROJECT_ID]/r/default
- Pada Credentials drop-down -> Pilih credential yang sebelumnya di buat
- Kemdian di bagian Scan Multibranch Pipeline Triggers -> cek Scan Multibranch Pipeline Triggers -> intervalnya 1 menit
- Klik Save
Buat Development Environment
- Buat development branch
git checkout -b new-feature
Edit pipeline definition
- Buka jenkins file
nano Jenkinsfile
- Ganti dengan project mu
PROJECT = "REPLACE_WITH_YOUR_PROJECT_ID" APP_NAME = "gceme" FE_SVC_NAME = "${APP_NAME}-frontend" CLUSTER = "jenkins-cd" CLUSTER_ZONE = "us-east1-d" IMAGE_TAG = "gcr.io/${PROJECT}/${APP_NAME}:${env.BRANCH_NAME}.${env.BUILD_NUMBER}" JENKINS_CRED = "${PROJECT}"
Modify site
- Edit html.go
nano html.go
- Ganti dari blue jadi orange
<div class="card orange">
- Ganti version
const version string = "2.0.0"
Memulai Deployment
git add Jenkinsfile html.go main.go git commit -m "Version 2.0.0" git push origin new-feature
- Cek jenkins
Deploying Canary Release
- Buat branch dan push
git checkout -b canary git push origin canary
- Cek service
export FRONTEND_SERVICE_IP=$(kubectl get -o \ jsonpath="{.status.loadBalancer.ingress[0].ip}" --namespace=production services gceme-frontend)
while true; do curl http://$FRONTEND_SERVICE_IP/version; sleep 1; done
Deploying to production
- Buat brance dan push ke server git
git checkout master git merge canary git push origin master
- Cek di Jenkins harusnya sudah terbentuk
- Cek service
export FRONTEND_SERVICE_IP=$(kubectl get -o \ jsonpath="{.status.loadBalancer.ingress[0].ip}" --namespace=production services gceme-frontend)
while true; do curl http://$FRONTEND_SERVICE_IP/version; sleep 1; done
- Cek external IP
kubectl get service gceme-frontend -n production
Penutup
Sahabat Blog Learning & Doing demikianlah penjelasan mengenai Continuous Delivery with Jenkins in Kubernetes Engine. Semoga Bermanfaat . Sampai ketemu lagi di postingan berikut nya.