Real-Time Deployment Kubernetes using CI/CD Jenkins on Localhost. Portfolio oleh Jouzie Aulia Rezky
Real-Time Deployment Kubernetes using CI/CD Jenkins on Localhost
Portofolio oleh Jouzie Aulia Rezky
https://www.linkedin.com/in/aureezz/
Using stacks:
Table of Context
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
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.
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.