L
Kubernetes & CI/CD • Literally Web ID

Arsitektur High Availability & Zero Downtime Deployment pada Cluster Kubernetes

⏱️ 22 menit baca • 📅 13 Oct 2026 • 👁️ 2 views
Arsitektur High Availability & Zero Downtime Deployment pada Cluster Kubernetes

1. Konteks Industri & Analisis Akar Masalah

Dalam lanskap enterprise modern, ketersediaan tinggi (High Availability) dan penyebaran tanpa henti (Zero Downtime Deployment) bukan lagi sekadar fitur opsional, melainkan fondasi mutlak. Arsitektur web modern yang menopang ekosistem hibrida—mulai dari frontend berbasis HTML5/CSS3/JavaScript modern, backend tangguh berbahasa Go, Node.js, atau PHP-FPM, hingga infrastruktur pendukung seperti Nginx reverse proxy, DNS (Record A, CNAME, MX, SPF, DKIM, DMARC), Cloudflare CDN & WAF, Fail2ban, Let's Encrypt SSL/TLS, Postfix SMTP mail relay, MinIO/S3 object storage, Supervisor background queue, Redis caching, hingga database transaksional MySQL/MariaDB—menghadapi tantangan skalabilitas ekstrem yang tidak boleh mengalami single point of failure (SPOF).

Secara historis, kegagalan saat melakukan pembaruan aplikasi (deployment) sering kali menyebabkan gangguan layanan, koneksi terputus secara tiba-tiba bagi klien real-time (WebSocket), atau lonjakan latensi akibat cold start pada backend. Bottleneck performa di dunia nyata biasanya bersumber dari manajemen memori yang buruk pada Node.js, process blocking pada PHP-FPM di bawah beban ribuan concurrent connections, hingga konfigurasi readiness dan liveness probe Kubernetes yang terlalu agresif sehingga memicu cascading failure.

Perbandingan Kondisi: Sebelum vs Sesudah Penerapan

Parameter Operasional Sebelum (Legacy / Basic K8s) Sesudah (Enterprise HA & Zero Downtime)
Waktu Downtime per Release 2 - 15 Menit (Recreate Strategy) 0 Detik (Rolling Update terkelola)
Penanganan Traffic Gagal Terputus mendadak (Connection Reset) Graceful Termination & Connection Draining
Respon terhadap Lonjakan Beban Manual Scaling atau Auto-scaler Lambat Predictive HPA & Ingress Rate Limiting
Pemulihan Bencana (etcd) Berisiko kehilangan state cluster Automated Snapshot & Disaster Recovery Plan

2. Konsep Inti & Deep Dive Arsitektur

Arsitektur High Availability pada Kubernetes bertumpu pada redundansi tingkat kontrol (control plane HA dengan multi-master etcd quorum) dan redundansi tingkat pekerja (worker nodes). Alur data (data flow) dari klien eksternal hingga mencapai container aplikasi melewati beberapa lapisan pertahanan dan perutean.

[ Klien / Pengguna ] 
        │ (HTTPS / TLS 1.3)
        ▼
[ Cloudflare CDN / WAF / Edge Caching ]
        │ (Origin IP / Proxy)
        ▼
[ Load Balancer Eksternal (MetalLB / Cloud LB) ]
        │
        ▼
[ Ingress Controller (Nginx / Traefik Pods) ]
        │ (HTTP Routing / TLS Termination)
        ▼
[ Kubernetes Service (ClusterIP) ]
        │ (iptables / IPVS Load Balancing)
        ▼
[ Pod Aplikasi (Go / Node.js / PHP-FPM) ] ──> [ Redis Cache / MySQL DB ]

Alur Eksekusi Zero Downtime Rolling Update

  1. Permintaan Pembaruan: Pipeline CI/CD mengirimkan patch versi image baru ke Kubernetes API Server.
  2. Kalkulasi MaxSurge & MaxUnavailable: Kubernetes membuat Pod baru dengan versi aplikasi yang diperbarui.
  3. Readiness Probe Check: Ingress/Service menahan traffic hingga Pod baru benar-benar lolos Readiness Probe (misalnya berhasil melakukan koneksi ke database MySQL dan memuat Redis cache).
  4. Traffic Shifting: Kubernetes mendaftarkan Pod baru ke EndpointSlice Service, sementara Pod lama mulai memasuki fase preStop hook.
  5. Graceful Draining: Pod lama menerima sinyal SIGTERM, menghentikan penerimaan koneksi baru, menyelesaikan antrean worker aktif (misalnya job di Supervisor), dan menutup koneksi secara elegan sebelum proses dimatikan (SIGKILL).

3. Perbandingan Komparatif / Analisis Pendekatan

Memilih strategi deployment yang tepat menentukan stabilitas sistem Anda. Berikut adalah analisis mendalam mengenai tiga strategi utama di Kubernetes:

Strategi Deployment Kelebihan Kekurangan Konsumsi Sumber Daya (CPU/RAM/Latency)
Recreate Sederhana, cepat, tidak memerlukan resource tambahan. Menyebabkan downtime total selama proses terminasi dan pembuatan ulang. Minim saat idle, lonjakan ekstrem saat restart (Cold Start).
Rolling Update Zero downtime, transisi mulus, native Kubernetes. Memerlukan manajemen resource ekstra untuk menampung MaxSurge. Menengah; membutuhkan alokasi RAM/CPU cadangan ~20-30% selama proses update.
Canary / Blue-Green Aman untuk pengujian fitur baru pada subset pengguna nyata. Kompleksitas konfigurasi tinggi (membutuhkan Service Mesh atau Ingress Weight Splitting). Tinggi; menduplikasi infrastruktur atau pod secara paralel selama fase uji coba.

[!TIP] Gunakan Rolling Update dengan konfigurasi maxSurge: 25% dan maxUnavailable: 0 untuk sebagian besar aplikasi web enterprise guna menjamin ketersediaan 100% tanpa memboroskan alokasi resource klaster.


4. Prasyarat Sistem & Persiapan Lingkungan

Sebelum mengimplementasikan arsitektur ini, pastikan lingkungan Anda memenuhi standar enterprise:

  • Klaster Kubernetes: Minimal v1.28+ dengan arsitektur Multi-Master (3 node master) dan minimal 3 node worker.
  • Storage Class: Mendukung ReadWriteMany (RWX) untuk penyimpanan shared asset (misalnya integrasi MinIO/S3).
  • Network Plugin (CNI): Cilium atau Calico dengan dukungan eBPF untuk performa perutean jaringan latensi rendah.
  • Hak Akses: Akun dengan hak akses cluster-admin untuk konfigurasi Ingress Controller, RBAC, dan Custom Resource Definitions (CRD).

Verifikasi kesiapan node dengan perintah terminal berikut:

kubectl get nodes -o wide
kubectl cluster-info

5. Panduan Implementasi Langkah demi Langkah

Berikut adalah konfigurasi lengkap berbasis production-grade untuk Ingress Controller, Deployment dengan strategi Rolling Update, Health Checks, dan manajemen konfigurasi.

A. Konfigurasi Ingress Controller Nginx

apiVersion: apps/v1
kind: Deployment
metadata: 
  name: ingress-nginx-controller
  namespace: ingress-nginx
  labels:
    app.kubernetes.io/name: ingress-nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app.kubernetes.io/name: ingress-nginx
  template:
    metadata:
      labels:
        app.kubernetes.io/name: ingress-nginx
    spec:
      containers:
        - name: controller
          image: registry.k8s.io/ingress-nginx/controller:v1.9.4
          args:
            - /nginx-ingress-controller
            - --configmap=$(POD_NAMESPACE)/nginx-configuration
            - --tcp-services-configmap=$(POD_NAMESPACE)/tcp-services
            - --udp-services-configmap=$(POD_NAMESPACE)/udp-services
            - --validating-webhook=:8443
            - --validating-webhook-certificate=/usr/local/certificates/cert
            - --validating-webhook-key=/usr/local/certificates/key
          securityContext:
            allowPrivilegeEscalation: false
            capabilities:
              drop:
                - ALL
              add:
                - NET_BIND_SERVICE
            runAsUser: 101
          ports:
            - name: http
              containerPort: 80
              protocol: TCP
            - name: https
              containerPort: 443
              protocol: TCP
          livenessProbe:
            httpGet:
              path: /healthz
              port: 10254
              scheme: HTTP
            initialDelaySeconds: 10
            periodSeconds: 10
            timeoutSeconds: 5
            successThreshold: 1
            failureThreshold: 3
          readinessProbe:
            httpGet:
              path: /healthz
              port: 10254
              scheme: HTTP
            initialDelaySeconds: 10
            periodSeconds: 10
            timeoutSeconds: 5
            successThreshold: 1
            failureThreshold: 3

B. Konfigurasi Deployment Aplikasi Web Backend (Go/Node/PHP) dengan Zero Downtime

apiVersion: apps/v1
kind: Deployment
metadata:
  name: enterprise-web-backend
  namespace: production
  labels:
    app: web-backend
spec:
  replicas: 5
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 0
  selector:
    matchLabels:
      app: web-backend
  template:
    metadata:
      labels:
        app: web-backend
    spec:
      containers:
        - name: app-container
          image: registry.internal.enterprise/backend:v2.4.1
          imagePullPolicy: IfNotPresent
          ports:
            - containerPort: 8080
              name: http
          resources:
            limits:
              cpu: "1"
              memory: 1Gi
            requests:
              cpu: 500m
              memory: 512Mi
          startupProbe:
            httpGet:
              path: /healthz/startup
              port: 8080
            initialDelaySeconds: 5
            periodSeconds: 5
            failureThreshold: 30
          livenessProbe:
            httpGet:
              path: /healthz/liveness
              port: 8080
            periodSeconds: 10
            timeoutSeconds: 3
            failureThreshold: 3
          readinessProbe:
            httpGet:
              path: /healthz/readiness
              port: 8080
            periodSeconds: 5
            timeoutSeconds: 2
            successThreshold: 1
            failureThreshold: 3
          lifecycle:
            preStop:
              exec:
                command: ["sh", "-c", "sleep 10"]
          env:
            - name: DB_HOST
              value: "mysql.database.svc.cluster.local"
            - name: REDIS_HOST
              value: "redis.cache.svc.cluster.local"
---
apiVersion: v1
kind: Service
metadata:
  name: web-backend-svc
  namespace: production
spec:
  selector:
    app: web-backend
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8080
  type: ClusterIP

C. Konfigurasi Ingress Resource

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: enterprise-web-ingress
  namespace: production
  annotations:
    cert-manager.io/cluster-issuer: "letsencrypt-prod"
    nginx.ingress.kubernetes.io/ssl-redirect: "true"
    nginx.ingress.kubernetes.io/proxy-connect-timeout: "60"
    nginx.ingress.kubernetes.io/proxy-read-timeout: "60"
    nginx.ingress.kubernetes.io/limit-rps: "100"
spec:
  ingressClassName: nginx
  tls:
    - hosts:
        - app.enterprise.com
      secretName: enterprise-tls-cert
  rules:
    - host: app.enterprise.com
      http:
      # Konfigurasi jalur routing backend
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: web-backend-svc
                port:
                  number: 80

6. Bedah Kode & Penjelasan Detail Baris Kunci

  • maxSurge: 1 & maxUnavailable: 0: Kombinasi ini memastikan bahwa saat proses rolling update, Kubernetes akan membuat 1 pod tambahan di atas kapasitas normal (maxSurge), dan sama sekali tidak mengizinkan pod turun di bawah jumlah replika yang diinginkan (maxUnavailable: 0). Hasilnya: kapasitas performa tetap 100% stabil selama rilis.
  • startupProbe vs livenessProbe vs readinessProbe:
    • Startup Probe menonaktifkan probe lain hingga aplikasi selesai melakukan inisialisasi berat (misalnya koneksi awal ke MySQL dan sinkronisasi cache Redis). Sangat berguna untuk aplikasi dengan cold start lama.
    • Liveness Probe mendeteksi apakah aplikasi mengalami deadlock; jika gagal, Kubernetes akan melakukan restart kontainer.
    • Readiness Probe menentukan apakah pod siap menerima traffic dari Service/Ingress. Jika database MySQL terputus, readiness probe akan mengembalikan status gagal, sehingga Ingress otomatis mencabut pod tersebut dari rotasi load balancing.
  • lifecycle.preStop & sleep 10: Baris krusial untuk zero downtime. Saat pod dijadwalkan untuk dimusnahkan, Kubernetes mengirimkan sinyal SIGTERM. Namun, pembaruan aturan iptables di kube-proxy memerlukan waktu beberapa detik. Perintah sleep 10 memberikan jeda waktu agar trafik dari Ingress benar-benar berhenti masuk sebelum aplikasi dimatikan secara total.

7. Skenario Produksi & Studi Kasus Dunia Nyata

[!IMPORTANT] Pada sistem dengan beban tinggi (high concurrency mencapai 50.000 requests per second), kegagalan kecil pada manajemen koneksi database MySQL atau connection pool Redis dapat memicu cascading failure ke seluruh klaster.

Studi Kasus: Sebuah platform e-commerce enterprise mengalami lonjakan traffic 300% saat kampanye flash sale.

  • Masalah Awal: Saat deployment versi baru dilakukan di tengah lonjakan traffic, pod lama langsung dimatikan tanpa graceful shutdown, menyebabkan ribuan koneksi HTTP terputus (Connection Reset by Peer), dan transaksi pembayaran di backend PHP-FPM/Go terpotong di tengah jalan.
  • Solusi Penerapan:
    1. Mengaktifkan Horizontal Pod Autoscaler (HPA) berdasarkan metrik kustom (penggunaan CPU & Request Rate per pod).
    2. Menerapkan PreStop Hook dengan jeda waktu 15 detik.
    3. Mengintegrasikan Cloudflare WAF dan Rate Limiting di level Ingress Nginx untuk memfilter serangan DDoS atau bot scraping yang menyertai flash sale.
    4. Memastikan Redis Cluster dan MySQL Master-Replica menggunakan connection pooling yang optimal.

8. Common Pitfalls, Anti-Patterns & Solusi

  1. Anti-Pattern: Menghilangkan Readiness Probe
    • Dampak: Kubernetes langsung mengirimkan trafik ke pod yang baru dibuat sebelum aplikasi selesai booting atau sebelum koneksi ke database MySQL siap. Pengguna akan mendapati halaman error 502/504.
    • Solusi: Selalu definisikan Readiness Probe dengan endpoint pemeriksaan kesehatan database dan cache yang valid.
  2. Anti-Pattern: Hardcode Konfigurasi di dalam Container Image
    • Dampak: Sulit melakukan rollback dan melanggar prinsip 12-Factor App.
    • Solusi: Gunakan Kubernetes ConfigMap dan Secret yang diinjeksikan sebagai Environment Variables atau Volume Mounts.
  3. Pitfall: Mengabaikan Resource Limits
    • Dampak: Satu pod yang mengalami kebocoran memori (memory leak) dapat menghabiskan seluruh RAM pada satu worker node, memicu OOM Killer yang mematikan pod penting lainnya secara acak.
    • Solusi: Selalu tetapkan batasan resources.limits dan resources.requests pada setiap manifes pod.

9. Benchmark, Metrik Kinerja & Tuning Performa

Pengujian performa wajib dilakukan sebelum merilis konfigurasi ke lingkungan produksi. Gunakan tool open-source seperti k6 atau wrk untuk mensimulasikan lonjakan beban.

Contoh skrip uji beban menggunakan k6 (load-test.js):

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

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

export default function () {
  const res = http.get('https://app.enterprise.com/healthz/readiness');
  check(res, {
    'status adalah 200': (r) => r.status === 200,
    'latensi di bawah 200ms': (r) => r.timings.duration < 200,
  });
  sleep(1);
}

Tuning Parameter Lanjutan (Sysctl Kernel Node): Untuk menangani koneksi TCP skala besar pada worker node Kubernetes, sesuaikan parameter kernel melalui DaemonSet atau konfigurasi node langsung:

net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 8192
net.ipv4.ip_local_port_range = 1024 65535
net.ipv4.tcp_tw_reuse = 1

10. Checklist Penerapan Produksi & Kesimpulan

Sebelum mendeklarasikan sistem Anda siap beroperasi secara penuh di lingkungan produksi (Day-2 Operations), pastikan checklist berikut terpenuhi:

  • Strategi Rolling Update dikonfigurasi dengan maxUnavailable: 0 dan maxSurge optimal.
  • Seluruh pod memiliki Startup, Liveness, dan Readiness Probes yang akurat.
  • lifecycle.preStop telah diimplementasikan untuk mencegah koneksi terputus mendadak.
  • Konfigurasi Disaster Recovery untuk etcd (automated snapshot harian) aktif dan teruji.
  • Sertifikat SSL/TLS dikelola secara otomatis menggunakan Cert-Manager & Let's Encrypt.
  • Integrasi WAF (Cloudflare/ModSecurity) dan Fail2ban aktif untuk mengamankan perimeter web.
  • Pemantauan metrik (Prometheus & Grafana) dan log aggregation (EFK/Loki Stack) berjalan normal.

Dengan menerapkan seluruh arsitektur, pola konfigurasi, dan mitigasi risiko di atas, klaster Kubernetes enterprise Anda akan memiliki ketahanan tingkat tinggi, mampu melayani jutaan permintaan tanpa gangguan, serta mengeksekusi pembaruan aplikasi secara mulus tanpa satu detik pun downtime.

🏷️ Tags: #High Availability #Devops #Kubernetes #Infrastructure #Docker