L
Kubernetes & CI/CD • Literally Web ID

Zero-Downtime Deployment Kubernetes dengan GitOps dan ArgoCD

⏱️ 15 menit baca • 📅 13 Oct 2026 • 👁️ 1 views
Zero-Downtime Deployment Kubernetes dengan GitOps dan ArgoCD

Zero-Downtime Deployment Kubernetes dengan GitOps dan ArgoCD

1. Konteks Industri & Analisis Akar Masalah

Di era komputasi awan modern, kecepatan rilis fitur adalah keunggulan kompetitif utama. Namun, kecepatan ini sering kali dibayar mahal dengan berkurangnya stabilitas sistem. Pendekatan tradisional seperti Imperative Deployment menggunakan skrip CI/CD konvensional (misalnya Jenkins, GitLab CI yang langsung menjalankan perintah kubectl apply atau helm upgrade) menyisakan celah keamanan dan inkonsistensi yang masif. Masalah utamanya terletak pada divergensi antara State di dalam repositori kode dan Actual State yang berjalan di klaster Kubernetes (dikenal sebagai Configuration Drift).

Bayangkan skenario nyata pada platform e-commerce berskala enterprise. Tim backend merilis layanan pembayaran baru menggunakan Go, sementara tim frontend memperbarui aplikasi Node.js. Menggunakan CI/CD push-based konvensional, pipeline CI harus diberikan akses langsung (credentials) berupa kubeconfig ke klaster produksi. Jika terjadi kebocoran token atau kesalahan konfigurasi pada skrip deployment, seluruh klaster produksi dapat tumbang dalam hitungan detik. Selain itu, jika terjadi kegagalan pada saat deployment, proses rollback manual sering kali memakan waktu berharga yang berdampak langsung pada kerugian finansial (revenue loss).

Perbandingan kondisi Sebelum dan Sesudah penerapan GitOps dengan ArgoCD:

Parameter Sebelum (Imperative CI/CD Push) Sesudah (GitOps Pull-based dengan ArgoCD)
Akses Klaster Pipeline CI/CD memiliki akses langsung (kubeconfig) ke klaster. Tidak ada akses eksternal ke klaster; agen di dalam klaster melakukan pull.
Audit Trail Terfragmentasi antara log CI dan status Kubernetes. Terpusat sepenuhnya pada Git commit history.
Drift Detection Sulit dideteksi secara otomatis real-time. Otomatis divalidasi dan divisualisasikan secara real-time oleh ArgoCD.
Rollback Manual (kubectl rollout undo) atau re-run pipeline CI. Cukup lakukan revert commit di Git atau rollback satu klik di UI ArgoCD.

2. Konsep Inti & Deep Dive Arsitektur

GitOps adalah sebuah paradigma operasional yang menggunakan Git sebagai satu-satunya sumber kebenaran tunggal (Single Source of Truth) untuk deklarasi infrastruktur dan aplikasi. Dalam arsitektur Kubernetes, seluruh manifes (Deployment, Service, Ingress, ConfigMap, Secret, Custom Resource) disimpan di dalam repositori Git.

ArgoCD bekerja dengan pola Pull-based Continuous Delivery. ArgoCD controller yang berjalan di dalam klaster Kubernetes secara periodik memindai repositori Git dan membandingkannya dengan kondisi aktual klaster (live state). Jika ditemukan perbedaan (misalnya operator mengubah konfigurasi secara langsung menggunakan kubectl edit), ArgoCD akan menandainya sebagai OutOfSync dan secara otomatis (atau manual berdasarkan kebijakan) menyelaraskannya kembali (sync).

+-------------------------------------------------------------------------+
|                           GIT REPOSITORY                                | 
|         (Manifes Kubernetes: Deployment, Service, Ingress)              | 
+-------------------------------------------------------------------------+
                                     |
                                     | (Poll / Webhook Trigger)
                                     v
+-------------------------------------------------------------------------+
|                            ARGOCD CONTROLLER                            | 
|         - Application Controller (Membandingkan State)                  | 
|         - Repo Server (Meng-generate Manifes dari Helm/Kustomize)       | 
|         - API Server (Menyediakan CLI & UI Dashboard)                   | 
+-------------------------------------------------------------------------+
                                     |
                                     | (Apply Declarative State)
                                     v
+-------------------------------------------------------------------------+
|                        KUBERNETES PRODUCTION CLUSTER                    | 
|    +-------------------------+     +-------------------------------+    | 
|    |      Web App (Go)       |     |        API Service (Node)     |    | 
|    +-------------------------+     +-------------------------------+    | 
+-------------------------------------------------------------------------+

3. Perbandingan Komparatif / Analisis Pendekatan

Dalam mengelola rilis di Kubernetes, terdapat beberapa pendekatan utama yang sering menjadi perdebatan di kalangan Architect dan SRE:

Aspek Komparasi ArgoCD (GitOps) FluxCD (GitOps) Helm + CI/CD Push Argo Rollouts (Advanced)
Arsitektur Pull-based (UI kaya, mudah dipahami) Pull-based (Modular, berbasis controller) Push-based (Raw CI/CD runner) Controller khusus untuk Progressive Delivery
UI / UX Sangat Informatif & Interaktif Minimalis (CLI / Web UI dasar) Bergantung pada tool CI (Jenkins/GitLab) Dashboard visual khusus untuk Canary/Blue-Green
Overhead Resource Sedang-Tinggi (Membutuhkan Redis & API Server) Rendah-Sedang (Ringan, modular) Rendah (Hanya saat pipeline berjalan) Sedang (Membutuhkan Ingress Controller khusus)
Kompleksitas Setup Menengah Menengah-Tinggi Rendah Tinggi
Trade-off Utama Konsumsi memori lebih besar pada klaster Kurang ramah bagi pemula tanpa CLI Risiko keamanan tinggi (Akses kredensial luas) Memerlukan modifikasi infrastruktur Ingress/Service mesh

4. Prasyarat Sistem & Persiapan Lingkungan

Sebelum menginstal ArgoCD dan mengonfigurasi Zero-Downtime Deployment, pastikan lingkungan Anda memenuhi spesifikasi berikut:

  1. Klaster Kubernetes: Versi 1.25+ dengan akses cluster-admin.
  2. Command Line Tools: kubectl, helm (v3+), dan argocd CLI.
  3. Domain & Ingress Controller: Nginx Ingress Controller atau Traefik terpasang di klaster.
  4. Storage & Database pendukung: Redis (bawaan ArgoCD) untuk manajemen sesi internal.

Verifikasi akses klaster Anda:

kubectl cluster-info
kubectl get nodes

5. Panduan Implementasi Langkah demi Langkah

Langkah 1: Instalasi ArgoCD di Klaster Kubernetes

Buat namespace khusus untuk ArgoCD dan instal manifes resmi:

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

Verifikasi bahwa seluruh pod ArgoCD berjalan dengan normal:

kubectl get pods -n argocd

Langkah 2: Mengakses ArgoCD UI

Secara default, argocd-server tidak diekspos secara publik. Ubah Service menjadi NodePort atau gunakan Port Forwarding untuk akses awal:

kubectl port-forward svc/argocd-server -n argocd 8080:443

Akses melalui browser di https://localhost:8080. Untuk mendapatkan password awal administrator, jalankan perintah berikut:

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

Langkah 3: Membuat Repositori Git untuk Aplikasi Web

Struktur direktori repositori Git Anda (gitops-repo) harus terorganisasi dengan baik:

/apps
  ├── production/
  │     ├── namespace.yaml
  │     ├── deployment.yaml
  │     └── service.yaml

Berikut adalah isi file deployment.yaml yang dirancang untuk Zero-Downtime Deployment menggunakan parameter rollingUpdate:

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
        image: registry.internal.net/web-app:v1.0.0
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 8080
        resources:
          requests:
            cpu: "500m"
            memory: "512Mi"
          limits:
            cpu: "1000m"
            memory: "1024Mi"
        readinessProbe:
          httpGet:
            path: /healthz
            port: 8080
          initialDelaySeconds: 5
          periodSeconds: 5
          failureThreshold: 3
        livenessProbe:
          httpGet:
            path: /healthz
            port: 8080
          initialDelaySeconds: 15
          periodSeconds: 10
          failureThreshold: 3

Dan file service.yaml pendukung:

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

Langkah 4: Mendaftarkan Aplikasi ke ArgoCD

Buat file deklaratif aplikasi ArgoCD bernama argocd-app.yaml:

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: enterprise-web-app
  namespace: argocd
spec:
  project: default
  source:
    repoURL: 'https://github.com/company/gitops-repo.git'
    targetRevision: HEAD
    path: apps/production
  destination:
    server: 'https://kubernetes.default.svc'
    namespace: production
  syncPolicy:
    automated:
      prune: true
      selfHeal: true
    syncOptions:
    - CreateNamespace=true

Terapkan manifes aplikasi ke klaster:

kubectl apply -f argocd-app.yaml

6. Bedah Kode & Penjelasan Detail Baris Kunci

Analisis mendalam terhadap parameter krusial dalam konfigurasi di atas:

  • maxSurge: 1 dan maxUnavailable: 0 pada strategi RollingUpdate: Kombinasi ini memastikan bahwa saat proses pembaruan pod berlangsung, Kubernetes akan membuat 1 pod baru terlebih dahulu (surging), dan melarang pod lama dimatikan sebelum pod baru benar-benar siap (maxUnavailable = 0). Hal ini menjamin ketersediaan layanan 100% tanpa dropped requests.
  • readinessProbe dan livenessProbe: Probe ini sangat vital. readinessProbe memberitahu Kubernetes kapan sebuah pod siap menerima traffic dari Service. Jika pod baru belum lulus health check pada path /healthz, traffic tidak akan diarahkan ke pod tersebut. livenessProbe mendeteksi apakah aplikasi mengalami deadlock dan perlu dimulai ulang secara otomatis.
  • syncPolicy.automated.prune: true dan selfHeal: true: Fitur otonomi ArgoCD. Jika ada resource yang dihapus dari Git, ArgoCD akan otomatis menghapusnya dari klaster (prune). Jika seseorang mengubah konfigurasi langsung di klaster secara manual, ArgoCD akan memaksanya kembali sesuai Git (selfHeal).

[!IMPORTANT] Selalu pastikan readinessProbe dikonfigurasi dengan benar. Tanpa probe ini, Kubernetes akan langsung mengarahkan traffic ke pod baru segera setelah proses container creation selesai, padahal aplikasi di dalam container (seperti PHP-FPM atau Node.js) mungkin masih melakukan warm-up atau koneksi database.


7. Skenario Produksi & Studi Kasus Dunia Nyata

Pada sistem web berbeban tinggi (high concurrency dengan ribuan request per detik), proses rolling update standar terkadang masih menyisakan jeda milidetik akibat keterlambatan propagasi endpoint oleh kube-proxy.

Studi Kasus: Platform media berita nasional yang menggunakan backend Go dan frontend Nginx/Node.js mengalami lonjakan traffic mendadak saat breaking news. Tim harus merilis patch keamanan kritis tanpa memutus koneksi WebSocket aktif yang sedang berjalan.

Solusi Lanjutan: Menggabungkan ArgoCD dengan Argo Rollouts untuk Canary Deployment. Argo Rollouts memungkinkan pengarahan traffic secara bertahap (misal: 10% traffic ke versi baru, evaluasi metrik Prometheus/Datadog, lalu naikkan ke 50%, hingga 100%) secara otomatis tanpa intervensi manual.


8. Common Pitfalls, Anti-Patterns & Solusi

  1. Anti-Pattern: Menyimpan Secret Mentah di Git
    • Masalah: Menuliskan kredensial database atau API key secara plain-text di repositori GitOps.
    • Solusi: Gunakan External Secrets Operator atau Mozilla SOPS untuk mengenkripsi secret sebelum disimpan di Git, atau integrasikan dengan HashiCorp Vault.
  2. Pitfalls: Menggunakan Tag latest pada Image Docker
    • Masalah: ArgoCD tidak dapat mendeteksi perubahan jika tag image tidak berubah, atau rollback menjadi tidak deterministik.
    • Solusi: Selalu gunakan tag spesifik berbasis Semantic Versioning (v1.2.3) atau Git Commit SHA (sha-abc1234).
  3. Anti-Pattern: Mengabaikan Resource Limits
    • Masalah: Pod mengalami OOM (Out Of Memory) Kill saat deployment bersamaan karena berebut resource node.
    • Solusi: Tetapkan requests dan limits CPU/Memory yang akurat pada setiap manifes deployment.

9. Benchmark, Metrik Kinerja & Tuning Performa

Untuk memastikan sistem siap menghadapi beban produksi, lakukan pengujian performa menggunakan load testing tool seperti k6 atau wrk selama proses rolling update berlangsung.

Skrip pengujian k6 sederhana untuk memantau error rate saat deployment:

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

export const options = {
  vus: 100,
  duration: '3m',
};

export default function () {
  const res = http.get('https://app.production.net/healthz');
  check(res, {
    'status is 200': (r) => r.status === 200,
  });
  sleep(0.1);
}

Tuning Parameter ArgoCD untuk Klaster Skala Besar: Jika mengelola ratusan aplikasi dalam satu klaster ArgoCD, sesuaikan parameter resource requests pada pod argocd-repo-server dan tingkatkan jumlah controller threads melalui ConfigMap ArgoCD agar sinkronisasi tidak mengalami antrean (bottleneck).


10. Checklist Penerapan Produksi & Kesimpulan

Sebelum mendeklarasikan sistem GitOps Anda siap beroperasi penuh di lingkungan produksi (Go-Live), pastikan checklist berikut terpenuhi:

  • Repositori Git terisolasi dan dilindungi dengan Branch Protection Rules (wajib Pull Request dan Code Review).
  • ArgoCD dikonfigurasi dengan Single Sign-On (SSO) berbasis OIDC (Keycloak/Auth0) dan kontrol akses RBAC yang ketat.
  • Strategi RollingUpdate menggunakan maxUnavailable: 0 dan maxSurge: 1 terpasang di seluruh manifes Deployment.
  • readinessProbe dan livenessProbe aktif dan teruji pada semua layanan web.
  • Sistem manajemen Secret terenkripsi (SOPS / External Secrets) diterapkan dengan sempurna.
  • Notifikasi webhook ArgoCD terhubung ke sistem alert (Slack / PagerDuty) untuk memantau status Sync dan Health secara real-time.

Dengan mengimplementasikan GitOps melalui ArgoCD secara disiplin, organisasi Anda tidak hanya mencapai otomatisasi penuh, tetapi juga membangun infrastruktur web yang tangguh, transparan, dan sangat aman terhadap risiko kesalahan manusia (human error).

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