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

Zero-Downtime Deployment: Strategi GitOps Menggunakan ArgoCD dan Kubernetes

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

Zero-Downtime Deployment: Strategi GitOps Menggunakan ArgoCD dan Kubernetes

1. Konteks Industri & Analisis Akar Masalah

Dalam lanskap arsitektur web modern yang menuntut ketersediaan layanan hingga high availability 99.99%, proses deployment aplikasi sering kali menjadi titik kritis (single point of failure) yang memicu gangguan layanan. Pendekatan CI/CD tradisionalβ€”di mana server Continuous Integration (seperti Jenkins, GitLab CI, atau GitHub Actions) memiliki akses langsung (cluster-admin) ke klaster Kubernetes produksi untuk melakukan perintah kubectl apply atau helm upgradeβ€”menyimpan kerentanan serius dari sisi keamanan dan konsistensi status sistem.

Analisis Akar Masalah:

  1. Drift Konfigurasi (Configuration Drift): Perubahan manual langsung pada klaster produksi (hotfixing menggunakan kubectl edit) sering terjadi saat insiden mendadak, menyebabkan perbedaan permanen antara status aktual di dalam klaster dengan status yang didefinisikan di dalam repositori Git.
  2. Kelemahan Kredensial (Credential Spreading): Server CI/CD eksternal membutuhkan penyimpanan kubeconfig dengan hak akses luas. Jika server CI/CD tersebut disusupi, penyerang memiliki akses penuh ke seluruh infrastruktur Kubernetes.
  3. Kurangnya Visibilitas Real-time: Seringkali tim operasional tidak mengetahui secara pasti apakah versi kode yang berjalan di produksi benar-benar merefleksikan commit terakhir di branch main tanpa melakukan audit manual secara berkala.

Kondisi Sebelum vs Sesudah Penerapan GitOps dengan ArgoCD:

Parameter Sebelum (Push-Based CI/CD Tradisional) Sesudah (Pull-Based GitOps dengan ArgoCD)
Model Eksekusi Push: Server CI/CD men-push perubahan ke Klaster. Pull: ArgoCD di dalam klaster menarik perubahan dari Git.
Keamanan Kredensial Kredensial produksi disimpan di luar klaster (CI/CD server). Klaster mandiri; tidak ada kredensial eksternal yang masuk ke klaster.
Audit Trail Terfragmentasi antara log CI/CD dan history Kubernetes. Terpusat penuh pada Git commit history dan ArgoCD state.
Rollback Mekanisme Kompleks, harus mentrigger ulang pipeline CI/CD versi sebelumnya. Instan, cukup lakukan git revert atau sinkronisasi ulang ke commit sebelumnya di ArgoCD.

2. Konsep Inti & Deep Dive Arsitektur

GitOps adalah sebuah paradigma operasional yang menggunakan repositori Git sebagai sumber kebenaran tunggal (single source of truth) untuk deklarasi infrastruktur dan konfigurasi aplikasi. ArgoCD adalah implementasi declarative, continuous delivery GitOps tool untuk Kubernetes yang bekerja dengan pola pull-based.

Alur Kerja di Bawah Tendangan (Under the Hood Flow):

  1. Developer melakukan commit dan push perubahan manifest Kubernetes atau Helm Chart ke repositori Git.
  2. ArgoCD Application Controller secara berkala (atau dipicu oleh webhook dari Git) melakukan polling terhadap repositori Git target.
  3. ArgoCD membandingkan Desired State (kondisi yang dideklarasikan di Git) dengan Live State (kondisi aktual objek di dalam klaster Kubernetes).
  4. Jika terdeteksi perbedaan (out of sync), ArgoCD memvisualisasikannya di UI/CLI dan (jika mode auto-sync diaktifkan) secara otomatis menerapkan perubahan tersebut ke klaster.
+-------------------------------------------------------------+
|                        Developer                            |
+------------------------------+------------------------------+
                               | git push
                               v
+-------------------------------------------------------------++
|                     Git Repository                          |
|           (Desired State: Manifests / Helm Charts)          |
+------------------------------+------------------------------+
                               | (Poll / Webhook)
                               v
+-------------------------------------------------------------+
|                         ArgoCD                              |
|  +-----------------------+       +-----------------------+  |
|  | Application Controller| <---> |     Redis Cache       |  |
|  +-----------+-----------+       +-----------------------+  |
|              |                                              |
|              v Compares                                     |
|  +-------------------------------------------------------+  |
|  |            Live State (Kubernetes API)                |
|  +-------------------------------------------------------+  |
+------------------------------+------------------------------+
                               | Apply
                               v
+-------------------------------------------------------------+
|                  Kubernetes Cluster                         |
|         (Pods, Services, Ingress, HPA, ConfigMaps)          |
+-------------------------------------------------------------+

3. Perbandingan Komparatif / Analisis Pendekatan

Dalam membangun sistem deployment berbasis GitOps, terdapat dua pendekatan utama dalam manajemen konfigurasi: Raw Kubernetes Manifests, Kustomize, dan Helm Charts. Berikut adalah analisis mendalam:

Fitur / Parameter Raw Manifests Kustomize Helm Charts
Kompleksitas Rendah Menengah Tinggi
Parameterisasi Sangat Buruk (Harus duplikasi file) Baik (Overlay berbasis patch) Sangat Kuat (Template engine Go-text)
Manajemen Versi Mengikuti Git commit Mengikuti Git commit Memiliki versi chart tersendiri (Chart.yaml)
Overhead CPU/RAM Minimal Minimal Menengah (Rendering dilakukan oleh ArgoCD/Helm)
Rekomendasi Skala Aplikasi skala kecil Aplikasi menengah / multi-env Aplikasi enterprise berskala besar & kompleks

[!TIP] Untuk arsitektur enterprise yang melayani backend (Go/Node/PHP) dengan banyak mikroservis dan database pendukung (MySQL, Redis), Helm Charts dikombinasikan dengan ArgoCD adalah standar industri terbaik karena fleksibilitas templating nilainya.


4. Prasyarat Sistem & Persiapan Lingkungan

Sebelum melakukan instalasi ArgoCD, pastikan Anda telah menyiapkan komponen infrastruktur berikut:

  • Klaster Kubernetes produksi (v1.24+) yang berjalan dengan baik.
  • CLI kubectl yang terkonfigurasi ke klaster tujuan.
  • CLI argocd terinstal pada mesin admin.
  • Domain khusus dan Ingress Controller (seperti Nginx Ingress Controller) atau ServiceMesh (Istio) untuk akses UI ArgoCD.

Verifikasi koneksi klaster dengan perintah berikut:

kubectl cluster-info
kubectl get nodes

5. Panduan Implementasi Langkah demi Langkah

Langkah 1: Instalasi ArgoCD di Kubernetes

Buat namespace khusus untuk ArgoCD dan terapkan manifest instalasi 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 sukses:

kubectl get pods -n argocd

Langkah 2: Mengakses UI ArgoCD

Secara default, service argocd-server tidak terekspos keluar. Untuk keperluan administratif awal, lakukan port-forward:

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

Akses https://localhost:8080 pada browser Anda. Ambil password awal admin dengan perintah:

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

Langkah 3: Membuat Struktur Repositori Git

Buat repositori Git dengan struktur direktori sebagai berikut:

production-infrastructure/
β”œβ”€β”€ apps/
β”‚   └── web-backend.yaml
└── charts/
    └── web-app/
        β”œβ”€β”€ Chart.yaml
        β”œβ”€β”€ values.yaml
        └── templates/
            β”œβ”€β”€ deployment.yaml
            β”œβ”€β”€ service.yaml
            └── ingress.yaml

Berikut adalah isi dari file Chart.yaml:

apiVersion: v2
name: web-app
description: A Helm chart for Kubernetes web applications
type: application
version: 1.0.0
appVersion: "1.0.0"

Berikut adalah isi dari values.yaml:

replicaCount: 3

image:
  repository: registry.internal.net/backend/go-service
  pullPolicy: IfNotPresent
  tag: "v1.0.0"

service:
  type: ClusterIP
  port: 80

ingress:
  enabled: true
  className: "nginx"
  hosts:
    - host: api.production.net
      paths:
        - path: /
          pathType: Prefix

resources:
  limits:
    cpu: 500m
    memory: 512Mi
  requests:
    cpu: 100m
    memory: 128Mi

autoscaling:
  enabled: true
  minReplicas: 3
  maxReplicas: 10
  targetCPUUtilizationPercentage: 80

Berikut adalah template deployment.yaml dengan konfigurasi Rolling Update dan Readiness/Liveness Probe untuk menjamin Zero-Downtime:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: {{ include "web-app.fullname" . }}
  labels:
    app.kubernetes.io/name: {{ include "web-app.name" . }}
    helm.sh/chart: {{ include "web-app.chart" . }}
    app.kubernetes.io/instance: {{ .Release.Name }}
    app.kubernetes.io/managed-by: {{ .Service }}
spec:
  replicas: {{ .Values.replicaCount }}
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 0
  selector:
    matchLabels:
      app.kubernetes.io/name: {{ include "web-app.name" . }}
      app.kubernetes.io/instance: {{ .Release.Name }}
  template:
    metadata:
      labels:
        app.kubernetes.io/name: {{ include "web-app.name" . }}
        app.kubernetes.io/instance: {{ .Release.Name }}
    spec:
      containers:
        - name: {{ .Chart.Name }}
          image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}"
          imagePullPolicy: {{ .Values.image.pullPolicy }}
          ports:
            - name: http
              containerPort: 8080
              protocol: TCP
          livenessProbe:
            httpGet:
              path: /healthz
              port: http
            initialDelaySeconds: 15
            periodSeconds: 10
          readinessProbe:
            httpGet:
              path: /ready
              port: http
            initialDelaySeconds: 5
            periodSeconds: 5
          resources:
            {{- toYaml .Values.resources | nindent 12 }}

Langkah 4: Mendaftarkan Aplikasi ke ArgoCD

Buat file manifest ArgoCD Application (apps/web-backend.yaml):

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: web-backend-production
  namespace: argocd
  finalizers:
    - resources-finalizer.argocd.argoproj.io
spec:
  project: default
  source:
    repoURL: 'https://github.com/company/production-infrastructure.git'
    targetRevision: HEAD
    path: charts/web-app
    helm:
      valueFiles:
        - values.yaml
  destination:
    server: 'https://kubernetes.default.svc'
    namespace: production
  syncPolicy:
    automated:
      prune: true
      selfHeal: true
    syncOptions:
      - CreateNamespace=true

Terapkan manifest Application tersebut ke klaster:

kubectl apply -f apps/web-backend.yaml

6. Bedah Kode & Penjelasan Detail Baris Kunci

  • maxSurge: 1 dan maxUnavailable: 0: Parameter kritis pada strategi RollingUpdate. maxUnavailable: 0 menjamin bahwa tidak ada satupun pod lama yang dimatikan sebelum pod baru benar-benar siap dan healthy. maxSurge: 1 mengizinkan pembuatan 1 pod ekstra di atas jumlah desired replicas selama proses rolling update berlangsung.
  • ReadinessProbe vs LivenessProbe: Liveness probe menentukan kapan sebuah kontainer harus direstart jika mengalami hang. Readiness probe menentukan kapan sebuah pod siap menerima traffic dari Kubernetes Service. Jika readiness probe gagal, pod secara otomatis dicabut dari daftar endpoint load balancer tanpa menghentikan proses aplikasinya.
  • automated.prune: true dan selfHeal: true: Konfigurasi sinkronisasi otomatis di ArgoCD. prune memastikan sumber daya yang dihapus dari Git juga akan dihapus dari klaster Kubernetes. selfHeal memperbaiki secara otomatis jika terjadi perubahan manual di klaster yang tidak sesuai dengan Git.

7. Skenario Produksi & Studi Kasus Dunia Nyata

Bayangkan sebuah perusahaan e-commerce dengan sistem backend berbasis Golang dan database MySQL yang melayani 50.000 request per second (RPS) saat icip-icip flash sale. Ketika terjadi rilis fitur baru, penerapan Zero-Downtime menggunakan strategi di atas memastikan:

  1. Pod baru di-spawn, melakukan koneksi pool ke MySQL secara bertahap.
  2. Kubernetes Service menahan traffic masuk hingga Readiness Probe mengembalikan status HTTP 200 OK pada endpoint /ready.
  3. Pod lama melayani request yang sedang berjalan (graceful shutdown selama 30 detik) sebelum akhirnya dihentikan.
  4. Latency latensi pengguna akhir tetap stabil di bawah 20ms tanpa ada error 502 Bad Gateway atau 504 Gateway Timeout.

8. Common Pitfalls, Anti-Patterns & Solusi

[!WARNING] Anti-Pattern Terburuk: Menggunakan tag image latest pada environment produksi. Hal ini membuat mekanisme Rolling Update ArgoCD gagal mengenali adanya perubahan versi karena nama tag tidak berubah, sehingga Kubernetes tidak melakukan pull image baru.

  • Kesalahan 1: Lupa mengatur lifecycle.preStop pada aplikasi backend Node.js atau PHP-FPM, mengakibatkan koneksi aktif terputus tiba-tiba saat pod dimatikan.
    • Solusi: Tambahkan skrip preStop hook untuk mengirim sinyal SIGTERM dan menunggu proses antrian transaksi selesai.
  • Kesalahan 2: Menggunakan syncPolicy.automated tanpa batasan proteksi pada klaster produksi berskala masif.
    • Solusi: Terapkan pembatasan Sync Windows di ArgoCD agar rilis otomatis hanya diizinkan pada jam-jam tertentu (maintenance window) atau wajib melalui persetujuan manual (manual approval).

9. Benchmark, Metrik Kinerja & Tuning Performa

Untuk menguji efektivitas Zero-Downtime Deployment yang telah dibangun, lakukan pengujian beban (load testing) menggunakan tool k6 secara bersamaan dengan proses git push versi baru aplikasi:

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

export const options = {
  stages: [
    { duration: '2m', target: 500 },
    { duration: '5m', target: 500 },
    { duration: '2m', target: 0 },
  ],
};

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

Parameter Tuning Lanjutan:

  • Tingkatkan net.core.somaxconn pada kernel Linux node Kubernetes untuk menangani lonjakan koneksi TCP saat pod baru melakukan warm-up.
  • Konfigurasikan Redis internal ArgoCD dengan alokasi memori yang memadai jika mengelola ratusan aplikasi (ArgoCD Application Sets) agar waktu reconciliation loop tetap berada di bawah 5 detik.

10. Checklist Penerapan Produksi & Kesimpulan

Gunakan checklist berikut sebelum merilis arsitektur GitOps ArgoCD ke lingkungan produksi klaster Anda:

  • Seluruh manifes Kubernetes telah diverifikasi menggunakan helm template atau kubeconform.
  • Strategi maxUnavailable: 0 dan maxSurge: 1 telah diaktifkan pada semua Deployment.
  • Endpoint liveness dan readiness probe terkonfigurasi dengan benar pada setiap layanan.
  • ArgoCD diamankan dengan autentikasi berbasis SSO/OIDC dan manajemen RBAC yang ketat.
  • Fitur automated pruning dan self-healing disesuaikan dengan kebijakan operasional tim.

Dengan mengintegrasikan ArgoCD dan Kubernetes menggunakan praktik terbaik di atas, organisasi Anda tidak hanya mencapai kecepatan delivery yang tinggi melalui GitOps, tetapi juga menjamin stabilitas infrastruktur yang kokoh, transparan, dan bebas gangguan downtime.

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