Introduction
Hai, dari judulnya sangat menarik ya! Kali ini kita akan membahas teknologi yang sering digunakan untuk orkestrasi (manajemen) kontainer, kita akan coba menjelaskannya secara sederhana dan rampung.
Sebelum lanjut, kita harus paham terlebih dulu bedanya pod, node, dan cluster pada Kubernetes, singkatnya
- Pod : Bagian terkecil yang berisikan satu atau lebih kontainer didalamnya
- Node : Bagian fisik dari VM atau server yang berjalan (CPU, RAM, dll)
- Cluster : Kelompok dari node (master node dan worker node)
source: suse.com
Autoscaling Method
Kita masuk ke metode scaling pada server, terdapat dua metode yaitu:
- Horizontal Scaling : Menambahkan instances baru dengan spesifikasi yang sama, dan digunakan load balancing untuk membagi workloadnya
- Vertical Scaling : Memperbaharui resourcenya, seperti menambah RAM, CPU, dll, biasanya dapat menyebabkan downtime
Umumnya terdapat tiga metode Autoscaling dari kubernetes, antara lain:
- Horizontal Pod Autoscaler (HPA) : Autoscaling Horizontal pada pod
- Vertical Pod Autoscaler (VPA) : Autoscaling Vertical pada pod
- Cluster Autoscaler : Autoscaling cluster dengan menambah atau mengurangi nodenya
VPA Works
src: kubecost.com
Berdasarkan pada gambar terdapat beberapa services saat menjalankan VPA autoscaler, poin pentingnya terdapat pada service VPA Recommender, dia berperan menentukan spesifikasi yang sesuai berdasarkan pada konfigurasi VPA dan metrics yang diterima dari Metrics Server.
HPA Works
src: medium.com
Berdasarkan gambar tersebut hpa bekerja dengan melihat metrics dari tiap node, jika resource node melebihi atau kurang dari treshold yang telah di definisikan maka akan trigger autoscaler (HPA) dan memerintahkan replication controller (seperti replicaSet, deployment, atau statefulSet) untuk menambahkan atau mengurangi pod pada node.
Cluster Autoscaler
src: kubecost.com
Berdasarkan gambar tersebut, saat Cluster Autoscaler (CA) aktif akan mengecek apakah terdapat pod yang pending, selanjutnya di cek apakah butuh resource tambahan atau kelebihan resource? jika kelebihan maka cluster yang tidak terpakai (yang thresholdnya dibawah yang di set) akan di matikan. Jika kekurangan resource maka akan membuat node baru beserta dengan pod yang sudah disediakan. Bagaimana spek nodenya? Speknya disesuaikan dengan batasan yang telah di atur pada layanan cloud.
How to Set Them Up
Asumsikan kita memiliki beberapa instance VM yang sudah siap digunakan dan sudah terinstall kubectl dan terkoneksi, bisa gunakan cara berikut
# Ensure you're connected to your Kubernetes cluster
kubectl config current-context # Verify current cluster
kubectl cluster-info # Check cluster information
lalu untuk cara setup dibawah ini merupakan contoh simpel saja, serasikan dengan kebutuhan masing-masing dan tetap eksplorasi sendiri.
VPA Setup
- Instalasi VPA
# Clone VPA repository
git clone https://github.com/kubernetes/autoscaler.git
cd autoscaler/vertical-pod-autoscaler
# Install VPA
./hack/vpa-up.sh
- Buat vpa-config.yaml
# Definisi versi API untuk sumber daya VPA
apiVersion: autoscaling.k8s.io/v1
# Jenis sumber daya (dalam hal ini, Vertical Pod Autoscaler)
kind: VerticalPodAutoscaler
# Metadata untuk mengidentifikasi VPA ini
metadata:
name: my-app-vpa # Nama unik untuk VPA
# Spesifikasi konfigurasi VPA
spec:
# Referensi target deployment yang akan di-scaling
targetRef:
apiVersion: "apps/v1" # Versi API untuk deployment
kind: Deployment # Jenis sumber daya yang akan di-scaling
name: my-application # Nama deployment spesifik
# Kebijakan pembaruan sumber daya
updatePolicy:
updateMode: "Auto" # Secara otomatis memperbarui sumber daya pod
# Kebijakan sumber daya detail
resourcePolicy:
containerPolicies:
- containerName: "*" # Berlaku untuk semua kontainer
minAllowed: # Batas minimum sumber daya
cpu: 250m # 0.25 core CPU
memory: 50Mi # 50 Mebibyte memori
maxAllowed: # Batas maksimum sumber daya
cpu: 2 # 2 core CPU
memory: 2Gi # 2 Gibibyte memori
- Jalankan vpa-config.yaml
# First, ensure VPA is installed in your cluster
# (If not already installed)
git clone https://github.com/kubernetes/autoscaler.git
cd autoscaler/vertical-pod-autoscaler
./hack/vpa-up.sh
# Save the VPA configuration to a file (e.g., vpa-config.yaml)
kubectl apply -f vpa-config.yaml
kubectl get vpa
HPA Setup
- Instalasi metrics server
# Install metrics server
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
- Buat hpa-config.yaml
# Versi API untuk HPA (versi terbaru)
apiVersion: autoscaling/v2
# Jenis sumber daya Horizontal Pod Autoscaler
kind: HorizontalPodAutoscaler
# Metadata identifikasi HPA
metadata:
name: my-app-hpa # Nama unik untuk HPA
# Spesifikasi konfigurasi scaling
spec:
# Referensi deployment yang akan di-scaling
scaleTargetRef:
apiVersion: apps/v1 # Versi API deployment
kind: Deployment # Jenis sumber daya
name: my-application # Nama deployment spesifik
# Batasan jumlah replika
minReplicas: 2 # Minimal 2 pod yang berjalan
maxReplicas: 10 # Maksimal 10 pod yang berjalan
# Metrik untuk menentukan scaling
metrics:
- type: Resource # Jenis metrik berbasis sumber daya
resource:
name: cpu # Metrik penggunaan CPU
target:
type: Utilization # Berdasarkan persentase penggunaan
averageUtilization: 70 # Scale up jika penggunaan CPU di atas 70%
- type: Resource # Metrik sumber daya lainnya
resource:
name: memory # Metrik penggunaan memori
target:
type: Utilization # Berdasarkan persentase penggunaan
averageUtilization: 80 # Scale up jika penggunaan memori di atas 80%
- Menggunakan hpa-config.yaml
# Ensure metrics-server is installed first
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
# Save HPA configuration to a file (e.g., hpa-config.yaml)
kubectl apply -f hpa-config.yaml
kubectl get hpa
Cluster Autoscaler Setup
- Pastikan saat pembuatan instances sudah enable cluster autoscaling
- Buat cluster-autoscaler-deployment.yaml
# Versi API untuk deployment
apiVersion: apps/v1
# Jenis sumber daya (Deployment)
kind: Deployment
# Metadata deployment Cluster Autoscaler
metadata:
name: cluster-autoscaler # Nama deployment
namespace: kube-system # Namespace sistem Kubernetes
# Spesifikasi deployment
spec:
replicas: 1 # Jumlah replika Cluster Autoscaler
# Pemilih untuk mengidentifikasi pod
selector:
matchLabels:
app: cluster-autoscaler # Label untuk identifikasi
# Template pod
template:
metadata:
labels:
app: cluster-autoscaler # Label pod
# Spesifikasi kontainer
spec:
containers:
- name: cluster-autoscaler # Nama kontainer
# Gambar kontainer resmi Kubernetes
image: k8s.gcr.io/autoscaling/cluster-autoscaler:v1.22.2
# Perintah untuk menjalankan Cluster Autoscaler
command:
- ./cluster-autoscaler
- --cloud-provider=aws # Penyedia cloud (ubah sesuai kebutuhan)
- --nodes=2:10:my-node-group # Konfigurasi jumlah node (Min:Maks:NamaGrupNode)
- Gunakan cluster-autoscaler-deployment.yaml
# Depends on your cloud provider
# For AWS (using eksctl)
eksctl create cluster --managed --asg-access
# Or manually apply the cluster autoscaler deployment
kubectl apply -f cluster-autoscaler-deployment.yaml
# Check config
kubectl get pods -n kube-system | grep cluster-autoscaler
References
- Vertical Pod Autoscaler (VPA)
- Horizontal Pod Autoscaler (HPA)
- Cluster Autoscaler
- Metrics Server
- Comprehensive Autoscaling Guide