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

Zero-Downtime Deployment Kubernetes dengan ArgoCD dan GitOps Pipeline

⏱️ 18 menit baca β€’ πŸ“… 19 Oct 2026 β€’ πŸ‘οΈ 4 views
Zero-Downtime Deployment Kubernetes dengan ArgoCD dan GitOps Pipeline

Zero-Downtime Deployment Kubernetes dengan ArgoCD dan GitOps Pipeline

1. Konteks Industri & Analisis Akar Masalah

Dalam lanskap arsitektur web modern yang menuntut ketersediaan 99.999% (five-nines availability), deployment aplikasi bukan lagi sekadar memindahkan file kode ke server produksi. Skala ekosistem web saat iniβ€”yang sering kali didukung oleh backend Go berkinerja tinggi, PHP-FPM di balik Nginx, antrean pesan Redis, hingga penyimpanan terdistribusi S3/MinIOβ€”membutuhkan orkestrasi yang presisi. Pendekatan Traditional Push CI/CD (menggunakan Jenkins, GitLab CI, atau GitHub Actions untuk langsung melakukan kubectl apply ke cluster) telah mencapai batas kemampuannya dalam hal keamanan dan auditabilitas.

Analisis Akar Masalah Push CI/CD:

  1. Keterbukaan Kredensial Berlebihan: CI/CD runner eksternal harus memegang kredensial kubeconfig dengan hak akses penuh (cluster-admin) untuk memodifikasi state cluster. Jika runner ini disusupi, seluruh infrastruktur terkompromi.
  2. Drift State: Seringkali terjadi perbedaan antara state aktual di dalam cluster Kubernetes dengan state yang didefinisikan di repositori Git akibat perubahan manual darurat (hotfix via kubectl edit).
  3. Kurangnya Visibilitas Real-time: Sulit melacak siapa yang mengubah apa dan kapan, serta memulihkan (rollback) keadaan cluster dengan cepat saat terjadi kegagalan rilis.

Kondisi Sebelum vs Sesudah Penerapan GitOps dengan ArgoCD

Parameter Sebelum (Traditional Push CI/CD) Sesudah (ArgoCD & GitOps)
Akses Cluster CI/CD Server memiliki akses langsung via kubeconfig. Cluster mengambil (pull) perubahan dari Git, zero external inbound access.
Audit Trail Terfragmentasi antara log CI tool dan aksi manual terminal. Git commit history adalah satu-satunya sumber kebenaran (single source of truth).
Recovery Time (MTTR) Lambat, harus menjalankan ulang pipeline CI atau manual hotfix. Sangat cepat, cukup lakukan git revert atau klik tombol Rollback di ArgoCD UI.
Konfigurasi Drift Sering terjadi configuration drift tanpa deteksi dini. Otomatis terdeteksi (OutOfSync) dan dapat disinkronisasi otomatis.

[!WARNING] Memberikan akses cluster-admin kepada eksternal CI/CD runner adalah pelanggaran keamanan fatal (anti-pattern) dalam standar kepatuhan enterprise seperti SOC2 dan ISO 27001.


2. Konsep Inti & Deep Dive Arsitektur

GitOps membalik paradigma dari Push menjadi Pull. Dalam model ini, Git bertindak sebagai Single Source of Truth untuk deklarasi infrastruktur dan aplikasi. ArgoCD, sebagai implementasi Continuous Delivery berbasis Kubernetes, berjalan di dalam cluster itu sendiri dan secara kontinyu mencocokkan state aktual cluster dengan state yang diinginkan di repositori Git.

Arsitektur Alur Data ArgoCD (Visualisasi ASCII)

 +------------+      1. Git Commit      +-----------------+
 | Developer  | ----------------------> | Git Repository  |
 +------------+                         +-----------------+
                                                 |
                                                 | 2. Polling / Webhook
                                                 v
 +-----------------------------------------------------------------+
 | Kubernetes Cluster                                              |
 |                                                                 |
 |  +---------------------+   3. Reconcile Loop   +--------------+ |
 |  | ArgoCD Application  | <===================> | Target State |
 |  | Controller          |                       +--------------+ |
 |  +---------------------+                              |
 |             |                                         |
 |             | 4. Apply Manifests                      v
 |             v                                  +--------------+ |
 |  +---------------------+                       | Live State   |
 |  | Kubernetes API      |                       | (Pods, Svc)  |
 |  +---------------------+                       +--------------+ |
 +-----------------------------------------------------------------+

Komponen Utama ArgoCD:

  1. API Server: Endpoint gRPC/HTTPS yang melayani UI, CLI, dan webhook.
  2. Repository Server: Komponen internal yang melakukan clone repositori Git, merender template Helm/Kustomize, dan menghasilkan manifest Kubernetes mentah.
  3. Application Controller: Reconciliation engine yang membandingkan manifest target (dari Repositori) dengan manifest live (dari Kubernetes API server) secara berkala (default tiap 3 menit atau dipicu oleh webhook).

3. Perbandingan Komparatif / Analisis Pendekatan

Untuk mengelola manifes aplikasi web enterprise (multi-environment: staging, production), terdapat beberapa pendekatan templating dan manajemen konfigurasi yang umum digunakan:

Fitur / Metrik Helm Charts Kustomize Plain YAML + Envsubst
Kompleksitas Kurva Belajar Sedang - Tinggi (Go template syntax) Rendah - Sedang (Overlay patching) Sangat Rendah
Manajemen Parameter Sangat Kuat (values.yaml) Baik (Strategic Merge Patches) Buruk (Raw string replacement)
Dukungan Multi-Environment Native melalui subchart/values Sangat baik melalui struktur overlays/ Manual / Script Bash kustom
Overhead CPU/RAM Menuntut rendering server-side Native di kubectl & ArgoCD (client-side) Minimal
Trade-off Latency Render template memakan waktu mikrodetik tambahan Cepat, berbasis manipulasi struktur YAML Rentan kesalahan ketik (human error)

[!TIP] Untuk arsitektur web modern yang kompleks dengan banyak layanan mikro (microservices), kombinasi Helm untuk chart dasar dan Kustomize untuk patching spesifik environment adalah standar industri terbaik.


4. Prasyarat Sistem & Persiapan Lingkungan

Sebelum mengimplementasikan pipeline GitOps, pastikan infrastruktur pendukung Anda memenuhi spesifikasi berikut:

  • Kubernetes Cluster: Versi 1.25+ (diuji pada EKS/GKE/K3s).
  • CLI Tools: kubectl, helm, argocd CLI terinstall di mesin lokal/jump host.
  • Storage: S3-compatible storage (MinIO atau AWS S3) untuk aset statis aplikasi web.
  • Database: Akses ke instance MySQL/MariaDB dan Redis cluster untuk caching.
  • Namespaces: Pemisahan namespace yang jelas:
    • argocd: Tempat instalasi controller ArgoCD.
    • ingress-nginx: Controller ingress untuk routing lalu lintas web.
    • production: Namespace aplikasi web live.

Verifikasi Akses Cluster

kubectl cluster-info
kubectl get nodes -o wide

5. Panduan Implementasi Langkah demi Langkah

Langkah 1: Instalasi ArgoCD ke Cluster

Jalankan perintah berikut untuk menginstal ArgoCD pada namespace argocd:

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 -w

Ubah service ArgoCD Server menjadi NodePort atau LoadBalancer, atau gunakan port-forwarding untuk akses awal:

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

Dapatkan password awal admin:

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

Langkah 2: Struktur Repositori Git

Buat repositori Git terpisah untuk konfigurasi deployment (GitOps Repo). Contoh struktur direktori:

k8s-gitops-config/
β”œβ”€β”€ apps/
β”‚   └── production/
β”‚       β”œβ”€β”€ web-app-values.yaml
β”‚       └── argocd-application.yaml
└── charts/
    └── web-app/
        β”œβ”€β”€ Chart.yaml
        β”œβ”€β”€ values.yaml
        └── templates/
            β”œβ”€β”€ deployment.yaml
            β”œβ”€β”€ service.yaml
            └── ingress.yaml

Langkah 3: Konfigurasi Helm Chart Aplikasi Web (charts/web-app/templates/deployment.yaml)

Berikut adalah file manifest deployment Kubernetes yang dirancang untuk zero-downtime dengan strategi RollingUpdate dan Readiness/Liveness Probes yang presisi untuk backend web (misalnya Node.js/Go/PHP-FPM):

apiVersion: apps/v1
kind: Deployment
metadata:
  name: {{ .Release.Name }}-web
  namespace: {{ .Release.Namespace }}
  labels:
    app.kubernetes.io/name: {{ .Release.Name }}-web
    app.kubernetes.io/part-of: enterprise-web
spec:
  replicas: {{ .Values.replicaCount }}
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 0
  selector:
    matchLabels:
      app.kubernetes.io/name: {{ .Release.Name }}-web
  template:
    metadata:
      labels:
        app.kubernetes.io/name: {{ .Release.Name }}-web
    spec:
      containers:
        - name: web
          image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
          imagePullPolicy: {{ .Values.image.pullPolicy }}
          ports:
            - containerPort: 8080
              name: http
          env:
            - name: DB_HOST
              valueFrom:
                secretKeyRef:
                  name: {{ .Release.Name }}-secrets
                  key: db-host
            - name: REDIS_URL
              valueFrom:
                secretKeyRef:
                  name: {{ .Release.Name }}-secrets
                  key: redis-url
          resources:
            {{- toYaml .Values.resources | nindent 12 }}
          readinessProbe:
            httpGet:
              path: /healthz
              port: 8080
            initialDelaySeconds: 5
            periodSeconds: 10
            timeoutSeconds: 3
            failureThreshold: 3
          livenessProbe:
            httpGet:
              path: /livez
              port: 8080
            initialDelaySeconds: 15
            periodSeconds: 20
            timeoutSeconds: 3
            failureThreshold: 3

Langkah 4: Definisi ArgoCD Application (apps/production/argocd-application.yaml)

Manifest ini memberitahu ArgoCD untuk memantau repositori Git dan melakukan sinkronisasi otomatis ke cluster:

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: production-web-app
  namespace: argocd
  finalizers:
    - resources-finalizer.argocd.argoproj.io
spec:
  project: default
  source:
    repoURL: 'https://github.com/company/k8s-gitops-config.git'
    targetRevision: HEAD
    path: charts/web-app
    helm:
      valueFiles:
        - ../../apps/production/web-app-values.yaml
  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 manifes Application ini ke cluster untuk memulai magic ArgoCD:

kubectl apply -f apps/production/argocd-application.yaml

6. Bedah Kode & Penjelasan Detail Baris Kunci

Mari kita bedah parameter krusial dalam konfigurasi di atas untuk memastikan pemahaman mendalam:

  1. strategy.type: RollingUpdate dengan maxSurge: 1 dan maxUnavailable: 0:
    • Kombinasi ini adalah kunci Zero-Downtime. maxUnavailable: 0 menjamin bahwa tidak ada satupun pod lama yang dimatikan sebelum pod baru benar-benar siap dan sehat (ready). maxSurge: 1 mengizinkan pembuatan 1 pod ekstra di atas jumlah replica normal selama proses deployment berlangsung.
  2. readinessProbe dan livenessProbe:
    • Endpoint /healthz memastikan bahwa aplikasi web telah selesai melakukan warm-up (misalnya koneksi database terjalin, cache Redis siap) sebelum Kubernetes mengarahkan lalu lintas HTTP dari Ingress Nginx ke pod tersebut.
  3. syncPolicy.automated dengan prune: true dan selfHeal: true:
    • prune: true memastikan resource Kubernetes yang dihapus dari chart Git akan otomatis dihapus dari cluster. selfHeal: true memaksa cluster melakukan koreksi otomatis jika ada sysadmin nakal yang mengubah resource secara manual via kubectl scale atau kubectl edit.

7. Skenario Produksi & Studi Kasus Dunia Nyata

Dalam skenario penanganan trafik tinggi (flash sale atau high concurrency event web e-commerce), infrastruktur harus merespons lonjakan beban secara instan tanpa gangguan koneksi:

  • Koneksi WebSocket & Long-polling: Saat deployment berjalan, pod lama tidak boleh langsung diputus (SIGKILL). Kubernetes akan mengirimkan sinyal SIGTERM, memberikan grace period (terminationGracePeriodSeconds: 30) agar backend dapat menyelesaikan permintaan HTTP aktif dan memutuskan koneksi WebSocket secara elegan (graceful shutdown).
  • Horizontal Pod Autoscaler (HPA) Integration: ArgoCD mengelola base deployment, sementara HPA mengatur fluktuasi replika berdasarkan utilisasi CPU/Memory. Konfigurasi maxSurge pada ArgoCD memastikan transisi skala tidak bertabrakan dengan proses rolling update.

8. Common Pitfalls, Anti-Patterns & Solusi

  1. Anti-Pattern: Menyimpan Secret Mentah di Git
    • Masalah: Menulis password database atau API key secara plain text di values.yaml.
    • Solusi: Gunakan External Secrets Operator atau Bitnami Sealed Secrets untuk mengenkripsi secret sebelum masuk ke Git.
  2. Pitfall: Lupa Mengatur terminationGracePeriodSeconds
    • Masalah: Pod langsung mati saat deployment, mengakibatkan koneksi klien terputus mendadak (Connection Reset by Peer).
    • Solusi: Selalu definisikan waktu grace period minimal 30-60 detik di tingkat pod spec.
  3. Pitfall: Infinite Sync Loop karena Kustomize/Helm Dinamis
    • Masalah: Menggunakan tanggal/waktu dinamis (now) di dalam template manifest, membuat ArgoCD mengira selalu ada perubahan setiap detik.
    • Solusi: Jaga agar manifest bersifat idempotent dan deterministik.

9. Benchmark, Metrik Kinerja & Tuning Performa

Untuk menguji apakah konfigurasi zero-downtime benar-benar berjalan sempurna tanpa satupun dropped packet atau kegagalan HTTP 5xx saat deployment, gunakan tool load testing seperti k6 atau wrk yang dikombinasikan dengan pengujian rilis.

Skrip Uji Beban 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 VUs
    { duration: '5m', target: 100 }, // Pertahankan beban selama deployment
    { duration: '2m', target: 0 },   // Ramp down
  ],
};

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

Jalankan skrip ini secara bersamaan saat Anda melakukan git push versi baru aplikasi web ke repositori GitOps. Pastikan metrik tingkat keberhasilan (success rate) tetap berada di angka 100% (1.00).


10. Checklist Penerapan Produksi & Kesimpulan

Sebelum meluncurkan pipeline GitOps berbasis ArgoCD ini ke lingkungan produksi enterprise, verifikasi seluruh item dalam checklist berikut:

  • Akses cluster ke repository Git menggunakan SSH Key / Deploy Token yang aman.
  • Semua deployment memiliki readinessProbe dan livenessProbe yang valid.
  • Konfigurasi strategy.rollingUpdate diset dengan maxUnavailable: 0.
  • Secret dikelola menggunakan enkripsi (Sealed Secrets / Vault), bukan plain text.
  • Webhook Git diaktifkan di ArgoCD untuk mempercepat waktu sinkronisasi (sync reconciliation).
  • Monitoring Prometheus dan Grafana terpasang untuk memantau kesehatan ArgoCD controller dan aplikasi web.

Dengan mengintegrasikan ArgoCD dan praktik GitOps, tim SRE dan DevOps dapat mencapai tingkat otomatisasi, keamanan, dan keandalan operasional tertinggi, memastikan setiap rilis kode web berjalan mulus tanpa dirasakan oleh pengguna akhir.

🏷️ Tags: #Devops #Kubernetes #Ci/Cd #Gitops #Argocd