L
Kubernetes & CI/CD • Literally Web ID

Zero-Downtime Deployment Menggunakan Kubernetes dan ArgoCD

⏱️ 18 menit baca • 📅 14 Oct 2026 • 👁️ 1 views
Zero-Downtime Deployment Menggunakan Kubernetes dan ArgoCD

1. Konteks Industri & Analisis Akar Masalah

Dalam lanskap arsitektur web modern yang menuntut ketersediaan layanan 24/7/365, proses deployment kode atau pembaruan infrastruktur sering kali menjadi momok menakutkan bagi tim Engineering. Di era tradisional, pembaruan aplikasi web—baik berbasis PHP, Node.js, maupun Go—memerlukan intervensi manual seperti menghentikan layanan web server (Nginx/Apache), menarik kode baru, menjalankan migrasi basis data, dan menghidupkan kembali proses backend. Pendekatan ini menghasilkan downtime yang tidak bisa ditoleransi oleh sistem enterprise berskala besar, menyebabkan kerugian finansial, penurunan User Experience (UX), serta kegagalan pada transaksi krusial.

Bottleneck performa dan keamanan yang sering muncul di dunia nyata antara lain:

  1. Koneksi Terputus Mendadak (Connection Draining Failure): Klien yang sedang mengunggah file besar atau menjalankan transaksi WebSocket terputus secara paksa saat pod lama dimatikan sebelum menangani graceful shutdown.
  2. Race Condition pada Migrasi Database: Skema database diperbarui bersamaan dengan rilis aplikasi lama, menyebabkan error pada query yang masih menggunakan struktur lama.
  3. Kurangnya Validasi Kesehatan Komprehensif: Aplikasi dideklarasikan 'siap' menerima lalu lintas padahal koneksi ke Redis, MySQL, atau S3/MinIO belum sepenuhnya terbentuk, menyebabkan lonjakan HTTP 500 Internal Server Error.
  4. Drift Konfigurasi Infrastruktur: Ketidaksesuaian antara kondisi aktual di kluster Kubernetes dengan file manifest Git, yang membuat proses troubleshooting memakan waktu lama.

Kondisi Sebelum vs Sesudah Penerapan

Metrik / Parameter Sebelum (Deployment Manual / Script Bash) Sesudah (Kubernetes + ArgoCD GitOps)
Downtime per Rilis 2 hingga 15 menit (Maintenance Mode) 0 detik (Zero-Downtime via Rolling Update)
Recovery Time (Rollback) Lambat, manual, rawan human error Otomatis via ArgoCD Automated Sync & Rollback
Auditing & Traceability Rendah, berdasarkan catatan memori tim Transparan, 100% berbasis Git Commit History
Konsistensi Lingkungan Sering terjadi drift antar Staging & Prod Terjamin sinkron dengan Single Source of Truth

2. Konsep Inti & Deep Dive Arsitektur

Arsitektur Zero-Downtime Deployment menggunakan Kubernetes dan ArgoCD berpusat pada konsep GitOps. Dalam paradigma ini, repositori Git bertindak sebagai Single Source of Truth untuk seluruh spesifikasi infrastruktur dan aplikasi. ArgoCD bertugas secara berkelanjutan memantau (polling/webhook) repositori Git dan secara otomatis merekonsiliasi keadaan kluster Kubernetes agar selalu sama persis dengan deklarasi di dalam Git.

+-------------------------------------------------------------------------+
|                         Developer / Git Repository                      | 
|                   (Manifests / Helm Charts / Kustomize)                 |
+-------------------------------------------------------------------------+
                                     |
                                     | (Git Push / Pull Request)
                                     v
+-------------------------------------------------------------------------+
|                              ArgoCD Controller                          |
|           (Memantau & Membandingkan Target State vs Live State)         |
+-------------------------------------------------------------------------+
                                     |
                                     | (Apply Kubernetes API)
                                     v
+-------------------------------------------------------------------------+
|                           Kubernetes Cluster                            |
|  +-------------------------------------------------------------------+  |
|  |                        Ingress Controller (Nginx)                 |  |
|  +-------------------------------------------------------------------+  |
|                                    |                                    |
|                                    v                                    |
|  +-------------------------------------------------------------------+  |
|  |                     Kubernetes Service & Endpoints                |  |
|  +-------------------------------------------------------------------+  |
|             /                                     \                     |
|            / (Traffic Mengalir)                    \ (Zero Traffic)     |
|           v                                         v                   |
|  +------------------+                             +------------------+  |
|  |   Pod v2 (New)   |                             |   Pod v1 (Old)   |  |
|  |  Readiness: OK   |                             |  Terminating...  |  |
|  +------------------+                             +------------------+  |
+-------------------------------------------------------------------------+

Alur Eksekusi Zero-Downtime di Kubernetes:

  1. Pembaruan Citra (Image Update): Pipeline CI (misalnya GitHub Actions atau GitLab CI) merusak kode baru, membuat Docker image baru dengan tag unik (misalnya SHA commit), dan memperbarui file manifest Kubernetes di repositori Git.
  2. Deteksi ArgoCD: ArgoCD mendeteksi adanya perbedaan (drift) antara repositori Git dan kluster, lalu memicu proses sinkronisasi.
  3. Inisiasi Rolling Update: Kubernetes Deployment membuat Pod baru (v2) dengan menggunakan spesifikasi gambar baru.
  4. Pemeriksaan Kesiapan (Readiness Probe): Kubernetes menahan lalu lintas dari Ingress/Service ke Pod v2 sampai probe HTTP/TCP sukses menyatakan aplikasi siap.
  5. Pemberhentian Elegan (Graceful Termination): Pod v1 diberi sinyal SIGTERM, menghentikan penerimaan koneksi baru, menyelesaikan permintaan yang sedang berjalan (selama masa terminationGracePeriodSeconds), dan akhirnya dihapus.

3. Perbandingan Komparatif / Analisis Pendekatan

Untuk mencapai Zero-Downtime di Kubernetes, terdapat beberapa strategi Deployment utama yang masing-masing memiliki kelebihan, kekurangan, serta dampak sumber daya (Resource Footprint):

Strategi Deployment Kelebihan Kekurangan Kebutuhan Sumber Daya (CPU/RAM) Latency & Stabilitas
Rolling Update (Default) Hemat sumber daya, otomatisasi bawaan Kubernetes Transisi lambat jika konfigurasi salah, manajemen migrasi DB kompleks Rendah (Hanya butuh ekstra maxSurge kapasitas kecil) Sangat stabil jika Readiness Probe dikonfigurasi akurat
Blue/Green Deployment Rollback instan, pengujian isolasi penuh sebelum dialihkan Membutuhkan kapasitas kluster 2x lipat selama proses rilis Tinggi (Duplikasi seluruh pod aktif selama transisi) Sempurna untuk transisi instan tanpa jeda
Canary Deployment Risiko kegagalan terisolasi pada persentase kecil pengguna Kompleksitas routing lalu lintas (membutuhkan Service Mesh / Ingress tingkat lanjut) Sedang (Membutuhkan pod tambahan untuk versi canary) Memerlukan pemantauan metrik latensi yang ketat

[!TIP] Gunakan Rolling Update dengan parameter maxSurge: 25% dan maxUnavailable: 0 untuk efisiensi biaya infrastruktur sekaligus menjaga ketersediaan layanan 100% tanpa lonjakan penggunaan RAM/CPU yang ekstrem.


4. Prasyarat Sistem & Persiapan Lingkungan

Sebelum mengimplementasikan pipeline Zero-Downtime, pastikan komponen berikut telah tersedia dan terkonfigurasi dengan benar di lingkungan Anda:

  1. Kluster Kubernetes (Versi 1.25 atau lebih baru) dengan akses administratif (kubectl).
  2. ArgoCD terinstal di namespace argocd.
  3. Ingress Controller (seperti Nginx Ingress Controller) yang mendukung Endpoint Slicing.
  4. Storage & Database: Akses ke MySQL/MariaDB dan Redis yang mendukung koneksi paralel dari versi aplikasi lama dan baru.

Verifikasi instalasi ArgoCD melalui terminal:

kubectl get pods -n argocd

Pastikan CLI ArgoCD terpasang dan dapat berkomunikasi dengan server:

argocd version --client

5. Panduan Implementasi Langkah demi Langkah

Berikut adalah implementasi penuh manifes Kubernetes untuk menjalankan aplikasi web berbasis backend modern (misalnya Node.js/Go) dengan konfigurasi Zero-Downtime yang ketat.

A. File Manifes Deployment (deployment.yaml)

apiVersion: apps/v1
kind: Deployment
metadata:
  name: enterprise-web-app
  namespace: production
  labels:
    app: enterprise-web-app
spec:
  replicas: 4
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 0
  selector:
    matchLabels:
      app: enterprise-web-app
template:
  metadata:
    labels:
      app: enterprise-web-app
  spec:
    containers:
    - name: web-app
      image: registry.internal.net/enterprise/web-app:v1.2.0
      imagePullPolicy: IfNotPresent
      ports:
      - containerPort: 8080
        name: http
      resources:
        requests:
          memory: "512Mi"
          cpu: "500m"
        limits:
          memory: "1Gi"
          cpu: "1000m"
      startupProbe:
        httpGet:
          path: /healthz/startup
          port: 8080
        initialDelaySeconds: 10
        periodSeconds: 5
        failureThreshold: 30
      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
      lifecycle:
        preStop:
          exec:
            command: ["sh", "-c", "sleep 10"]
      env:
      - name: PORT
        value: "8080"
      - name: DB_HOST
        valueFrom:
          secretKeyRef:
            name: db-secrets
            key: host
    terminationGracePeriodSeconds: 30

B. File Manifes Service (service.yaml)

apiVersion: v1
kind: Service
metadata:
  name: enterprise-web-app-svc
  namespace: production
  labels:
    app: enterprise-web-app
spec:
  type: ClusterIP
  ports:
  - port: 80
    targetPort: http
    protocol: TCP
    name: http
  selector:
    app: enterprise-web-app

C. Konfigurasi ArgoCD Application (argocd-app.yaml)

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: enterprise-web-app-sync
  namespace: argocd
spec:
  project: default
  source:
    repoURL: 'https://github.com/enterprise/k8s-gitops-configs.git'
    targetRevision: HEAD
    path: manifests/production
  destination:
    server: 'https://kubernetes.default.svc'
    namespace: production
  syncPolicy:
    automated:
      prune: true
      selfHeal: true
    syncOptions:
      - CreateNamespace=true
      - ApplyOutOfSyncOnly=true
    retry:
      limit: 5
      backoff:
        duration: 5s
        factor: 2
        maxDuration: 3m

Terapkan aplikasi ArgoCD ke kluster:

kubectl apply -f argocd-app.yaml

6. Bedah Kode & Penjelasan Detail Baris Kunci

Analisis mendalam terhadap parameter krusial dalam file konfigurasi di atas:

  1. maxUnavailable: 0 dan maxSurge: 1: Kombinasi ini memerintahkan Kubernetes untuk tidak mematikan pod lama sama sekali (maxUnavailable: 0) sebelum pod baru benar-benar siap, dan menambahkan 1 pod ekstra di atas jumlah replica standar (maxSurge: 1) selama proses transisi. Ini adalah fondasi mutlak Zero-Downtime.
  2. startupProbe, livenessProbe, & readinessProbe:
    • Startup Probe: Melindungi aplikasi berat saat proses booting (misalnya memuat cache awal atau inisialisasi koneksi database) agar tidak langsung dibunuh oleh liveness probe.
    • Liveness Probe: Mendeteksi apakah aplikasi mengalami deadlock. Jika gagal, Kubernetes melakukan restart kontainer.
    • Readiness Probe: Menentukan apakah pod siap menerima traffic dari Ingress/Service. Jika gagal, pod dikeluarkan dari endpoint service tanpa dimatikan.
  3. lifecycle.preStop & sleep 10: Saat pod akan dihentikan, Kubernetes mengirim sinyal SIGTERM. Seringkali Ingress Controller membutuhkan waktu beberapa detik untuk memperbarui tabel routing-nya. Perintah sleep 10 menahan penghentian proses aplikasi selama 10 detik agar tidak ada dropped requests.
  4. terminationGracePeriodSeconds: 30: Memberikan waktu total 30 detik bagi aplikasi untuk merapikan transaksi yang sedang berjalan sebelum dipaksa mati via SIGKILL.

7. Skenario Produksi & Studi Kasus Dunia Nyata

[!IMPORTANT] Pada sistem dengan concurrent request tinggi (mencapai 50.000 req/sec), kegagalan menangani connection draining akan memicu error 502 Bad Gateway pada Nginx Ingress.

Studi Kasus: Sebuah platform e-commerce enterprise mengalami lonjakan trafik saat Flash Sale. Tim melakukan deployment fitur pembayaran baru.

  • Tantangan: Jika pod lama dimatikan seketika, ribuan pengguna yang sedang berada di halaman checkout akan kehilangan sesi pembayaran mereka.
  • Solusi Penerapan:
    • Mengaktifkan readinessProbe yang mengecek status pool koneksi Redis dan write-availability database.
    • Mengatur preStop hook dengan perintah nginx -s quit (jika menggunakan Nginx di dalam pod) atau penundaan internal pada aplikasi backend agar menyelesaikan antrean HTTP keep-alive connections.
    • ArgoCD melakukan sinkronisasi otomatis berdasarkan commit tag git, memastikan versi backend terbarukan tanpa intervensi manual di tengah malam.

8. Common Pitfalls, Anti-Patterns & Solusi

  1. Anti-Pattern: Menggunakan Tag latest pada Docker Image
    • Masalah: Kubernetes caching membuat node tidak mengambil gambar terbaru jika nama tag sama.
    • Solusi: Gunakan tag berbasis Commit SHA atau Semantic Versioning unik (misal: v1.2.0-abc1234).
  2. Kesalahan Umum: Tidak Mengatur Resource Limits
    • Masalah: Saat rolling update, lonjakan pod membuat node kehabisan memori (OOMKilled), memicu efek domino CrashLoopBackOff.
    • Solusi: Selalu definisikan blok resources.requests dan resources.limits secara akurat.
  3. Kesalahan Fatal: Migrasi Database yang Breaking Changes
    • Masalah: Menghapus kolom database pada versi v1.2 yang masih diakses oleh pod v1.1 yang berjalan secara bersamaan selama rolling update.
    • Solusi: Terapkan pola Expand and Contract (perluas dulu skema database agar kompatibel dengan kedua versi, rilis aplikasi, lalu hapus kolom lama pada rilis berikutnya).

9. Benchmark, Metrik Kinerja & Tuning Performa

Untuk memastikan tidak ada degradasi performa selama proses Zero-Downtime Deployment, lakukan pengujian beban menggunakan k6 atau wrk secara bersamaan saat ArgoCD melakukan sync.

Contoh skrip pengujian 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 pengguna
    { duration: '5m', target: 100 }, // Pertahankan beban selama 5 menit (uji deployment di sini)
    { duration: '2m', target: 0 },   // Ramp-down
  ],
};

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

Tuning Parameter Lanjutan:

  • Kernel sysctl tuning (net.ipv4.tcp_fin_timeout): Kurangi waktu tunggu port dalam status TIME_WAIT agar server dapat membuka koneksi baru lebih cepat di bawah beban tinggi.
  • Ingress Controller Tuning: Pastikan parameter controller.config.worker-processes di Nginx Ingress disesuaikan dengan jumlah vCPU pada node worker.

10. Checklist Penerapan Produksi & Kesimpulan

Sebelum merilis panduan arsitektur ini ke lingkungan Production enterprise Anda, pastikan checklist berikut telah terpenuhi 100%:

  • File manifes Kubernetes menggunakan strategi RollingUpdate dengan maxUnavailable: 0.
  • Startup, Liveness, dan Readiness Probes dikonfigurasi dengan path kesehatan yang valid.
  • Skrip preStop dan terminationGracePeriodSeconds diatur untuk mencegah dropped connections.
  • ArgoCD terkonfigurasi dengan mekanisme Automated Sync dan Self-Heal yang aman.
  • Strategi migrasi database menggunakan pola Expand and Contract (Backward Compatible).
  • Pengujian beban (Load Testing) berhasil dilewati tanpa ada lonjakan HTTP 5xx error selama proses rilis.

Dengan memadukan orkestrasi Kubernetes yang disiplin dan otomatisasi GitOps berbasis ArgoCD, organisasi Anda dapat mencapai siklus rilis perangkat lunak yang cepat, aman, dapat diaudit, dan benar-benar bebas dari gangguan layanan (Zero-Downtime).

🏷️ Tags: #Devops #Kubernetes #Gitops #Argocd #Cloud Native