Real-Time Deployment Kubernetes using CI/CD Jenkins on Localhost
Portofolio oleh Jouzie Aulia Rezky
https://www.linkedin.com/in/aureezz/
Using stacks:
- Windows Subsytem Linux Ubuntu Distro
- Jenkins
- Ngrok
- Docker Desktop (Windows)
- Kubernetes (minikube & kubectl)
Table of Context
- Skenario Alur CI/CD
- Arsitektur Kubernetes Cluster
- Setup Job Jenkins
- Deployment Phase
- Not Using Latest Tag
- Computational Resource
- Rollback Deployment
Portofolio ini saya buat semirip mungkin dengan Real-Case yang terjadi di Production.
Kubernetes YAML: https://github.com/aureezzhenx/k8s-jenkins-deploy/blob/main/Deployment.yml
- Developer melakukan Push ke Git Repository.
- Git Repository akan mengirim Request POST ke URL Jenkins yang sudah di Tunnel HTTP PORT 8080 oleh NGROK sebagai Webhook untuk Event Push.
- Jenkins menerima Trigger Event Push dari Webhook.
- Jenkins akan melakukan 3 Job, yaitu membuat Image dari Dockerfile namun tidak memakai versi latest (best practice), lalu Push Image ke Container Registery, lalu Apply Deployment ke Kubernetes Cluster. Untuk di kasus ini, Container Registry yang dipakai adalah Docker Hub.
Karena Defaultnya Deployment di Kubernetes itu adalah otomatis membuat ReplicaSet, jadi Deployment Kubernetes itu tidak ada Downtime, karena alur Deployment di Kubernetes hanya meng-ganti ReplicaSet yang sebelumnya sudah ada diganti jadi ReplicaSet yang baru dari hasil Deployment Kubernetes, lalu akan Terminating ReplicaSet yang sebelumnya.
- Deployment/ReplicaSet. Default: Service Kubernetes Deployment akan secara otomatis membuat ReplicaSet, namun di kasus ini saya menggantikan ReplicaSet menjadi Horizontal Pod AutoScaller.
- Masing-Masing Pod akan mengirim informasi penggunaan Resource Hardware ke services Metrics Server sebagai acuan parameter Trigger untuk service Horizontal Pod AutoScaller.
- Horizontal Pod AutoScaller. Jika CPU Usage di Pod ada di angka rata-rata 70%, maka akan menambah 1 Pod. Jika tidak maka akan berkurang 1 Pod. Minimal Replica: 2, Maksimal Replica: 5
- Masing-masing Pod akan dibatasi penggunaan Resourcenya. Batas maksimal penggunaan Resource masing-masing Pod: 1 Core CPU dan 1GB RAM Memory
- Load Balancer. Meng-ekspos aplikasi yang ada di Pod Kubernetes Cluster untuk sisi Client.
- Semua service ada di satu Namespace yang sama, yaitu backend.
Penggunaan Horizontal Pod Autoscaler sangat membantu untuk mengatasi masalah Backpressure di Production jika aplikasi yang ada di Pod menerima Traffic terlalu banyak.
Mengapa hanya 1GB Memory dan 1 Core yang didapatkan setiap Pod? Karena kemampuan komputer saya meng-running kasus ini terlalu berat. Adapun jika di Case Production, limitasi Resource ini sangat perlu agar Resource tidak terpakai oleh aplikasi saja, masih ada Free Resource untuk sistem operasinya.
Kubernetes YAML: https://github.com/aureezzhenx/k8s-jenkins-deploy/blob/main/Deployment.yml
Image Version Docker yang dibuat oleh Job Jenkins saya tidak memakai tag Latest sebagai best-practicenya, saya memakai Environment Build ID dari Jenkins.
# Execute Shell
export NAMA_IMAGE=$JOB_NAME
export VERSION_BUILD=$BUILD_ID
# deployment.yml line 34
image: aureezzhenx/$NAMA_IMAGE:v1.$VERSION_BUILD
Tunnel Port 8080 menggunakan NGROK. Port 8080 adalah Jenkins
Input Payload URL Webhook yang sudah di port-forward oleh NGROK di pengaturan Repository.
Membuat Freestyle Project di Jenkins
Mengatur Job
Execute Shell
# Build container and push to registry (hub.docker)
docker build -t aureezzhenx/$JOB_NAME:v1.$BUILD_ID .
docker push aureezzhenx/$JOB_NAME:v1.$BUILD_ID
# Store ENV for versioning image (not using latest tag)
export NAMA_IMAGE=$JOB_NAME
export VERSION_BUILD=$BUILD_ID
# Deploy image ke k8s cluster
cat Deployment.yml | sed 's/$NAMA_IMAGE/'"$JOB_NAME"'/' | sed 's/$VERSION_BUILD/'"$BUILD_ID"'/' | kubectl apply -f -
Image Version Docker yang dibuat oleh Job Jenkins saya tidak memakai tag Latest sebagai best-practicenya, saya memakai Environment Build ID dari Jenkins.
Jenkins akan menerima trigger dari Webhook jika Developer ada aktifitas Push ke Repository. Di Deployment Phase ini untuk Build ID nya adalah 55
Deployment Sukses
Hasil Docker Image yang sudah dibuat oleh Job Jenkins, tidak menggunakan versi latest.