L
Kubernetes & CI/CD • Literally Web ID

Zero-Downtime Deployment di Kubernetes Menggunakan GitOps & ArgoCD

⏱️ 15 menit baca • 📅 15 Oct 2026 • 👁️ 1 views
Zero-Downtime Deployment di Kubernetes Menggunakan GitOps & ArgoCD

1. Konteks Industri & Analisis Akar Masalah

Dalam lanskap enterprise web engineering modern, downtime sekecil apa pun saat melakukan deployment aplikasi web tidak hanya berdampak pada hilangnya pendapatan, tetapi juga merusak reputasi brand secara masif. Di dunia nyata, sistem backend web yang dibangun dengan arsitektur mikroservis (menggunakan Go, Node.js, atau PHP-FPM di atas container Kubernetes) sering kali mengalami kegagalan saat proses rilis versi baru. Bottleneck klasik yang sering ditemukan meliputi: proses rolling update yang terhenti karena konfigurasi readiness probe yang salah, lonjakan koneksi database secara tiba-tiba (connection storm) akibat pod baru melakukan inisialisasi secara bersamaan, serta human error ketika administrator menjalankan perintah kubectl apply secara manual dari terminal lokal tanpa audit trail yang jelas.

Sebelum penerapan GitOps, perusahaan biasanya mengandalkan pipeline CI/CD konvensional (seperti Jenkins, GitLab CI, atau GitHub Actions) yang memiliki hak akses penuh (cluster-admin) langsung ke klaster Kubernetes produksi. Pendekatan ini sangat rapuh: jika token akses (kubeconfig secret) di dalam runner CI/CD bocor, seluruh klaster rentan terhadap eksploitasi. Selain itu, sering terjadi drift state (perbedaan antara konfigurasi yang didefinisikan di dalam repositori Git dengan kondisi nyata di dalam klaster Kubernetes) akibat adanya modifikasi manual menggunakan perintah kubectl edit untuk keperluan debugging darurat.

Dengan menerapkan GitOps menggunakan ArgoCD, repositori Git bertindak sebagai satu-satunya sumber kebenaran (single source of truth) untuk seluruh infrastruktur dan aplikasi web. ArgoCD secara otomatis melakukan sinkronisasi terus-menerus antara state deklaratif di Git dengan desired state di dalam klaster Kubernetes. Hasilnya? Setiap perubahan kode frontend (HTML/CSS/JS), backend (Go/Node/PHP), konfigurasi web server (Nginx/Caddy), hingga aturan WAF dan pengelolaan storage (MinIO/S3) terdokumentasi rapi lewat git commit, dapat diaudit melalui pull request, dan di-roll back secara instan jika terjadi anomali kinerja.

2. Konsep Inti & Deep Dive Arsitektur

ArgoCD bekerja berdasarkan pola Pull-based GitOps Operator. Berbeda dengan sistem CI/CD push-based tradisional di mana server eksternal mendorong perubahan ke klaster, ArgoCD Controller berjalan di dalam klaster Kubernetes itu sendiri, secara berkala memantau repositori Git target, dan menerapkan perubahan manifes Kubernetes secara otomatis.

+-------------------------------------------------------------------------+
|                        Developer / Git Repository                       | 
|     (Manifest Kubernetes, Helm Charts, Kustomize, HTML/CSS/Go code)     |
+-------------------------------------------------------------------------+
                                     |
                                     | (Webhook / Polling)
                                     v
+-------------------------------------------------------------------------+
|                             ArgoCD Controller                           | 
|       - Membandingkan Git State vs Live Cluster State (Reconciliation)  |
+-------------------------------------------------------------------------+
                                     |
                                     | (Apply / Sync)
                                     v
+-------------------------------------------------------------------------+
|                         Kubernetes Production Cluster                   |
|  +-------------------------+  +--------------------------------------+  |
|  |   Ingress Controller    |->| Service -> Deployment (RollingUpdate)|  |
|  +-------------------------+  +--------------------------------------+  |
|                                              |                          |
|                                              v                          |
|                                 [ Pod v1 ] ---> [ Pod v2 ]              |
+-------------------------------------------------------------------------+

Alur Eksekusi Zero-Downtime Deployment

  1. Commit & Push: Engineer melakukan merge pull request ke branch main yang berisi pembaruan versi image container aplikasi backend (misalnya dari v1.2.0 ke v1.3.0).
  2. Detection & Reconciliation: ArgoCD mendeteksi perubahan tersebut (baik melalui webhook GitHub/GitLab atau polling interval 3 menit). ArgoCD menghitung selisih (diff) antara manifes di Git dan objek aktual di klaster.
  3. Automated Sync & Progressive Delivery: ArgoCD mulai melakukan sinkronisasi. Karena objek deployment dikonfigurasi dengan strategi RollingUpdate, Kubernetes Kubernetes API Server tidak langsung mematikan pod lama.
  4. Readiness Probe & Traffic Routing: Kubernetes membuat pod baru (v1.3.0). Nginx Ingress Controller atau Service mesh menahan trafik sampai pod baru tersebut mengembalikan status HTTP 200 OK pada endpoint /healthz yang diverifikasi oleh readinessProbe.
  5. Graceful Termination: Setelah pod baru siap dan melayani trafik, pod lama (v1.2.0) dikirimkan sinyal SIGTERM, memberikan waktu bagi backend (Go/Node/PHP-FPM) untuk menyelesaikan active requests yang sedang berjalan sebelum proses pod benar-benar dihentikan (terminationGracePeriodSeconds).

3. Perbandingan Komparatif / Analisis Pendekatan

Untuk memahami mengapa ArgoCD dengan pendekatan Pull-based GitOps menjadi standar emas enterprise, mari kita bandingkan dengan dua pendekatan pendahulunya:

Parameter Perbandingan Push-Based CI/CD (Jenkins / GitLab CI) ArgoCD GitOps (Pull-Based) Manual kubectl apply / Helm CLI
Cluster Access CI/CD Runner memegang kubeconfig root ArgoCD Controller lokal (Agent-less dari luar) Administrator memegang akses langsung
Audit Trail Tersebar di log build CI/CD 100% berbasis Git Commit & PR History Sangat lemah / Bergantung pada catatan manual
Drift Detection Tidak ada (hanya saat pipeline berjalan) Real-time, otomatis memperbaiki configuration drift Tidak ada (rentan perubahan manual tak terdokumentasi)
Rollback Mechanism Menjalankan ulang pipeline versi lama 1 klik di UI ArgoCD / git revert otomatis Menjalankan perintah helm rollback atau edit manual
Overhead Sumber Daya Rendah (dijalankan saat ada build) Sedang (menjalankan controller dan UI di klaster) Sangat rendah, namun risiko operasional tinggi
  • Trade-off Analisis: Dari segi penggunaan memori dan CPU, ArgoCD membutuhkan tambahan alokasi sumber daya di klaster Kubernetes (sekitar 500m CPU dan 512MB RAM untuk skala menengah). Namun, efisiensi operasional, keamanan kredensial, dan jaminan Zero-Downtime jauh melampaui biaya sumber daya infrastruktur tersebut.

4. Prasyarat Sistem & Persiapan Lingkungan

Sebelum mengimplementasikan ArgoCD dan Zero-Downtime Deployment, pastikan environment infrastruktur Anda memenuhi spesifikasi produksi berikut:

  • Kubernetes Cluster: Versi minimal 1.25+ dengan RBAC (Role-Based Access Control) aktif.
  • Command Line Tools: kubectl, helm (v3+), dan argocd CLI terpasang di mesin admin.
  • Storage & Database: PostgreSQL/MySQL eksternal atau terkelola, Redis cluster untuk session caching web app.
  • Infrastruktur Pendukung: Nginx Ingress Controller, Cert-Manager untuk SSL/TLS Let's Encrypt, dan Cloudflare sebagai CDN/WAF di layer edge.

Verifikasi akses klaster dengan perintah berikut:

# Memastikan koneksi ke klaster Kubernetes produksi valid
kubectl cluster-info

# Memeriksa node yang aktif dan siap
kubernetes get nodes -o wide

5. Panduan Implementasi Langkah demi Langkah

Langkah 1: Instalasi ArgoCD ke dalam Klaster Kubernetes

Buat namespace khusus untuk ArgoCD dan instal komponen inti menggunakan manifes resmi penyiaran stabil:

kubectl create namespace argocd
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml

Verifikasi bahwa semua pod ArgoCD berjalan normal:

kubectl get pods -n argocd --watch

Langkah 2: Mengambil Password Awal ArgoCD

Ambil kata sandi admin yang digenerate secara otomatis oleh sistem:

kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d && echo

Langkah 3: Mengonfigurasi Manifest Aplikasi Web (Deployment & Service)

Buat direktori repositori Git Anda (misalnya k8s-manifests/production) dan buat file manifes deployment aplikasi backend berbasis Go/Node/PHP dengan konfigurasi RollingUpdate dan Probes tingkat lanjut. Simpan 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-infrastructure
spec:
  replicas: 4
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1       # Maksimal 1 pod tambahan di atas replicas selama proses update
      maxUnavailable: 0 # Menjamin kapasitas tidak pernah berkurang di bawah jumlah minimum
  selector:
    matchLabels:
      app: enterprise-web-app
  template:
    metadata:
      labels:
        app: enterprise-web-app
    spec:
      terminationGracePeriodSeconds: 60 # Waktu tunggu bagi pod untuk menghentikan koneksi aktif (Graceful Shutdown)
      containers:
      - name: web-backend
        image: registry.enterprise.internal/web-backend:v1.3.0
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 8080
          name: http
        resources:
          requests:
            cpu: "500m"
            memory: "512Mi"
          limits:
            cpu: "2"
            memory: "2Gi"
        # Liveness Probe: Mengetes apakah aplikasi mengalami deadlock / hang internal
        livenessProbe:
          httpGet:
            path: /healthz
            port: 8080
          initialDelaySeconds: 30
          periodSeconds: 10
          timeoutSeconds: 3
          failureThreshold: 3
        # Readiness Probe: Mengetes apakah pod siap menerima trafik dari Ingress / Service
        readinessProbe:
          httpGet:
            path: /ready
            port: 8080
          initialDelaySeconds: 15
          periodSeconds: 5
          timeoutSeconds: 3
          failureThreshold: 2
        lifecycle:
          preStop:
            exec:
              command: ["sh", "-c", "sleep 10"]

Buat file layanan (service) pendukung sebagai app-service.yaml:

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

Langkah 4: Membuat ArgoCD Application Manifest

Definisikan bagaimana ArgoCD memantau repositori Git Anda. Simpan file ini sebagai argocd-app.yaml di luar direktori aplikasi utama (atau dikelola oleh ArgoCD root app):

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: enterprise-web-production
  namespace: argocd
  finalizers:
    - resources-finalizer.argocd.argoproj.io
spec:
  project: default
  source:
    repoURL: 'https://github.com/enterprise/k8s-manifests.git'
    targetRevision: HEAD
    path: production
  destination:
    server: 'https://kubernetes.default.svc'
    namespace: production
  syncPolicy:
    automated:
      prune: true     # Menghapus resource di klaster jika dihapus dari Git
      selfHeal: true  # Mengembalikan perubahan manual (drift) otomatis ke state Git
    syncOptions:
      - CreateNamespace=true

Terapkan aplikasi ArgoCD tersebut ke klaster:

kubectl apply -f argocd-app.yaml

6. Bedah Kode & Penjelasan Detail Baris Kunci

Mari kita bedah beberapa parameter krusial dalam file konfigurasi di atas yang menjadi penentu keberhasilan Zero-Downtime Deployment:

  • maxSurge: 1 & maxUnavailable: 0: Kombinasi ini memastikan bahwa saat rilis versi baru, Kubernetes akan membuat 1 pod baru terlebih dahulu (surge). Karena maxUnavailable diset ke 0, tidak ada satupun pod lama yang dimatikan sebelum pod baru tersebut sukses melewati readinessProbe. Kapasitas backend web Anda tetap 100% penuh selama proses rolling update berlangsung.
  • readinessProbe vs livenessProbe:
    • livenessProbe memeriksa kesehatan internal aplikasi. Jika gagal berulang kali, Kubernetes akan me-restart container (berguna untuk mengatasi memori leak atau hang fatal).
    • readinessProbe sangat krusial untuk Zero-Downtime. Jika endpoint /ready mengembalikan kode selain HTTP 200 (misalnya saat database sedang melakukan migrasi skema di latar belakang), Kubernetes otomatis mencopot pod tersebut dari daftar endpoint Ingress, sehingga tidak ada user request yang masuk ke pod yang belum siap.
  • terminationGracePeriodSeconds: 60 & preStop Hook: Sering kali saat pod menerima sinyal terminasi (SIGTERM), Nginx Ingress Controller masih mengirimkan trafik ke pod tersebut selama beberapa detik karena adanya jeda propagasi endpoint IP. Perintah sleep 10 pada preStop memberikan jeda waktu agar Ingress sempat memperbarui tabel peruteannya, sementara backend (Go/Node/PHP-FPM) menyelesaikan sisa request HTTP yang sedang aktif sebelum proses dimatikan total.

7. Skenario Produksi & Studi Kasus Dunia Nyata

  • Studi Kasus: Sebuah platform e-commerce dengan trafik puncak mencapai 25.000 requests per second (RPS) menggunakan Nginx di front-end, Node.js/Go di backend mikroservis, Redis untuk caching session, dan PostgreSQL untuk database transaksional.
  • Tantangan: Setiap kali deploy versi baru, terjadi lonjakan Error 502 Bad Gateway selama 2-3 detik karena pod lama dimatikan sebelum aplikasi backend selesai memuat koneksi pool database.
  • Solusi Arsitektural:
    1. Mengimplementasikan konfigurasi RollingUpdate dengan maxUnavailable: 0 seperti pada panduan langkah 5.
    2. Menambahkan skrip Graceful Shutdown di dalam kode aplikasi backend Go/Node.js untuk menutup koneksi HTTP server secara elegan setelah menerima SIGTERM.
    3. Mengonfigurasi Cloudflare Cache Rule untuk melayani halaman statis dari Edge Cache ketika backend mengalami transient micro-delay saat perpindahan pod.
  • Hasil Akhir: Peningkatan uptime mencapai 99.999% (five nines), tanpa satu pun keluhan dropped connection dari pengguna akhir selama proses rilis harian (continuous deployment).

8. Common Pitfalls, Anti-Patterns & Solusi

  • Anti-Pattern 1: Menggunakan Tag Image latest di Produksi
    • Dampak: ArgoCD tidak dapat mendeteksi perubahan jika tag image tidak berubah secara eksplisit (latest), mengakibatkan proses rollback manual menjadi mustahil dilakukan secara akurat.
    • Solusi: Selalu gunakan tag versioning yang spesifik (semantic versioning, misal v1.3.1 atau Commit SHA pendek seperti git-a1b2c3d).
  • Anti-Pattern 2: Mengabaikan Resource Limits pada Pod
    • Dampak: Pod baru memakan seluruh resource CPU/RAM node, memicu OOMKilled (Out Of Memory) pada pod lain yang sedang berjalan, menyebabkan kelumpuhan layanan parsial.
    • Solusi: Selalu tentukan blok resources.requests dan resources.limits yang akurat berdasarkan hasil load testing.
  • Anti-Pattern 3: Menjadikan ArgoCD sebagai CI Tool
    • Dampak: Memaksa ArgoCD mem-build kode sumber secara langsung di klaster. ArgoCD adalah CD (Continuous Delivery), bukan CI (Continuous Integration).
    • Solusi: Gunakan GitLab CI atau GitHub Actions untuk melakukan build image Docker dan mem-push-nya ke Container Registry privat, lalu perbarui tag image di repositori Git manifest secara otomatis.

9. Benchmark, Metrik Kinerja & Tuning Performa

Untuk memastikan konfigurasi Zero-Downtime Anda tahan banting terhadap lonjakan beban, lakukan stress testing menggunakan tool k6 atau wrk secara bersamaan saat proses ArgoCD Sync sedang berjalan.

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

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

export const options = {
  stages: [
    { duration: '2m', target: 500 }, // Naikkan perlahan hingga 500 virtual users dalam 2 menit
    { duration: '5m', target: 500 }, // Pertahankan beban selama 5 menit (lakukan ArgoCD sync di fase ini)
    { duration: '1m', target: 0 },   // Turunkan beban secara bertahap
  ],
};

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

Jalankan pengujian di terminal:

k6 run load-test.js
  • Interpretasi Hasil: Selama pengujian berlangsung, jalankan perintah argocd app sync enterprise-web-production. Perhatikan grafik error rate pada k6. Konfigurasi yang sukses akan menunjukkan error rate 0% dan latensi stabil tanpa lonjakan p99 latency yang signifikan.

10. Checklist Penerapan Produksi & Kesimpulan

Sebelum meresmikan arsitektur Zero-Downtime GitOps ini ke lingkungan Live Production, pastikan Anda telah memverifikasi daftar periksa keamanan dan keandalan berikut:

  • Autentikasi ArgoCD diamankan menggunakan SSO / OIDC (Keycloak / Google Workspace) dengan pembatasan RBAC ketat.
  • Seluruh manifes Kubernetes menggunakan tag image berbasis Semantic Versioning atau Git Commit SHA, bukan latest.
  • Konfigurasi readinessProbe dan livenessProbe terpasang di setiap kontainer aplikasi backend dan merespons dengan benar pada endpoint khusus.
  • Pengaturan maxSurge dan maxUnavailable telah diuji coba pada Staging Cluster dengan skenario lonjakan trafik.
  • Mekanisme Graceful Shutdown (terminationGracePeriodSeconds dan preStop hook) aktif untuk mencegah dropped HTTP connections.
  • Integrasi webhook antara repositori Git dan ArgoCD berfungsi untuk memangkas waktu latensi sinkronisasi.
  • Cadangan (Backup) database dan konfigurasi etcd klaster dijalankan secara berkala.

Dengan mengikuti panduan komprehensif ini, tim DevOps dan Platform Engineer Anda memiliki fondasi arsitektural yang kokoh untuk mengeksekusi Continuous Delivery skala enterprise secara aman, cepat, dan transparan tanpa mengorbankan ketersediaan layanan sedikit pun.

🏷️ Tags: #Nginx #High Concurrency #Performance #Sysadmin #Web Server