L
Kubernetes & CI/CD • Literally Web ID

Zero-Downtime Deployment dan GitOps Pipeline Menggunakan ArgoCD dan Kubernetes

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

1. Konteks Industri & Analisis Akar Masalah

Dalam lanskap pengembangan web enterprise modern, kompleksitas infrastruktur web telah melompat jauh melampaui batas server fisik tunggal atau sekadar deployment manual menggunakan skrip shell via SSH. Aplikasi web kontemporer menuntut arsitektur yang sangat terdistribusi, melibatkan kluster Kubernetes multi-node, beban lalu lintas jaringan yang ditangani oleh Load Balancer dan Edge CDN (seperti Cloudflare), sistem caching berlapis (Redis), database transaksional terdistribusi (MySQL/MariaDB), serta tumpukan backend heterogen mulai dari Go, Node.js, hingga PHP-FPM di belakang Nginx/Caddy. Namun, kecepatan pengembangan fitur sering kali berbenturan dengan tembok tebal stabilitas operasional saat rilis dilakukan.

Bottleneck Performa dan Keamanan Konvensional

Pendekatan deployment tradisional—seperti menggunakan CI/CD pipeline push-based (Jenkins, GitLab CI, atau GitHub Actions yang langsung melakukan kubectl apply atau helm upgrade ke kluster produksi)—menyimpan celah kegagalan sistemik yang masif. Pertama, Credential Sprawl: token akses kluster Kubernetes (kubeconfig) dengan hak akses cluster-admin harus disimpan di dalam secret storage sistem CI/CD pihak ketiga. Jika pipeline eksternal tersebut disusupi, seluruh ekosistem kluster produksi runtuh seketika. Kedua, Drift State: kondisi di mana konfigurasi aktual yang berjalan di dalam kluster Kubernetes berbeda dari apa yang tertulis di repositori kode sumber akibat operasi manual darurat (kubectl edit atau kubectl scale). Ketiga, risiko Downtime yang tinggi akibat strategi pembaruan yang naif, di mana aplikasi web mengalami dropped connections, kegagalan pembacaan aset statis (HTML/CSS/JS), atau exhaustion pada pool koneksi database saat pod lama dimatikan sebelum pod baru benar-benar siap melayani lalu lintas HTTP.

Analisis Perbandingan: Sebelum vs Sesudah GitOps

Parameter Operasional Sebelum (Push-Based CI/CD Tradisional) Sesudah (GitOps dengan ArgoCD & Kubernetes) Dampak pada Ekosistem Web
Model Eksekusi CI tool mendorong perubahan ke kluster. ArgoCD menarik perubahan dari Git (Pull). Mengeliminasi kebutuhan membuka akses port kluster ke luar.
Audit Trail Fragmentasi log antara CI dan server target. Git Commit History adalah satu-satunya sumber kebenaran (Single Source of Truth). Keterlacakan instan siapa yang mengubah parameter web server atau environment variable.
Rollback Time Membutuhkan re-trigger pipeline CI/CD (lambat). Cukup melakukan git revert atau ArgoCD rollback (detik). Minimalisasi Mean Time to Recovery (MTTR) saat terjadi kegagalan rilis backend/frontend.
Konfigurasi Secret Plaintext atau terenkripsi lemah di dalam repo CI. Terintegrasi External Secrets Operator dengan AWS Secrets Manager/Vault. Keamanan kredensial database, API Key, dan sertifikat SSL/TLS terjaga ketat.

2. Konsep Inti & Deep Dive Arsitektur

GitOps adalah paradigma operasional yang mengambil praktik terbaik dari pengembangan perangkat lunak—kontrol versi, kolaborasi, tinjauan kode (code review), dan integrasi/pengiriman berkelanjutan—lalu menerapkannya pada manajemen infrastruktur dan deployment aplikasi. Dalam ekosistem ini, ArgoCD bertindak sebagai declarative continuous delivery tool berbasis Kubernetes yang berjalan langsung di dalam kluster.

Alur Eksekusi Under the Hood

+------------------+      1. Git Commit & Push      +------------------------+
| Developer / Git  | -----------------------------> | Git Repository (GitHub)|
+------------------+                                +------------------------+
                                                                 |
                                                    2. Polling / Webhook
                                                                 v
+----------------------------------------------------------------+------------------------------------------------+
| Kubernetes Production Cluster                                  |                                                |
|                                                                |                                                |
|  +--------------------+   3. Sync & Reconcile   +----------------------------+                                  |
|  | ArgoCD Application | ----------------------> | Target Live Kubernetes State|                                  |
|  +--------------------+                         +----------------------------+                                  |
|            ^                                                  |                                                 |
|            | 4. Health Check & Metrics                        v                                                 |
|            +------------------------------------ [ Pods: Nginx, Go/Node, PHP-FPM, Redis ]                        |
+----------------------------------------------------------------------------------------------------------------+
  1. Declarative Specification: Seluruh manifest Kubernetes (Deployment, Service, Ingress, ConfigMap, Horizontal Pod Autoscaler) didefinisikan dalam bentuk file YAML dan disimpan di dalam repositori Git.
  2. Synchronization Engine: ArgoCD secara kontinu membandingkan status aktual (Live State) dari kluster Kubernetes dengan status yang diinginkan (Desired State) yang dideklarasikan di repositori Git.
  3. Automated Reconciliation: Jika terdapat perbedaan (misalnya, ada perubahan versi image Docker dari tag v1.2.0 ke v1.3.0 di Git), ArgoCD secara otomatis atau manual (bergantung pada konfigurasi sync policy) menerapkan perubahan tersebut ke dalam kluster.
  4. Health Assessment: ArgoCD tidak hanya mengecek apakah objek Kubernetes ada, tetapi juga mengevaluasi metrik kesehatan internal pod (apakah liveness/readiness probe merespons, apakah terjadi CrashLoopBackOff).

3. Perbandingan Komparatif / Analisis Pendekatan

Untuk memilih strategi pembaruan (deployment strategy) yang tepat bagi aplikasi web enterprise, arsitek infrastruktur harus memahami trade-off mendasar antara kompleksitas, penggunaan sumber daya (CPU/RAM), dan latensi bagi pengguna akhir.

Strategi Deployment Konsumsi Sumber Daya Tambahan Latency Impact saat Rilis Kompleksitas Arsitektur Cocok untuk Jenis Layanan
Recreate 0 (Pod lama dimatikan total). Tinggi (Downtime terjadi). Sangat Rendah Internal tools / Staging environment.
Rolling Update Rendah (~25% ekstra kapasitas). Minimal hingga Nol. Rendah (Bawaan Kubernetes) General web apps, REST API, Static Site Serving.
Canary (Argo Rollouts) Sedang (~50%-100% ekstra selama fase uji). Zero-latency untuk mayoritas user. Tinggi Aplikasi high-traffic, e-commerce, core banking API.
Blue/Green Tinggi (100% duplikasi pod). Nol. Menengah-Tinggi Aplikasi yang membutuhkan migrasi skema database instan.

[!WARNING] Jangan pernah menggunakan strategi Recreate untuk layanan web produksi yang menghadap publik (public-facing), karena hal ini secara inheren menciptakan downtime total yang berdampak langsung pada hilangnya pendapatan dan rusaknya metrik SEO akibat error HTTP 503.


4. Prasyarat Sistem & Persiapan Lingkungan

Sebelum mengimplementasikan pipeline GitOps menggunakan ArgoCD dan Kubernetes, pastikan lingkungan operasional memenuhi spesifikasi minimum berikut:

  • Kluster Kubernetes: Versi 1.25 atau lebih baru dengan hak akses cluster-admin untuk instalasi Controller.
  • Alat CLI: kubectl, helm (v3+), argocd CLI.
  • Akses Jaringan: Akses outbound HTTPS dari kluster ke repositori Git (GitHub/GitLab) dan container registry (Docker Hub, GitHub Packages, atau AWS ECR).
  • Storage & Ingress Controller: Nginx Ingress Controller atau Traefik yang sudah terpasang, serta Cert-Manager untuk otomatisasi SSL/TLS Let's Encrypt.

Verifikasi kesiapan kluster dengan perintah berikut:

kubectl version --client
kubectl get nodes -o wide

5. Panduan Implementasi Langkah demi Langkah

Langkah 1: Instalasi ArgoCD ke dalam Kluster Kubernetes

Buat namespace khusus untuk ArgoCD dan instal menggunakan manifest resmi stabil.

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 normal:

kubectl get pods -n argocd

Dapatkan kata sandi awal untuk akun admin ArgoCD:

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

Akses dashboard ArgoCD menggunakan port-forwarding:

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

Langkah 2: Konfigurasi External Secrets Operator

Untuk mengamankan manajemen secret (koneksi database MySQL, Redis auth, API tokens), kita menggunakan External Secrets Operator yang menghubungkan Kubernetes dengan penyimpanan eksternal yang aman.

Instal External Secrets Operator via Helm:

helm repo add external-secrets https://charts.external-secrets.io
helm repo update
helm install external-secrets external-secrets/external-secrets \
  --namespace external-secrets \
  --create-namespace \
  --set installCRDs=true

Langkah 3: Menyiapkan Manifest Aplikasi Web Produksi

Buat struktur direktori repositori Git Anda dengan format berikut:

k8s-manifests/
├── apps/
│   └── webapp-production.yaml
└── base/
    ├── deployment.yaml
    ├── service.yaml
    ├── ingress.yaml
    └── externalsecret.yaml

Berikut adalah file konfigurasi manifest Kubernetes yang valid, lengkap, dan siap produksi untuk aplikasi web berbasis Go/Node.js/PHP:

# k8s-manifests/base/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: enterprise-webapp
  namespace: production
  labels:
    app.kubernetes.io/name: enterprise-webapp
    environment: production
spec:
  replicas: 3
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 0
  selector:
    matchLabels:
      app.kubernetes.io/name: enterprise-webapp
  template:
    metadata:
      labels:
        app.kubernetes.io/name: enterprise-webapp
    spec:
      containers:
      - name: webapp
        image: registry.company.internal/core/webapp:v1.4.2
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 8080
          name: http
        resources:
          limits:
            cpu: "1"
            memory: 1024Mi
          requests:
            cpu: "250m"
            memory: 256Mi
        livenessProbe:
          httpGet:
            path: /healthz
            port: 8080
          initialDelaySeconds: 15
          periodSeconds: 10
          failureThreshold: 3
        readinessProbe:
          httpGet:
            path: /ready
            port: 8080
          initialDelaySeconds: 5
          periodSeconds: 5
          successThreshold: 1
        envFrom:
        - secretRef:
            name: webapp-secret-config
---
# k8s-manifests/base/service.yaml
apiVersion: v1
kind: Service
metadata:
  name: enterprise-webapp-svc
  namespace: production
spec:
  type: ClusterIP
  ports:
  - port: 80
    targetPort: http
    protocol: TCP
    name: http
  selector:
    app.kubernetes.io/name: enterprise-webapp
---
# k8s-manifests/base/ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: enterprise-webapp-ingress
  namespace: production
  annotations:
    kubernetes.io/ingress.class: "nginx"
    cert-manager.io/cluster-issuer: "letsencrypt-prod"
    nginx.ingress.kubernetes.io/ssl-redirect: "true"
    nginx.ingress.kubernetes.io/proxy-body-size: "50M"
spec:
  tls:
  - hosts:
    - app.company.com
    secretName: enterprise-webapp-tls
  rules:
  - host: app.company.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: enterprise-webapp-svc
            port:
              number: 80

Langkah 4: Mendaftarkan Aplikasi ke ArgoCD

Buat file manifest ArgoCD Application (apps/webapp-production.yaml):

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: enterprise-webapp
  namespace: argocd
  finalizers:
    - resources-finalizer.argocd.argoproj.io
spec:
  project: default
  source:
    repoURL: 'https://github.com/company/k8s-manifests.git'
    targetRevision: HEAD
    path: base
  destination:
    server: 'https://kubernetes.default.svc'
    namespace: production
  syncPolicy:
    automated:
      prune: true
      selfHeal: true
    syncOptions:
      - CreateNamespace=true

Terapkan manifest aplikasi ke ArgoCD:

kubectl apply -f k8s-manifests/apps/webapp-production.yaml

6. Bedah Kode & Penjelasan Detail Baris Kunci

  • maxSurge: 1 & maxUnavailable: 0: Kombinasi ini adalah kunci mutlak zero-downtime deployment. maxSurge: 1 mengizinkan Kubernetes membuat 1 pod tambahan melebihi jumlah replika standar saat proses rolling update berlangsung. maxUnavailable: 0 memastikan bahwa tidak ada satu pun pod lama yang dimatikan sebelum pod baru berhasil dibuat dan dinyatakan siap (Ready). Hal ini menjaga ketersediaan layanan 100% di hadapan Load Balancer.
  • readinessProbe vs livenessProbe: livenessProbe bertugas mendeteksi apakah aplikasi mengalami deadlock (jika gagal, pod akan di-restart secara paksa). Sebaliknya, readinessProbe menentukan apakah pod siap menerima lalu lintas HTTP dari Ingress Nginx. Jika aplikasi web sedang melakukan koneksi awal ke database MySQL atau memuat cache Redis yang besar, readinessProbe akan menahan pengiriman traffic hingga aplikasi benar-benar siap.
  • selfHeal: true & prune: true pada ArgoCD Sync Policy: Fitur selfHeal memastikan jika ada operator nakal yang mengubah resource di kluster secara manual (kubectl scale), ArgoCD akan langsung meresetnya sesuai file di Git. prune memastikan objek Kubernetes yang dihapus dari repositori Git akan otomatis dihapus juga dari kluster produksi.

7. Skenario Produksi & Studi Kasus Dunia Nyata

Dalam sebuah studi kasus penanganan Flash Sale E-Commerce dengan lonjakan transaksi mencapai 50.000 requests per second (RPS), arsitektur web didukung oleh kluster Kubernetes 20 node, dengan backend Go berkinerja tinggi, database MySQL berarsitektur primary-replica, dan Redis Cluster untuk distributed locking.

Ketika tim rilis mendorong pembaruan fitur keranjang belanja (v1.4.3), strategi Rolling Update konvensional dapat memicu lonjakan koneksi baru ke database saat pod baru melakukan cold start. Untuk mengatasinya, kami menerapkan Readiness Probe berbobot penundaan (initialDelaySeconds: 15) dipadukan dengan Horizontal Pod Autoscaler (HPA) yang memantau metrik penggunaan CPU dan kustom metrik HTTP request latency. Hasilnya, ArgoCD melakukan sinkronisasi secara bertahap, dan Ingress Nginx mengalirkan traffic secara mulus tanpa mencatat satupun dropped connection atau HTTP 5xx error di sisi klien.


8. Common Pitfalls, Anti-Patterns & Solusi

  1. Anti-Pattern: Menyimpan Plaintext Secrets di Repositori Git
    • Dampak: Kunci rahasia API, password database MySQL, dan private key SSL bocor ke publik jika repositori bersifat public atau akun pengembang disusupi.
    • Solusi: Selalu gunakan External Secrets Operator atau HashiCorp Vault. Repositori Git hanya menyimpan referensi (ExternalSecret CRD) menuju penyimpanan aman eksternal.
  2. Pitfall: Mengabaikan Resource Limits pada Pod Web Server
    • Dampak: Satu pod aplikasi web yang mengalami memory leak dapat melahap seluruh RAM node Kubernetes, menyebabkan Node Eviction dan mematikan pod lain (misalnya Redis atau Nginx).
    • Solusi: Tentukan parameter resources.limits dan resources.requests secara ketat pada setiap manifes deployment.
  3. Kesalahan Konfigurasi Graceful Shutdown
    • Dampak: Saat pod lama dimatikan oleh Kubernetes, koneksi HTTP aktif yang sedang memproses pembayaran atau unggah file terputus di tengah jalan.
    • Solusi: Pastikan aplikasi backend web Anda mendengarkan sinyal sistem operasi (SIGTERM) dan memberikan waktu jeda (terminationGracePeriodSeconds: 30) agar permintaan yang sedang berjalan dapat diselesaikan sebelum proses pod dihentikan total.

9. Benchmark, Metrik Kinerja & Tuning Performa

Untuk memvalidasi bahwa pipeline GitOps dan konfigurasi zero-downtime berjalan sempurna di bawah tekanan, lakukan pengujian beban (load testing) menggunakan tool modern seperti k6 atau wrk sembari melakukan proses argoCD sync secara simultan.

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 VUs
    { duration: '5m', target: 500 }, // Pertahankan 500 VUs
    { duration: '2m', target: 0 },   // Ramp-down
  ],
  thresholds: {
    http_req_duration: ['p(99)<250'], // 99% request harus di bawah 250ms
    http_req_failed: ['rate<0.01'],  // Error rate harus di bawah 1%
  },
};

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

Tuning Parameter Lanjutan

  • Kernel Sysctl Tuning: Sesuaikan parameter Linux kernel pada node worker Kubernetes untuk menangani tingginya koneksi TCP:
    sysctl -w net.core.somaxconn=65535
    sysctl -w net.ipv4.tcp_max_syn_backlog=65535
    
  • Nginx Ingress Keepalive: Optimalkan konfigurasi Ingress Controller untuk mengaktifkan kembali koneksi keep-alive guna memangkas latensi TLS handshake.

10. Checklist Penerapan Produksi & Kesimpulan

Sebelum meresmikan pipeline GitOps ArgoCD dan Kubernetes ke lingkungan produksi enterprise, pastikan seluruh item dalam checklist berikut telah terpenuhi:

  • Repositori Git manifest terisolasi dan hanya dapat diakses melalui Pull Request dengan Branch Protection Rules aktif.
  • ArgoCD dikonfigurasi dengan autentikasi berbasis RBAC terintegrasi (OAuth2/SSO perusahaan).
  • Seluruh Secret dikelola via External Secrets Operator, bebas dari hardcoded string.
  • Strategi RollingUpdate diatur dengan maxSurge: 1 dan maxUnavailable: 0.
  • Liveness dan Readiness Probe terkonfigurasi dengan benar pada setiap pod aplikasi web.
  • Monitoring dan Alerting (Prometheus & Grafana) aktif untuk mendeteksi Sync Status dan Pod CrashLoopBackOff secara real-time.

Dengan mengintegrasikan ArgoCD dan Kubernetes secara disiplin mengikuti panduan ini, organisasi Anda tidak hanya mencapai otomatisasi penuh melalui paradigma GitOps, tetapi juga menjamin ketersediaan layanan tanpa celah (zero-downtime) bagi seluruh pengguna akhir di tingkat enterprise.

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