Orchestration Modern dengan Helm & Kubernetes (Minikube)
7 min read

Setelah berhasil mengotomatisasi build dan push Docker Image ke Registry, kita sampai pada tahap akhir yang paling krusial: menjalankan aplikasi di lingkungan produksi yang stabil dan terukur. Namun, mengelola puluhan file manifest YAML secara manual untuk setiap komponen Kubernetes sangatlah melelahkan dan rentan terhadap kesalahan (human error).
Oleh karena itu, di artikel ini kita akan menggunakan Helm, sebuah package manager untuk Kubernetes. Jika Docker adalah kontainer yang membawa barang, maka Kubernetes adalah pelabuhan yang mengatur ribuan kontainer tersebut agar tetap berjalan 24 jam. Helm bertindak seperti sistem apt atau npm yang membungkus seluruh konfigurasi infrastruktur menjadi satu paket modular bernama Chart.
Mengapa Kita Menggunakan Helm & Kubernetes?
Sebelum masuk ke teknis, mari kita pahami konsep inti yang akan kita implementasikan:
Templating & Reusability (Helm): Dibandingkan menulis YAML statis, Helm memungkinkan kita menggunakan variabel melalui
values.yaml. Kita bisa mengubah image tag, jumlah replika, atau konfigurasi database hanya dari satu file pusat.Self-Healing & Scaling (Kubernetes): Kubernetes memastikan aplikasi kamu selalu hidup. Jika sebuah Pod mati, ia akan otomatis menyalakannya kembali. Kita juga bisa melakukan Scaling (menambah jumlah Pod) secara instan saat trafik melonjak.
Horizontal Pod Autoscaler (HPA): Inilah fitur "cerdas" yang akan kita pelajari. Kubernetes secara otomatis akan menambah atau mengurangi jumlah Pod berdasarkan beban CPU atau RAM aplikasi, layaknya AC otomatis yang menyesuaikan suhu ruangan.
Rollback (Safety Net): Helm mencatat setiap riwayat deployment. Jika versi terbaru aplikasi kamu bermasalah di produksi, kamu bisa kembali ke versi stabil sebelumnya hanya dengan satu perintah dalam hitungan detik.
Persiapan Environment
Untuk mensimulasikan lingkungan produksi di mesin lokal tanpa biaya cloud yang mahal, pastikan kamu sudah menyiapkan dua alat utama berikut:
Minikube: Sebagai cluster Kubernetes satu node lokal untuk simulasi. Pastikan kamu sudah mengaktifkan
metrics-serveragar fitur autoscaling bisa berjalan (Gunakan perintah:minikube addons enable metrics-server).Helm CLI: Alat baris perintah yang terinstal di mesin kamu untuk mengelola, menginstal, dan melakukan upgrade pada Chart yang kita buat.
Instalasi Helm di Linux
Helm didistribusikan dalam bentuk biner yang sudah dikompilasi. Proses instalasinya sangat sederhana: kita mengunduh arsipnya, mengekstrak, dan memindahkannya ke folder binary sistem agar bisa diakses dari mana saja.
Prosedur Instalasi
Jalankan perintah berikut secara berurutan di terminal kamu:
# 1. Unduh paket biner Helm (Versi 3.12.0)
wget https://get.helm.sh/helm-v3.12.0-linux-amd64.tar.gz
# 2. Ekstrak file arsip
tar -zxvf helm-v3.12.0-linux-amd64.tar.gz
# 3. Pindahkan biner helm ke folder path sistem
sudo mv linux-amd64/helm /usr/local/bin/helm
# 4. Verifikasi instalasi
helm version
Memahami Perintah Dasar Helm
Setelah berhasil terinstal, kamu akan sering berinteraksi dengan beberapa perintah utama berikut:
helm search: Mencari charts yang tersedia di repositori publik.helm pull: Mengunduh chart ke direktori lokal untuk dipelajari isinya.helm install: Mengunggah dan menjalankan chart ke dalam cluster Kubernetes.helm list: Menampilkan daftar aplikasi (releases) yang sedang berjalan di cluster.
Konfigurasi Chart: values.yaml & secrets.yaml
Dalam Helm, kita memisahkan antara konfigurasi umum dan konfigurasi sensitif. Hal ini dilakukan agar kita bisa membagikan konfigurasi infrastruktur tanpa membocorkan kredensial database atau app key.
Konfigurasi Aplikasi: helm/values.yaml
File ini berisi blueprint dasar aplikasi, seperti lokasi image di Docker Hub dan pengaturan environment non-sensitif.
php:
repository: "cehamot/rssejahterapp"
tag: "8" # Gunakan tag spesifik atau 'latest'
fpmEnabled: false
resources:
limits:
cpu: 500m
memory: 512Mi
requests:
cpu: 200m
memory: 256Mi
envVars:
- name: APP_ENV
value: "production"
- name: APP_DEBUG
value: "false"
- name: DB_PORT
value: "3306"
- name: DB_HOST
value: "localhost" # Sesuaikan jika menggunakan service database internal
Konfigurasi Sensitif: helm/secrets.yaml
File ini menampung data yang tidak boleh diketahui publik. Catatan Penting: Di produksi, file ini wajib dienkripsi (misal menggunakan Helm Secrets atau Sops).
mysql:
rootPassword: "secret123"
user: "dani"
password: "secret123"
database: "db_rssejahtera"
php:
envVars:
- name: APP_KEY
value: "base64:V0xAWsrcyAPMY1+kgysAWm2ptVSA11+UAu78o/MqDjI="
- name: DB_DATABASE
value: "db_rssejahtera"
- name: DB_USERNAME
value: "dani"
- name: DB_PASSWORD
value: "secret123"
Mengamankan Data Sensitif
Jangan pernah membiarkan password database bocor ke repositori Git atau masuk ke dalam Docker Image. Kita akan mendaftarkan secrets.yml ke dalam daftar abaikan (ignore list).
# Pastikan file rahasia tidak ter-upload ke Git dan Docker Image
echo "helm/secrets.yml" >> .gitignore
echo "helm/secrets.yml" >> .dockerignore
Inisialisasi Cluster & Repositori
Kita akan menggunakan Minikube sebagai simulasi cluster dan menambahkan repositori LAMP (Linux, Apache, MySQL, PHP) yang sudah menyediakan template siap pakai untuk aplikasi Laravel.
# Jalankan cluster Kubernetes lokal
minikube start
# Tambahkan repositori Helm LAMP
helm repo add lamp https://lead4good.github.io/lamp-helm-repository
helm repo update
helm install rssejahteraapp -f helm/values.yml -f helm/secrets.yml lamp/lamp
minikube service rssejahteraapp-lamp --url

Setelah semua komponen (PHP-FPM/Apache dan MySQL) berjalan di Kubernetes, langkah terakhir adalah mengisi struktur database aplikasi Laravel kamu. Karena database MySQL di dalam Kubernetes masih kosong, kita perlu menjalankan perintah migrasi dari dalam Pod aplikasi.
Eksekusi Migrasi
Pastikan Pod kamu sudah berstatus Running dengan mengeceknya melalui kubectl get pods. Setelah itu, jalankan perintah berikut:
# Ganti <nama-pod-php> dengan nama pod yang muncul di kubectl get pods
kubectl exec <nama-pod-php> -- php artisan migrate:fresh --seed --force


Upgrade
Dalam siklus DevOps, perubahan kode adalah hal yang rutin. Dengan Helm, kita bisa memperbarui versi aplikasi tanpa harus menghapus dan mengulang instalasi dari awal. Kubernetes akan mengganti Pod lama dengan Pod baru secara bertahap (Rolling Update), sehingga pengguna tidak akan merasakan gangguan akses.
Langkah-langkah Pembaruan:
Update Versi Image: Buka file konfigurasi dan perbarui
tagimage ke versi terbaru yang sudah kamu push ke Docker Hub.Bash
nano helm/values.yaml # Ubah tag: "8" menjadi tag: "9" (misalnya)Eksekusi Upgrade: Jalankan perintah
upgradeuntuk menerapkan perubahan. Helm akan membandingkan konfigurasi lama dengan yang baru, lalu melakukan pembaruan secara cerdas.Bash
helm upgrade rssejahteraapp lamp/lamp -f helm/values.yml -f helm/secrets.yml


Rollback
Salah satu keunggulan terbesar menggunakan Helm adalah kemampuannya untuk menyimpan riwayat setiap perubahan yang kita lakukan. Jika proses upgrade sebelumnya menyebabkan masalah pada aplikasi, kita bisa melakukan undo dalam hitungan detik.
1. Cek Riwayat Rilis
Sebelum melakukan rollback, kita perlu melihat daftar revisi yang pernah kita buat untuk menentukan versi stabil mana yang akan kita tuju.
$ helm history rssejahteraapp
Perintah ini akan menampilkan daftar REVISION, DESCRIPTION, dan STATUS dari setiap deployment kamu.

2. Eksekusi Rollback
Misalkan rilis terakhir (Revisi 2) bermasalah, dan kita ingin kembali ke kondisi awal (Revisi 1), jalankan perintah berikut:
$ helm rollback rssejahteraapp 1

Scale
Terkadang, kamu sudah tahu bahwa trafik akan melonjak (misalnya saat pengumuman pendaftaran atau promo). Dalam kondisi ini, kamu tidak perlu menunggu sistem otomatis bekerja. Kamu bisa menambah jumlah "tenaga" (Pod) aplikasi Laravel kamu secara manual dalam hitungan detik.
1. Identifikasi Deployment
Sebelum melakukan scaling, kita perlu memastikan nama deployment yang sedang berjalan di cluster kita.
kubectl get deployments

2. Eksekusi Scale Up
Jika saat ini aplikasi hanya berjalan dengan 1 Pod, kita bisa meningkatkannya menjadi 2 atau lebih sesuai kebutuhan spesifikasi server kamu.
# Mengubah jumlah replika menjadi 2 pod secara instan
kubectl scale --replicas 2 deployment/rssejahteraapp-lamp

delete salah satu pod, agar terlihat akan mereplica kembali pod yang sudah di delete.

Autoscaling
Manual scaling sangat berguna, namun dalam dunia nyata, trafik tidak selalu bisa diprediksi. Kita tidak mungkin memantau layar terminal 24 jam hanya untuk menambah Pod. Di sinilah Horizontal Pod Autoscaler (HPA) berperan. HPA secara otomatis akan menambah atau mengurangi jumlah Pod berdasarkan beban kerja (CPU/RAM) secara real-time.
1. Implementasi: hpa.yml
Buatlah file konfigurasi untuk mendefinisikan aturan main autoscaling kamu.
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: rssejahteraapp-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: rssejahteraapp-lamp # Pastikan nama sesuai dengan Deployment kamu
minReplicas: 1 # Jumlah minimum Pod saat trafik sepi
maxReplicas: 4 # Jumlah maksimum Pod saat trafik memuncak
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 60 # Kubernetes akan menambah Pod jika CPU rata-rata > 60%
2. Eksekusi Konfigurasi
Terapkan file tersebut ke dalam cluster kamu:
kubectl apply -f helm/hpa.yml

Setelah kita selesai bereksperimen dan mempelajari seluruh alur kerja Kubernetes, jangan lupa untuk membersihkan kembali resource di cluster kamu. Hal ini sangat penting untuk menjaga performa mesin lokal (Minikube) agar tidak terbebani oleh aplikasi yang sudah tidak digunakan.
Menghapus Aplikasi & Menghentikan Cluster
Jalankan perintah berikut untuk menghapus seluruh deployment Helm dan mematikan Minikube dengan aman:
# 1. Menghapus seluruh resource aplikasi (Deployment, Service, HPA)
helm delete rssejahteraapp
# 2. Menghentikan cluster Minikube agar menghemat RAM/CPU laptop kamu
minikube stop


