Site icon Learning & Doing

Continuous Delivery with Jenkins in Kubernetes Engine

Delivery

“Continuous Delivery with Jenkins in Kubernetes Engine”

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

gcloud config set compute/zone us-east1-d
gsutil cp gs://spls/gsp051/continuous-deployment-on-kubernetes.zip .
unzip continuous-deployment-on-kubernetes.zip
cd continuous-deployment-on-kubernetes

Menyiapkan Jenkins

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"
gcloud container clusters list
gcloud container clusters get-credentials jenkins-cd
kubectl cluster-info

Setup Helm

helm repo add jenkins https://charts.jenkins.io
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
gsutil cp gs://spls/gsp330/values.yaml jenkins/values.yaml
helm install cd jenkins/jenkins -f jenkins/values.yaml --wait
kubectl get pods
kubectl create clusterrolebinding jenkins-deploy --clusterrole=cluster-admin --serviceaccount=default:cd-jenkins
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 &
kubectl get svc

Connect Jenkins

printf $(kubectl get secret cd-jenkins -o jsonpath="{.data.jenkins-admin-password}" | base64 --decode);echo

Deploying Application

cd sample-app
kubectl create ns production
kubectl apply -f k8s/production -n production
kubectl apply -f k8s/canary -n production
kubectl apply -f k8s/services -n production
kubectl scale deployment gceme-frontend-production -n production --replicas 4
kubectl get pods -n production -l app=gceme -l role=frontend
kubectl get pods -n production -l app=gceme -l role=backend
kubectl get service gceme-frontend -n production
export FRONTEND_SERVICE_IP=$(kubectl get -o jsonpath="{.status.loadBalancer.ingress[0].ip}" --namespace=production services gceme-frontend)

Buat Jenkins Pipeline

gcloud source repos create default
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]"
git add .
git commit -m "Initial commit"
git push origin master

Tambahkan jenkins credential

Buat Jenkins job

https://source.developers.google.com/p/[PROJECT_ID]/r/default

Buat Development Environment

git checkout -b new-feature

Edit pipeline definition

nano Jenkinsfile
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

nano html.go
<div class="card orange">
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

Deploying Canary Release

git checkout -b canary
git push origin canary
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

git checkout master
git merge canary
git push origin master
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
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.

Exit mobile version