L
Kubernetes & CI/CD β€’ Literally Web ID

High Availability Kubernetes Deployment: Zero-Downtime Rollout & Ingress Controller Tuning

⏱️ 15 menit baca β€’ πŸ“… 16 Oct 2026 β€’ πŸ‘οΈ 1 views
High Availability Kubernetes Deployment: Zero-Downtime Rollout & Ingress Controller Tuning

1. Konteks Industri & Analisis Akar Masalah

Dalam lanskap arsitektur sistem modern saat ini, ketersediaan tinggi (High Availability atau HA) dan zero-downtime deployment bukan lagi sekadar fitur tambahan (nice-to-have), melainkan standar fundamental yang wajib dipenuhi oleh setiap platform enterprise. Ketika sebuah aplikasi berbasis webβ€”baik yang ditenagai oleh backend Go, Node.js, PHP-FPM, maupun arsitektur microservices kompleksβ€”mengalami pembaruan versi, pengguna akhir menuntut transisi tersebut berjalan tanpa satupun dropped connection, HTTP 502/504 Bad Gateway, atau jeda milidetik.

Secara historis, deployment aplikasi di lingkungan tradisional berakar pada pembaruan manual instance virtual machine atau bare-metal server, yang kerap diwarnai risiko human error, durasi pemadaman yang lama, dan proses rollback yang rumit. Kubernetes hadir untuk mengotomatisasi orkestrasi kontainer ini. Namun, Kubernetes out-of-the-box tidak secara otomatis menjamin zero-downtime. Banyak insinyur infrastruktur terjebak dalam jebakan asumsi bahwa deklarasi replicas: 3 pada sebuah Deployment sudah cukup menciptakan sistem yang tahan banting.

Akar masalah dari kegagalan zero-downtime rollout di Kubernetes umumnya bersumber dari tiga titik kritis:

  1. Ketiadaan Pemahaman Siklus Hidup Pod (Pod Lifecycle): Kubernetes mematikan pod lama dan meluncurkan pod baru secara paralel tanpa menunggu pod baru benar-benar siap melayani traffic HTTP atau gRPC secara mandiri.
  2. Konfigurasi Probe yang Naif: Penggunaan liveness dan readiness probe default yang terlalu longgar atau bahkan absen, menyebabkan traffic dialirkan ke pod yang aplikasi internalnya (misalnya koneksi database MySQL/MariaDB atau pool Redis) belum siap.
  3. Ketidakharmonisan Lapisan Ingress (Nginx Ingress Controller): Saat Kubernetes melakukan terminasi pod, proses pembaruan endpoint pada Endpoints API seringkali terlambat disinkronkan dengan tabel perutean Nginx, mengakibatkan race condition di mana reverse proxy terus melemparkan paket ke IP pod yang sudah mati.

Perbandingan Kondisi: Sebelum vs Sesudah Penerapan

Parameter Sistem Sebelum (Konfigurasi Default / Naif) Sesudah (Tuning HA & Zero-Downtime) Dampak Bisnis / Operasional
HTTP Error Rate saat Rollout 2% - 15% error (502/503/504) 0% error (100% transparan) Meniadakan lost revenue dan komplain pengguna.
Waktu Deteksi Pod Gagal Lambat (>30 detik), sering terjadi false positive Cepat (<5 detik), presisi tinggi SLA sistem terjaga pada angka 99.99%.
Manajemen Traffic Ingress Terjadi connection drops saat rolling update Koneksi drain mulus (graceful shutdown) Stabilitas koneksi WebSocket dan API jangka panjang.
Kesiapan Backend & DB Pod langsung menerima traffic walau koneksi DB belum siap Terproteksi oleh Startup & Readiness Probe yang sinkron Mencegah lonjakan koneksi gagal (connection storm) ke database.

2. Konsep Inti & Deep Dive Arsitektur

Untuk mencapai zero-downtime deployment yang kokoh, kita harus membedah bagaimana komponen-komponen Kubernetes dan Nginx Ingress berinteraksi di balik layar saat sebuah pembaruan kode digulirkan.

Alur Eksekusi Rolling Update dan Interaksi Jaringan

[ Client / CDN / Cloudflare ]
           β”‚
           β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚         Nginx Ingress Controller        β”‚  <--- Melakukan load balancing & dynamic upstream sync
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                     β”‚ (TCP / HTTP Proxy)
         β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
         β–Ό                       β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”     β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  Pod A (v1)     β”‚     β”‚  Pod B (v1)     β”‚  <--- Pod lama melayani traffic
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜     β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
         β”‚
         β”‚ (Saat kubectl rollout set image dijalankan)
         β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  Pod C (v2)     β”‚  <--- Pod baru dibuat
β””β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”˜
         β”‚
         β”œβ”€β–Ί 1. Startup Probe: Memeriksa inisialisasi aplikasi (misal: migrasi skema DB)
         β”œβ”€β–Ί 2. Readiness Probe: Memeriksa kesiapan menerima traffic (misal: HTTP /healthz)
         β”‚
         β–Ό (Jika sukses, Pod C dimasukkan ke Endpoints Service)
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚           Kubernetes Service            β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                     β”‚
                     β–Ό
        [ Traffic dialirkan ke Pod C (v2) ]
                     β”‚
                     β–Ό
         (Pod A & B mulai proses termination)
         β”œβ”€β–Ί PreStop Hook / SIGTERM dikirim ke aplikasi
         β”‚   (Aplikasi melakukan graceful drain koneksi aktif selama 30 detik)
         └─► Pod A & B dihapus total dari kluster

Analisis Alur Di Balik Layar

  1. Inisialisasi Pod Baru (v2): Ketika perintah rollout dieksekusi, Deployment Controller membuat pod baru berdasarkan strategi RollingUpdate (maxSurge dan maxUnavailable).
  2. Fase Startup Probe: Jika aplikasi Anda membutuhkan waktu lama untuk booting (misalnya memuat model machine learning atau melakukan koneksi ke pool Redis dan database MySQL), Startup Probe mengamankan pod agar Liveness dan Readiness probe tidak membunuh pod prematur.
  3. Fase Readiness Probe: Setelah Startup sukses, Readiness Probe mengambil alih. Begitu probe ini mengembalikan status HTTP 200 OK, Kubernetes mendaftarkan IP pod baru tersebut ke Endpoints dari Service terkait.
  4. Sinkronisasi Ingress: Nginx Ingress Controller yang memantau perubahan Endpoints secara real-time memperbarui konfigurasi internal upstream menggunakan Lua script atau integrasi native Go, sehingga traffic mulai diarahkan ke pod baru.
  5. Graceful Termination Pod Lama: Pod lama menerima sinyal SIGTERM. Berkat konfigurasi terminationGracePeriodSeconds dan preStop hook, aplikasi diberi waktu untuk menyelesaikan request yang sedang berjalan sebelum benar-benar dimatikan.

3. Perbandingan Komparatif / Analisis Pendekatan

Dalam merancang strategi rolling update dan manajemen ingress, terdapat beberapa pendekatan parameter yang dapat dipilih. Pemilihan yang salah dapat mengakibatkan pemborosan sumber daya CPU/RAM atau lonjakan latensi.

Strategi / Parameter Pendekatan Agresif (Fast Rollout) Pendekatan Konservatif (Safe Rollout) Rekomendasi Enterprise (Production-Grade)
maxSurge / maxUnavailable maxSurge: 50%, maxUnavailable: 0% maxSurge: 1%, maxUnavailable: 1% maxSurge: 25%, maxUnavailable: 0% (Menjamin kapasitas tidak pernah turun)
Pod Disruption Budget (PDB) Tanpa PDB atau minAvailable: 0 minAvailable: 90% Disesuaikan dengan jumlah pod, misal minAvailable: 80% untuk mencegah node draining merusak HA
Nginx Worker Processes auto (mengikuti jumlah core vCPU node) Dibatasi secara manual (misal: 2) auto dengan alokasi resource limits CPU yang jelas pada DaemonSet/Deployment Ingress
Keepalive Connections Dinonaktifkan atau diset sangat rendah Diset ekstrem tinggi tanpa batas Dioptimalkan (keepalive 32 atau 64 dengan timeout 60s) untuk mereduksi TCP handshake overhead

4. Prasyarat Sistem & Persiapan Lingkungan

Sebelum menerjemahkan teori ke dalam manifes YAML produksi, pastikan lingkungan infrastruktur Anda memenuhi prasyarat berikut:

  1. Kluster Kubernetes: Versi 1.25 atau lebih tinggi (mendukung fitur graceful node shutdown dan API stabilitas terbaru).
  2. Ingress Controller: Nginx Ingress Controller (versi stabil terbaru, misal v1.8.x+) terpasang di namespace ingress-nginx.
  3. Akses Administratif: Hak akses cluster-admin untuk memodifikasi ClusterRole, ConfigMap, dan Deployment tingkat sistem.
  4. Alat Pendukung di Mesin Lokal/CI/CD: kubectl, helm (v3+), dan utilitas load testing seperti k6 atau wrk untuk verifikasi.

5. Panduan Implementasi Langkah demi Langkah

Berikut adalah konfigurasi manifes produksi yang menggabungkan Probes, RollingUpdate, PodDisruptionBudget, dan Nginx Ingress Controller Tuning secara komprehensif.

A. Manifes Deployment & Service Aplikasi (Go/Node/PHP Backend)

Simpan konfigurasi ini sebagai app-deployment.yaml:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: enterprise-web-app
  namespace: production
  labels:
    app.kubernetes.io/name: enterprise-web-app
    app.kubernetes.io/part-of: core-backend
spec:
  replicas: 4
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 25%
      maxUnavailable: 0% # Memastikan tidak ada penurunan kapasitas saat rollout
  selector:
    matchLabels:
      app.kubernetes.io/name: enterprise-web-app
  template:
    metadata:
      labels:
        app.kubernetes.io/name: enterprise-web-app
    spec:
      terminationGracePeriodSeconds: 60 # Waktu bagi aplikasi untuk melakukan drain koneksi aktif
      containers:
      - name: web-app
        image: registry.internal.net/production/web-app:v2.1.0
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 8080
          name: http
        resources:
          limits:
            cpu: "1"
            memory: 1Gi
          requests:
            cpu: 500m
            memory: 512Mi
        # Startup Probe untuk menangani proses inisialisasi yang berat
        startupProbe:
          httpGet:
            path: /healthz/startup
            port: 8080
          initialDelaySeconds: 5
          periodSeconds: 5
          failureThreshold: 30 # Memberikan waktu hingga 150 detik untuk booting awal
        # Liveness Probe untuk mendeteksi deadlock aplikasi
        livenessProbe:
          httpGet:
            path: /healthz/liveness
            port: 8080
          periodSeconds: 10
          timeoutSeconds: 3
          failureThreshold: 3
        # Readiness Probe untuk menentukan kelayakan menerima traffic
        readinessProbe:
          httpGet:
            path: /healthz/readiness
            port: 8080
          periodSeconds: 5
          timeoutSeconds: 2
          successThreshold: 1
          failureThreshold: 2
        lifecycle:
          preStop:
            exec:
              # Perintah untuk memberi sinyal pada aplikasi agar berhenti menerima request baru
              # dan menunggu proses yang sedang berjalan selesai.
              command: ["/bin/sh", "-c", "sleep 10"]
---
apiVersion: v1
kind: Service
metadata:
  name: enterprise-web-service
  namespace: production
  labels:
    app.kubernetes.io/name: enterprise-web-app
spec:
  type: ClusterIP
  ports:
  - port: 80
    targetPort: http
    protocol: TCP
    name: http
  selector:
    app.kubernetes.io/name: enterprise-web-app

B. Manifes Pod Disruption Budget (PDB)

Simpan konfigurasi ini sebagai pdb.yaml untuk mengamankan ketersediaan selama operasi pemeliharaan node atau drain node:

apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
  name: enterprise-web-app-pdb
  namespace: production
spec:
  minAvailable: 75%
  selector:
    matchLabels:
      app.kubernetes.io/name: enterprise-web-app

C. Konfigurasi Tuning Nginx Ingress Controller (ConfigMap)

Untuk menangani high throughput dan koneksi konkuren yang masif, lakukan tuning pada ConfigMap Nginx Ingress Controller. Simpan sebagai ingress-nginx-config.yaml:

apiVersion: v1
kind: ConfigMap
metadata:
  name: ingress-nginx-controller
  namespace: ingress-nginx
data:
  # Optimasi Worker & Koneksi
  worker-processes: "auto"
  worker-connections: "10240"
  worker-rlimit-nofile: "65535"
  
  # Keepalive & Timeout Optimization
  keep-alive: "75"
  keep-alive-requests: "1000"
  client-header-timeout: "60s"
  client-body-timeout: "60s"
  send-timeout: "60s"
  proxy-connect-timeout: "10s"
  proxy-read-timeout: "60s"
  proxy-send-timeout: "60s"

  # Buffer & Cache Tuning untuk mencegah disk I/O bottleneck
  proxy-buffer-size: "16k"
  proxy-buffers: "4 32k"
  proxy-busy-buffers-size: "64k"
  client-header-buffer-size: "4k"
  large-client-header-buffers: "4 16k"

  # SSL/TLS Hardening & Optimization
  ssl-protocols: "TLSv1.2 TLSv1.3"
  ssl-ciphers: "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384"
  ssl-session-cache: "on"
  ssl-session-cache-size: "10m"
  ssl-session-timeout: "1d"

  # HTTP/2 & Compression
  use-http2: "true"
  enable-underscores-in-headers: "false"
  "</content>
  "excerpt": "Panduan komprehensif merancang High Availability Kubernetes deployment dengan strategi zero-downtime rollout, konfigurasi probe yang presisi, serta tuning Nginx Ingress Controller untuk beban trafik enterprise berkecepatan tinggi.
🏷️ Tags: #Nginx #High Concurrency #Performance #Sysadmin #Web Server