L
Kubernetes & CI/CD • Literally Web ID

Arsitektur High Availability & Auto-Scaling Kubernetes di Cloud Native

⏱️ 25 menit baca • 📅 13 Oct 2026 • 👁️ 1 views
Arsitektur High Availability & Auto-Scaling Kubernetes di Cloud Native

1. Konteks Industri & Analisis Akar Masalah

Dalam lanskap aplikasi web enterprise modern, kegagalan infrastruktur bukanlah sebuah kemungkinan hipotesis, melainkan sebuah keniscayaan waktu. Ketika sebuah aplikasi web menghadapi lonjakan trafik mendadak—baik karena kampanye pemasaran, serangan Distributed Denial of Service (DDoS), maupun lonjakan transaksi organik—sistem monolitik tradisional atau klaster server statis sering kali mengalami kelumpuhan. Botol penanganan performa (performance bottlenecks) biasanya muncul pada tingkat web server (Nginx/Apache), manajemen proses backend (PHP-FPM, Node.js cluster, Go routines), ketidakmampuan koneksi database (MySQL/MariaDB connection starvation), hingga latensi tinggi pada sistem caching (Redis).

Sebelum penerapan arsitektur High Availability (HA) dan Auto-Scaling berbasis Kubernetes yang matang, tim infrastruktur sering kali mengandalkan over-provisioning—menyediakan kapasitas server fisik atau virtual machine (VM) dalam jumlah masif yang dibiayai secara konstan. Dampaknya? Efisiensi biaya operasional (OpEx) hancur karena sumber daya menganggur (idle) selama jam sepi, namun tetap jebol saat jam sibuk karena skalabilitas manual lambat merespons.

Sebaliknya, setelah mengimplementasikan arsitektur Kubernetes yang memanfaatkan Ingress Controller dinamis, Horizontal Pod Autoscaler (HPA), Cluster Autoscaler, serta manajemen StatefulSet untuk beban data persisten, sistem mampu beradaptasi secara real-time. Beban CPU dan memori dipantau per milidetik, pod baru di-spin up dalam hitungan detik, dan lalu lintas dari Cloudflare Edge dialirkan secara mulus melalui load balancer tanpa downtime sedikit pun. Transformasi ini mengubah infrastruktur dari yang rapuh menjadi sistem self-healing dan elastic.

2. Konsep Inti & Deep Dive Arsitektur

Untuk memahami bagaimana Kubernetes menangani ketersediaan tinggi dan penskalaan otomatis, kita harus membedah arsitektur internal dari komponen-komponen utamanya. Alur permintaan (request lifecycle) dimulai dari klien global, melewati jaringan CDN dan WAF, menghantam Ingress Controller, diteruskan ke Service, dan akhirnya mendarat di Pod aplikasi web.

[ Global Client / Browser ]
            │
            ▼
[ Cloudflare CDN & Edge WAF ]
            │ (SSL/TLS Termination & DNS A/CNAME)
            ▼
[ Load Balancer Provider (AWS ELB / GCP LB) ]
            │
            ▼
[ Ingress Controller (Nginx / Traefik Pods) ]
            │ (Routing Rules & SSL Passthrough)
            ▼
[ Kubernetes Service (ClusterIP) ]
            │ (Load Balancing via iptables / IPVS)
            ▼
[ Backend Pods (PHP-FPM / Node.js / Go) ] ◄── HPA (Metrics Server)
            │
            ├─────────────► [ Redis Cache (Session & Query Cache) ]
            └─────────────► [ MySQL / MariaDB Cluster (Primary/Replica) ]

Alur Kerja di Bawah Hood (Under the Hood)

  1. Edge & Ingress: Cloudflare menyaring ancaman melalui WAF dan mencairkan cache statis. Request masuk ke Ingress Controller di dalam klaster Kubernetes melalui Load Balancer eksternal.
  2. Routing & Service: Ingress mencocokkan path URL dengan aturan routing, lalu meneruskannya ke Kubernetes Service. Service mendistribusikan lalu lintas ke pod-pod aktif menggunakan mekanisme iptables atau IPVS.
  3. Application & Storage: Pod memproses logika bisnis, memanfaatkan Redis untuk pembacaan cepat, serta MySQL untuk penyimpanan transaksional persisten yang dikelola melalui Persistent Volume Claims (PVC).
  4. Auto-Scaling loop: Metrics Server terus-menerus mengumpulkan penggunaan CPU/Memory pod. Ketika ambang batas (threshold) terlampaui, HPA memicu API Kubernetes untuk menambah jumlah replika pod, sementara Cluster Autoscaler menambah node fisik di cloud provider jika node yang ada kehabisan kapasitas.

3. Perbandingan Komparatif / Analisis Pendekatan

Memilih strategi scaling dan manajemen state yang tepat menentukan stabilitas sistem Anda dalam produksi. Berikut adalah analisis perbandingan mendalam antara berbagai pendekatan infrastruktur:

Parameter Komparasi Static VM / Bare Metal HPA (Horizontal Pod Autoscaler) + Cluster Autoscaler KEDA (Kubernetes Event-driven Autoscaling) StatefulSet vs Deployment untuk Database
Waktu Skala Manual / Jam-an 15 - 60 Detik (Metrik CPU/RAM) < 5 Detik (Berbasis Event Eksternal) Deployment: Stateless / StatefulSet: Stateful terjamin
Efisiensi Biaya Buruk (Over-provisioning) Sangat Baik (Skala naik/turun otomatis) Optimal (Skala dari 0 saat tidak ada antrean) StatefulSet membutuhkan storage terdedikasikan
Kompleksitas Rendah Sedang Tinggi Tinggi (Membutuhkan StatefulSet + Operator DB)
Latensi Failover Tinggi (Manual intervention) Sedang (Pod Restart / Liveness Probe) Cepat (Event driven retries) Lambat jika terjadi kegagalan disk persisten
Rekomendasi Penggunaan Aplikasi legacy monolitik API Web modern, Frontend, Backend umum Sistem antrean pesan (RabbitMQ/SQS), WebSocket Database terdistribusi, Stateful backends, Redis master-replica

[!IMPORTANT] Jangan pernah menjalankan database transaksional (seperti MySQL) menggunakan Kubernetes Deployment standar dengan emptyDir atau storage non-persisten. Gunakan operator khusus (seperti Percona Operator atau Bitnami Helm Chart) yang memanfaatkan StatefulSet dan PersistentVolumeClaim (PVC) untuk menjaga konsistensi data lintas restart pod.

4. Prasyarat Sistem & Persiapan Lingkungan

Sebelum meluncurkan konfigurasi manifest Kubernetes, pastikan lingkungan operasional Anda memenuhi spesifikasi minimum berikut:

  • Klaster Kubernetes: Versi 1.25 atau lebih tinggi (mendukung API autoscaling/v2).
  • Cloud Provider / Infrastruktur: AWS EKS, GCP GKE, Azure AKS, atau bare-metal dengan kuberadm + metallb.
  • Storage Class: Dinamis (misalnya gp3 di AWS atau local-path untuk on-premise).
  • CLI Tools: kubectl, helm, jq, dan envsubst terinstal pada mesin manajemen.

Verifikasi bahwa Metrics Server telah terinstal di klaster Anda untuk memastikan HPA dapat membaca penggunaan sumber daya:

kubectl top nodes
kubectl top pods --all-namespaces

Jika perintah di atas mengembalikan data penggunaan CPU dan memori, klaster Anda siap untuk tahap implementasi.

5. Panduan Implementasi Langkah demi Langkah

Berikut adalah implementasi end-to-end yang mencakup Ingress Controller (Nginx), Cert-Manager untuk SSL otomatis, HPA, Cluster Autoscaler, serta StatefulSet untuk stateful backend.

Langkah 1: Instalasi Nginx Ingress Controller

helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo update
helm install ingress-nginx ingress-nginx/ingress-nginx \
  --namespace ingress-nginx \
  --create-namespace \
  --set controller.service.type=LoadBalancer

Langkah 2: Instalasi Cert-Manager untuk SSL Let's Encrypt Otomatis

kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.13.2/cert-manager.yaml

Buat file manifest cluster-issuer.yaml untuk konfigurasi Let's Encrypt:

apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
  name: letsencrypt-prod
spec:
  acme:
    server: https://acme-v02.api.letsencrypt.org/directory
    email: admin@domainanda.com
    privateKeySecretRef:
      name: letsencrypt-prod-account-key
    solvers:
    - http01:
        ingress:
          class: nginx

Terapkan issuer:

kubectl apply -f cluster-issuer.yaml

Langkah 3: Konfigurasi StatefulSet untuk Database MySQL (Production-Ready)

Buat file mysql-statefulset.yaml:

apiVersion: v1
kind: Service
metadata:
  name: mysql-headless
  namespace: production
  labels:
    app: mysql
spec:
    ports:
    - port: 3306
      name: mysql
    clusterIP: None
    selector:
      app: mysql
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: mysql
  namespace: production
spec:
  serviceName: "mysql-headless"
  replicas: 3
  selector:
    matchLabels:
      app: mysql
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
      - name: mysql
        image: mysql:8.0
        env:
        - name: MYSQL_ROOT_PASSWORD
          valueFrom:
            secretKeyRef:
              name: mysql-secret
              key: root-password
        ports:
        - containerPort: 3306
          name: mysql
        volumeMounts:
        - name: mysql-data
          mountPath: /var/lib/mysql
  volumeClaimTemplates:
  - metadata:
      name: mysql-data
    spec:
      accessModes: [ "ReadWriteOnce" ]
      storageClassName: "gp3"
      resources:
        requests:
          storage: 50Gi

Langkah 4: Konfigurasi Deployment Aplikasi Web, Ingress, dan HPA

Buat file webapp-stack.yaml yang menggabungkan Deployment, Service, Ingress, dan HPA:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: webapp-backend
  namespace: production
spec:
  replicas: 3
  selector:
    matchLabels:
      app: webapp-backend
  template:
    metadata:
      labels:
        app: webapp-backend
    spec:
      containers:
      - name: backend
        image: registry.domainanda.com/enterprise/webapp:v1.2.0
        ports:
        - containerPort: 8080
        resources:
          limits:
            cpu: "500m"
            memory: "512Mi"
          requests:
            cpu: "200m"
            memory: "256Mi"
        livenessProbe:
          httpGet:
            path: /healthz
            port: 8080
          initialDelaySeconds: 15
          periodSeconds: 10
        readinessProbe:
          httpGet:
            path: /ready
            port: 8080
          initialDelaySeconds: 5
          periodSeconds: 5
---
apiVersion: v1
kind: Service
metadata:
  name: webapp-service
  namespace: production
spec:
  selector:
    app: webapp-backend
  ports:
  - port: 80
    targetPort: 8080
  type: ClusterIP
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: webapp-ingress
  namespace: production
  annotations:
    cert-manager.io/cluster-issuer: "letsencrypt-prod"
    nginx.ingress.kubernetes.io/ssl-redirect: "true"
    nginx.ingress.kubernetes.io/proxy-body-size: "50m"
    nginx.ingress.kubernetes.io/rate-limit: "100"
spec:
  ingressClassName: nginx
  tls:
  - hosts:
    - app.domainanda.com
    secretName: webapp-tls-secret
  rules:
  - host: app.domainanda.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: webapp-service
            port:
              number: 80
---
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: webapp-hpa
  namespace: production
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: webapp-backend
  minReplicas: 3
  maxReplicas: 50
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 70
  behavior:
    scaleUp:
      stabilizationWindowSeconds: 0
      policies:
      - type: Percent
        value: 100
        periodSeconds: 15
    scaleDown:
      stabilizationWindowSeconds: 300
      policies:
      - type: Percent
        value: 10
        periodSeconds: 60

Terapkan manifest tersebut dengan perintah:

kubectl create namespace production --dry-run=client -o yaml | kubectl apply -f -
kubectl apply -f webapp-stack.yaml

6. Bedah Kode & Penjelasan Detail Baris Kunci

Mari kita bedah parameter krusial dari konfigurasi di atas untuk memahami dampak arsitekturalnya:

  • spec.behavior.scaleUp.stabilizationWindowSeconds: 0 pada HPA memastikan bahwa ketika lonjakan trafik terjadi, Kubernetes langsung melakukan scale-up tanpa penundaan (zero delay). Ini mencegah traffic dropping pada detik-detik awal lonjakan.
  • spec.behavior.scaleDown.stabilizationWindowSeconds: 300 memberikan jendela waktu 5 menit sebelum klaster melakukan scale-down. Parameter ini krusial untuk mencegah fenomena flapping (kondisi di mana pod terus-menerus naik-turun akibat fluktuasi trafik jangka pendek).
  • livenessProbe dan readinessProbe memastikan bahwa Ingress Controller tidak pernah mengirimkan lalu lintas ke pod yang sedang mengalami deadlock atau sedang dalam proses inisialisasi (warm-up).
  • volumeClaimTemplates pada StatefulSet menjamin setiap pod database (mysql-0, mysql-1, mysql-2) mempertahankan Volume persisten mereka sendiri yang tidak akan hilang meskipun pod mengalami terminasi total.

7. Skenario Produksi & Studi Kasus Dunia Nyata

Studi Kasus: E-Commerce Flash Sale (100.000 Concurrent Users)

Sebuah platform e-commerce mengadakan flash sale dengan estimasi 100.000 pengguna bersamaan. Tanpa persiapan, database MySQL akan mengalami connection pool exhaustion, dan web server akan mati karena kehabisan memori.

Strategi Mitigasi Solutif:

  1. Edge Caching: Cloudflare dikonfigurasi untuk menahan seluruh aset statis (HTML, CSS, JS, Gambar) dan melakukan cache pada halaman produk dengan TTL 30 detik.
  2. Database Read-Replica: StatefulSet MySQL dikonfigurasi dengan 1 Master dan 2 Replica. Aplikasi backend membaca data produk dari replica dan hanya menulis transaksi checkout ke master.
  3. HPA Agresif: Dengan menetapkan minReplicas: 20 sebelum acara dimulai, klaster memiliki kapasitas buffer instan. Saat trafik checkout melonjak, HPA menaikkan pod hingga maxReplicas: 100 berdasarkan utilisasi CPU 60%.
  4. Redis Session Store: Sesi pengguna dipisahkan dari memori pod lokal ke klaster Redis terpusat, memungkinkan pod aplikasi dihapus atau dibuat ulang tanpa memutuskan sesi login pengguna.

8. Common Pitfalls, Anti-Patterns & Solusi

Berikut adalah kesalahan fatal yang sering dilakukan oleh pengembang dan sysadmin saat mengelola Kubernetes di lingkungan produksi:

  • Anti-Pattern 1: Mengabaikan Request & Limit Sumber Daya
    • Dampak: Pod tanpa limit dapat memakan seluruh memori node, menyebabkan kernel Linux memicu OOM (Out of Memory) Killer dan menghentikan pod-pod penting secara acak.
    • Solusi: Selalu definisikan blok resources.requests dan resources.limits secara ketat pada setiap container.
  • Anti-Pattern 2: Menggunakan Latest Tag pada Image Docker
    • Dampak: Rollback menjadi mustahil dan pembaruan pod menghasilkan versi kode yang inkonsisten di antara node yang berbeda.
    • Solusi: Selalu gunakan semantic versioning atau SHA digest hash (misalnya v1.2.0).
  • Anti-Pattern 3: Salah Konfigurasi Readiness Probe yang Terlalu Agresif
    • Dampak: Pod dianggap gagal oleh Ingress dan langsung di-restart terus-menerus saat database mengalami latensi sesaat (cascading failure).
    • Solusi: Berikan initialDelaySeconds yang cukup dan failureThreshold minimal 3 kali percobaan sebelum pod dinyatakan tidak sehat.

9. Benchmark, Metrik Kinerja & Tuning Performa

Untuk memastikan klaster Anda siap menghadapi beban nyata, lakukan pengujian beban (load testing) menggunakan k6 atau wrk. Berikut adalah skrip pengujian k6 (load-test.js):

import http from 'k6/http';
import { check, sleep } from 'k6';

export const options = {
  stages: [
    { duration: '2m', target: 1000 }, // Ramp-up ke 1000 VU dalam 2 menit
    { duration: '5m', target: 5000 }, // Tahan di 5000 VU selama 5 menit
    { duration: '2m', target: 0 },    // Ramp-down ke 0
  ],
  thresholds: {
    http_req_duration: ['p(99)<500'], // 99% request harus di bawah 500ms
    http_req_failed: ['rate<0.01'],  // Error rate di bawah 1%
  },
};

export default function () {
  const res = http.get('https://app.domainanda.com/healthz');
  check(res, { 'status is 200': (r) => r.status === 200 });
  sleep(1);
}

Jalankan benchmark menggunakan perintah:

k6 run load-test.js

Interpretasi Hasil & Tuning Lanjutan: Jika metrik http_req_duration melonjak saat jumlah Virtual Users (VU) mencapai 3000, periksa utilisasi CPU node menggunakan kubectl top nodes. Jika node telah mencapai 85% utilisasi, pastikan Cluster Autoscaler terhubung ke cloud provider Anda untuk secara otomatis menambah node baru ke dalam klaster.

10. Checklist Penerapan Produksi & Kesimpulan

Sebelum meluncurkan arsitektur Kubernetes High Availability & Auto-Scaling ini ke lingkungan produksi, pastikan Anda telah mencentang seluruh poin dalam checklist berikut:

  • Resource Quotas & Limits: Semua deployment memiliki alokasi CPU/Memory requests & limits yang jelas.
  • Liveness & Readiness Probes: Dikonfigurasi dengan benar untuk mencegah traffic masuk ke pod yang rusak.
  • HPA & Metrics Server: Terpasang dan diuji dengan simulasi beban ringan.
  • Persistent Storage: Database dan stateful service menggunakan StatefulSet dengan PVC yang aman.
  • SSL/TLS & Ingress: Cert-Manager aktif dan memperbarui sertifikat Let's Encrypt secara otomatis.
  • Backup & Disaster Recovery: Snapshot volume berkala dan backup database otomatis telah dijadwalkan.
  • Observability: Integrasi Prometheus, Grafana, dan centralized logging (Loki/Elasticsearch) aktif memantau klaster.

Dengan mengikuti panduan komprehensif ini, Anda kini memiliki fondasi arsitektur cloud-native yang kokoh, elastis, dan siap menopang aplikasi web enterprise berskala jutaan pengguna tanpa rasa khawatir.

🏷️ Tags: #High Availability #Devops #Kubernetes #Cloud Native #Auto-Scaling