Skip to content

Understanding Kubernetes Autoscaler

Updated: at 04:25 AM

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

  1. Instalasi VPA
# Clone VPA repository
git clone https://github.com/kubernetes/autoscaler.git
cd autoscaler/vertical-pod-autoscaler

# Install VPA
./hack/vpa-up.sh
  1. 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
  1. 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

  1. Instalasi metrics server
# Install metrics server
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
  1. 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%
  1. 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

  1. Pastikan saat pembuatan instances sudah enable cluster autoscaling
  2. 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)
  1. 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

  1. Vertical Pod Autoscaler (VPA)
  1. Horizontal Pod Autoscaler (HPA)
  1. Cluster Autoscaler
  1. Metrics Server
  1. Comprehensive Autoscaling Guide