L
High Availability & Scaling • Literally Web ID

Arsitektur High Availability dan Zero-Downtime Deployment dengan Kubernetes

⏱️ 18 menit baca • 📅 15 Oct 2026 • 👁️ 1 views
Arsitektur High Availability dan Zero-Downtime Deployment dengan Kubernetes

1. Konteks Industri & Analisis Akar Masalah

Dalam lanskap arsitektur web modern yang menuntut ketersediaan layanan 99.999% (five-nines), kegagalan memperbarui aplikasi tanpa downtime bukan lagi sekadar gangguan teknis, melainkan bencana finansial dan reputasi. Di dunia nyata, infrastruktur enterprise menghadapi tekanan konstan: lonjakan traffic e-commerce yang mendadak, serangan DDoS, pembaruan kode harian oleh tim developer, hingga kegagalan infrastruktur fisik di tingkat datacenter.

Secara historis, penerapan pembaruan pada server monolitik tradisional atau mesin virtual (VM) sering kali melibatkan proses rolling manual atau blue-green deployment yang rentan terhadap kesalahan manusia (human error). Masalah klasik yang kerap muncul meliputi:

  • Koneksi Terputus (Dropped Connections): Saat aplikasi dimatikan secara mendadak oleh sistem orkestrasi, permintaan (request) aktif dari klien yang sedang memproses checkout pembayaran atau mengunggah data besar terputus begitu saja.
  • Cascading Failures: Pod baru yang baru saja di-spawn langsung dibanjiri traffic sebelum koneksi database internal atau cache warmup selesai, mengakibatkan lonjakan latensi dan crash massal.
  • Resource Starvation: Ketiadaan batasan kuota sumber daya (resource limits) menyebabkan pod baru memonopoli CPU/RAM, mencekik proses lain di node yang sama.

Perbandingan kondisi antara infrastruktur tradisional (Sebelum) dan arsitektur berbasis Kubernetes dengan High Availability (Sesudah) sangat kontras:

Parameter Sebelum (Traditional VM / Monolith) Sesudah (Kubernetes High Availability & Zero-Downtime)
Waktu Pembaruan Menit hingga jam, sering memerlukan maintenance window Detik hingga menit, sepenuhnya transparan tanpa downtime
Pemulihan Kegagalan Manual intervention (SSH, Restart Service) Otomatis melalui Self-healing, Liveness Probe, dan Node Auto-scaling
Distribusi Beban Load balancer statis (HAProxy/Nginx tunggal) Ingress Controller dinamis, Service Mesh, & Pod Disruption Budget
Kapasitas Skalabilitas Terbatas pada kapasitas satu atau sedikit VM Dinamis, otomatis scale out/in berdasarkan metrik kustom (HPA/KEDA)

[!WARNING] Mengabaikan konfigurasi graceful shutdown dan readiness probe pada aplikasi backend seperti Node.js atau PHP-FPM di dalam Kubernetes akan langsung menghasilkan HTTP 502/504 Bad Gateway saat proses rolling update berjalan.


2. Konsep Inti & Deep Dive Arsitektur

Untuk mencapai zero-downtime deployment dan high availability yang sejati di Kubernetes, kita harus memahami interaksi mendalam antara komponen-komponen inti: Deployment Controller, ReplicaSet, Pods, Services, Endpoints/EndpointSlices, Ingress Controller, dan Kubelet.

Alur kerja saat sebuah pembaruan (rolling update) diinisiasi melibatkan orkestrasi yang presisi:

+-------------------------------------------------------------------------+
|                        Ingress Controller (Nginx)                       |
+-------------------------------------------------------------------------+
                                     |
                                     v
+-------------------------------------------------------------------------+
|                       Kubernetes Service (ClusterIP)                    |
+-------------------------------------------------------------------------+
            |                                           |
            v                                           v
+-----------------------+                   +-----------------------+-
| Pod v1 (Terminating)  |                   | Pod v2 (Ready/Running)  |
| - SIGTERM received    |                   | - Passed Readiness    | 
| - PreStop hook active |                   | - Added to Endpoints    |
+-----------------------+                   +-------------------------+

Under the Hood: Alur Transisi Pod

  1. Inisiasi Pembaruan: Ketika manifes Deployment diubah (misalnya mengubah tag citra Docker dari v1.0 ke v1.1), Kubernetes Deployment Controller mulai membuat ReplicaSet baru.
  2. Skala Naik & Turun (MaxSurge & MaxUnavailable):
    • maxSurge: Menentukan berapa banyak pod yang dapat dibuat di atas jumlah desired replicas. Jika diatur ke 25%, kluster akan membuat pod tambahan melebihi kapasitas normal agar lalu lintas tidak terganggu.
    • maxUnavailable: Menentukan berapa banyak pod yang boleh mati selama proses pembaruan.
  3. Siklus Hidup Kematian Pod (Graceful Shutdown):
    • Saat pod lama akan dimatikan, Kubelet mengirimkan sinyal SIGTERM ke proses utama di dalam container.
    • Secara bersamaan, pod tersebut dihapus dari daftar Endpoints Service agar Ingress/Load Balancer berhenti mengarahkan traffic baru ke sana.
    • Hook preStop dieksekusi (biasanya berupa perintah sleep 10 untuk memastikan koneksi HTTP keep-alive yang sedang berlangsung selesai diproses).
    • Setelah jeda waktu terminationGracePeriodSeconds (default 30 detik), Kubelet mengirimkan SIGKILL untuk menghentikan proses secara paksa jika belum berhenti.

3. Perbandingan Komparatif / Analisis Pendekatan

Memilih strategi pembaruan dan konfigurasi HA sangat menentukan stabilitas sistem. Berikut adalah perbandingan mendalam antara tiga strategi deployment utama di Kubernetes:

Strategi Deployment Kelebihan Kekurangan Konsumsi Sumber Daya Latency & Impact Use Case Ideal
RollingUpdate (Default) Efisien sumber daya, mulus tanpa downtime, otomatis Kompleks dalam tuning probe dan graceful shutdown Rendah (hanya butuh kapasitas ekstra sesaat sesuai maxSurge) Sangat Rendah (jika probe & preStop dikonfigurasi benar) Sebagian besar aplikasi web stateless (PHP, Node.js, Go)
Recreate Sederhana, memastikan tidak ada dua versi berjalan bersamaan Menyebabkan downtime total selama proses penggantian Sangat Rendah Tinggi (Layanan terhenti total sesaat) Batch job, migrasi skema database sekali jalan
Blue/Green / Canary Aman untuk validasi fitur baru, rollback instan Membutuhkan duplikasi infrastruktur atau traffic splitting yang rumit Tinggi (Membutuhkan 2x kapasitas pod selama transisi) Minimal / Nol (Bergantung pada router traffic) Aplikasi finansial enterprise, sistem pembayaran kritis

[!TIP] Untuk beban kerja web skala besar, RollingUpdate dengan kombinasi Pod Disruption Budget (PDB) dan Ingress Controller dengan Dynamic Endpoint Synchronization adalah standar emas industri.


4. Prasyarat Sistem & Persiapan Lingkungan

Sebelum menyelam ke dalam implementasi file manifes Kubernetes, pastikan lingkungan Anda memenuhi spesifikasi minimum berikut:

  • Kluster Kubernetes: Versi 1.25 atau lebih tinggi (mendukung fitur EndpointSlice dan Graceful Termination yang lebih matang).
  • CLI Tools: kubectl terkonfigurasi dengan akses cluster-admin atau hak istimewa Deployment management.
  • Ingress Controller: Nginx Ingress Controller (atau Traefik / Envoy) terpasang di namespace ingress-nginx.
  • Container Registry: Akses privat/publik ke registry image (misalnya Docker Hub, AWS ECR, atau GitLab Registry).

Verifikasi kesiapan kluster dengan perintah berikut:

kubectl cluster-info
kubectl get nodes -o wide
kubectl get pods -n ingress-nginx

5. Panduan Implementasi Langkah demi Langkah

Berikut adalah implementasi nyata manifes Kubernetes yang mencakup Pod Disruption Budgets (PDB), Health Check Probes Best Practices, dan konfigurasi Deployment yang mendukung Zero-Downtime untuk aplikasi web modern (misalnya backend Go / Node.js / PHP-FPM).

Manifes Lengkap: production-stack.yaml

apiVersion: v1
kind: Namespace
metadata:
  name: production-web
---
apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
  name: web-app-pdb
  namespace: production-web
spec:
  minAvailable: 2
  selector:
    matchLabels:
      app: web-app
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-app
  namespace: production-web
  labels:
    app: web-app
spec: 
  replicas: 4
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 0
  selector:
    matchLabels:
      app: web-app
  template:
    metadata:
      labels:
        app: web-app
    spec:
      containers:
      - name: web-app
        image: registry.internal/enterprise/web-app:v2.4.0
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 8080
          name: http
        resources:
          limits:
            cpu: "500m"
            memory: "512Mi"
          requests:
            cpu: "200m"
            memory: "256Mi"
        lifecycle:
          preStop:
            exec:
              command: ["sh", "-c", "sleep 10"]
        startupProbe:
          httpGet:
            path: /healthz/startup
            port: 8080
          initialDelaySeconds: 5
          periodSeconds: 5
          failureThreshold: 12
        livenessProbe:
          httpGet:
            path: /healthz/live
            port: 8080
          periodSeconds: 10
          timeoutSeconds: 3
          failureThreshold: 3
        readinessProbe:
          httpGet:
            path: /healthz/ready
            port: 8080
          periodSeconds: 5
          timeoutSeconds: 2
          successThreshold: 1
          failureThreshold: 2
      terminationGracePeriodSeconds: 30
---
apiVersion: v1
kind: Service
metadata:
  name: web-app-svc
  namespace: production-web
  labels:
    app: web-app
spec:
  type: ClusterIP
  ports:
  - port: 80
    targetPort: 8080
    protocol: TCP
    name: http
  selector:
    app: web-app
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: web-app-ingress
  namespace: production-web
  annotations:
    cert-manager.io/cluster-issuer: "letsencrypt-prod"
    nginx.ingress.kubernetes.io/ssl-redirect: "true"
    nginx.ingress.kubernetes.io/proxy-connect-timeout: "10"
    nginx.ingress.kubernetes.io/proxy-read-timeout: "60"
    nginx.ingress.kubernetes.io/proxy-send-timeout: "60"
    nginx.ingress.kubernetes.io/upstream-keepalive-connections: "100"
    nginx.ingress.kubernetes.io/session-cookie-path: "/"
spec:
  ingressClassName: nginx
  tls:
  - hosts:
    - app.enterprise.com
    secretName: web-app-tls
  rules:
  - host: app.enterprise.com
    http:
      path: /v1
      pathType: Prefix
      backend:
        service: groot
        service:
          name: web-app-svc
          port:
            number: 80

6. Bedah Kode & Penjelasan Detail Baris Kunci

Mari kita bedah parameter paling krusial dalam file konfigurasi di atas untuk memahami bagaimana stabilitas sistem dipertahankan:

  1. maxUnavailable: 0 dan maxSurge: 1 dalam Strategi Deployment

    • Konfigurasi ini memastikan bahwa tidak ada pod yang dimatikan sebelum pod baru benar-benar siap beroperasi (maxUnavailable: 0). Penambahan maxSurge: 1 berarti kluster akan membuat satu pod ekstra di atas kuota replika standar (4 pod menjadi 5 pod sementara) selama proses rolling update berlangsung.
  2. PodDisruptionBudget (PDB)

    • Baris minAvailable: 2 menjamin bahwa bahkan ketika terjadi gangguan infrastruktur eksternal (seperti pemeliharaan node oleh administrator atau node draining otomatis), minimal 2 pod aplikasi akan selalu berjalan dan melayani traffic klien.
  3. Triad Health Probes (startupProbe, livenessProbe, readinessProbe)

    • startupProbe: Sangat penting untuk aplikasi legacy atau aplikasi dengan waktu booting lambat (misalnya memuat model AI atau koneksi database yang besar). Probe ini menonaktifkan liveness dan readiness sampai aplikasi selesai startup (hingga 60 detik dalam konfigurasi di atas).
    • readinessProbe: Menentukan apakah pod siap menerima traffic. Jika endpoint /healthz/ready mengembalikan kode HTTP 500, Kubernetes langsung mencabut pod dari daftar Endpoints Service.
    • livenessProbe: Menentukan kapan pod harus direstart total jika mengalami kebuntuan (deadlock atau memory leak).
  4. Lifecycle preStop hook & terminationGracePeriodSeconds

    • Perintah sleep 10 memberikan jeda agar Ingress Controller dan Kube-Proxy sempat menyinkronkan daftar endpoint sebelum proses internal container benar-benar dihentikan oleh SIGTERM.

7. Skenario Produksi & Studi Kasus Dunia Nyata

Dalam studi kasus nyata di platform e-commerce dengan 50.000 Concurrent Users (CCU) saat flash sale, penerapan konfigurasi di atas menghadapi ujian berat:

  • Lonjakan Traffic: HPA (Horizontal Pod Autoscaler) dikonfigurasi untuk menskalakan jumlah pod dari 4 menjadi 30 ketika utilisasi CPU mencapai 70%.
  • Pembaruan di Tengah Event: Tim meluncurkan patch keamanan mikro hotfix di tengah acara flash sale.
  • Hasil Observasi: Berkat konfigurasi maxUnavailable: 0 dan Readiness Probe yang responsif, zero dropped packets tercatat pada metrik Prometheus/Grafana. Ingress Nginx secara mulus mengalihkan koneksi baru ke pod baru sementara pod lama menyelesaikan sisa request checkout pelanggan.

8. Common Pitfalls, Anti-Patterns & Solusi

[!WARNING] Hindari kesalahan-kesalahan fatal berikut yang sering dilakukan oleh praktisi infrastruktur pemula:

  • Anti-Pattern 1: Mengabaikan Readiness Probe atau Menyamakannya dengan Liveness Probe
    • Dampak: Pod langsung menerima traffic padahal koneksi ke database Redis/MySQL belum terbentuk sepenuhnya, menghasilkan lonjakan HTTP 500 Error.
    • Solusi: Buat endpoint khusus /healthz/ready yang memvalidasi koneksi dependensi eksternal sebelum merespons status 200 OK.
  • Anti-Pattern 2: Menggunakan latest Tag pada Image Docker di Produksi
    • Dampak: Kegagalan rollback, ketidakpastian versi kode yang berjalan di setiap pod (caching issues).
    • Solusi: Selalu gunakan semantic versioning tag yang unik (misal: v2.4.0) atau SHA256 digest.
  • Anti-Pattern 3: Tanpa Resource Request & Limits
    • Dampak: Satu pod mengalami kebocoran memori (memory leak), memakan seluruh RAM node, dan menyebabkan kernel OOM (Out Of Memory) Killer mematikan pod penting lainnya (Node Starvation).

9. Benchmark, Metrik Kinerja & Tuning Performa

Untuk memastikan arsitektur Kubernetes tahan banting, lakukan pengujian beban (load testing) menggunakan tool seperti k6 atau wrk selama proses rolling update berlangsung.

Contoh skrip pengujian k6 sederhana (load-test.js):

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

export const options = {
  stages: [
    { duration: '2m', target: 500 }, // Ramp up ke 500 VU
    { duration: '5m', target: 500 }, // Pertahankan beban
    { duration: '2m', target: 0 },   // Ramp down
  ],
};

export default function () {
  const res = http.get('https://app.enterprise.com/v1/healthz/ready');
  check(res, {
    'status is 200': (r) => r.status === 200,
    'response time < 50ms': (r) => r.timings.duration < 50,
  });
  sleep(0.1);
}

Jalankan perintah rolling update secara bersamaan saat k6 berjalan untuk memonitor apakah ada request failure rate di atas 0.01%.


10. Checklist Penerapan Produksi & Kesimpulan

Sebelum meluncurkan konfigurasi ini ke lingkungan production, pastikan Anda telah mencentang seluruh item dalam daftar periksa berikut:

  • Semua Deployment memiliki strategy.rollingUpdate dengan maxUnavailable: 0.
  • PodDisruptionBudget dikonfigurasi untuk setiap aplikasi kritikal.
  • Ketiga jenis probe (startup, liveness, readiness) terdefinisi dengan path dan threshold yang akurat.
  • Konfigurasi preStop hook dengan perintah sleep sudah disematkan untuk menangani graceful termination.
  • Resource limits dan requests CPU/RAM telah diatur berdasarkan hasil profiling beban nyata.
  • Sistem monitoring (Prometheus & Grafana) mencatat metrik latensi dan error rate secara real-time.

Dengan menerapkan seluruh prinsip, arsitektur, dan file konfigurasi di atas, kluster Kubernetes Anda tidak hanya akan mencapai tingkat ketersediaan tinggi (High Availability), tetapi juga memberikan pengalaman pengguna yang mulus tanpa gangguan sekecil apa pun saat pembaruan sistem dilakukan.

🏷️ Tags: #High Availability #Devops #Kubernetes #Infrastructure #Cloud Native