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

Zero-Downtime GitOps Pipeline Menggunakan ArgoCD, Helm, dan Kubernetes

⏱️ 18 menit baca β€’ πŸ“… 15 Oct 2026 β€’ πŸ‘οΈ 1 views
Zero-Downtime GitOps Pipeline Menggunakan ArgoCD, Helm, dan Kubernetes

1. Konteks Industri & Analisis Akar Masalah

Di era modern, infrastruktur web enterprise menuntut ketersediaan tinggi (high availability), skalabilitas instan, dan proses rilis fitur yang berkesinambungan. Arsitektur web modern yang melibatkan backend microservices (Go, Node.js, PHP-FPM), web server (Nginx, Caddy), penyimpanan objek (MinIO/S3), antrean pesan (Redis), serta database relasional, menciptakan kompleksitas operasional yang masif. Pendekatan tradisional menggunakan Push CI Pipeline (seperti Jenkins, GitLab CI, atau GitHub Actions yang langsung mengeksekusi perintah kubectl apply atau Helm upgrade ke klaster produksi) menyimpan kelemahan fatal dari sisi keamanan dan manajemen state.

Dalam model Push CI Pipeline, server CI/CD memerlukan akses administratif penuh (kubeconfig) ke klaster Kubernetes produksi. Jika credential tersebut bocor atau terjadi kesalahan skrip pada pipeline, klaster produksi dapat mengalami kegagalan total (cluster corruption). Selain itu, sering terjadi drift stateβ€”kondisi di mana konfigurasi aktual di dalam klaster berbeda dengan apa yang tercantum di repositori kode akibat perubahan manual yang tidak terdokumentasi (hotfix langsung di server).

Sebaliknya, pendekatan GitOps menggunakan model Pull. Klaster Kubernetes secara proaktif menarik perubahan dari repositori Git terpusat melalui controller internal seperti ArgoCD. Repositori Git menjadi satu-satunya sumber kebenaran (Single Source of Truth). Perubahan infrastruktur dan aplikasi diperlakukan persis seperti kode aplikasi: melalui Pull Request, Code Review, dan Automated Testing.

Sebelum vs Sesudah Penerapan GitOps

Parameter Sebelum (Push CI Pipeline) Sesudah (GitOps ArgoCD + Helm)
Kredensial Akses Server CI/CD menyimpan akses kubeconfig production. Klaster memvalidasi diri sendiri, tidak ada akses luar masuk.
Manajemen State Rawan drift; perubahan manual sering tertimpa atau merusak sinkronisasi. Self-healing; ArgoCD otomatis memaksa klaster kembali ke desired state di Git.
Audit Trail Tersebar di log tool CI/CD (Jenkins/GitLab). Terpusat di Git commit history dan ArgoCD UI secara real-time.
Rollback Manual menjalankan ulang job CI/CD atau revert skrip kompleks. Cukup revert commit di Git atau klik tombol rollback di ArgoCD UI.

2. Konsep Inti & Deep Dive Arsitektur

ArgoCD bekerja berdasarkan pola arsitektur Kubernetes Custom Controller. Ia memonitor repositori Git yang berisi manifes Kubernetes atau Helm Chart secara kontinu, kemudian membandingkan Desired State (apa yang tertulis di Git) dengan Live State (apa yang berjalan di klaster Kubernetes).

Alur Eksekusi (Data Flow Architecture)

+-----------------------+       Git Push       +------------------------+
| Developer / Engineer  | -------------------> | Git Repository (GitHub)|
+-----------------------+                      +------------------------+
                                                           |
                                                           | Poll / Webhook
                                                           v
+-----------------------+      Sync State      +------------------------+
| Kubernetes Production | <------------------- | ArgoCD App Controller  |
| (Pods, Services, Ingr)|     (Apply/Helm)     +------------------------+
+-----------------------+
  1. Commit & Push: Developer melakukan perubahan pada Helm Chart atau parameter environment di repositori Git.
  2. Notification / Polling: ArgoCD menerima notifikasi via Webhook dari Git atau melakukan polling berkala (default setiap 3 menit).
  3. Render & Compare: ArgoCD merender Helm chart menggunakan nilai (values) yang spesifik untuk environment tersebut (misal: values-production.yaml), lalu membandingkannya dengan objek Kubernetes yang sedang berjalan di klaster.
  4. Synchronization: Jika ditemukan perbedaan (Out of Sync), ArgoCD akan melakukan sinkronisasi secara otomatis (Automated Sync) atau menunggu persetujuan manual, tergantung pada konfigurasi kebijakan sinkronisasi (Sync Policy).

3. Perbandingan Komparatif / Analisis Pendekatan

Dalam membangun pipeline GitOps untuk aplikasi web enterprise, terdapat beberapa opsi pendekatan manajemen manifes. Berikut adalah perbandingan komparatif mendalam antara Manifes Kustom Murni, Kustomize, dan Helm Chart.

Fitur / Metrik Manifes Kustom Murni Kustomize Helm Chart Rekomendasi Penggunaan
Modularitas Rendah (banyak boilerplate) Sedang (berbasis overlay) Sangat Tinggi (berbasis template) Helm Chart untuk aplikasi enterprise kompleks.
Parameterisasi Sulit (harus manual replace) Baik (menggunakan patches) Sangat Baik (menggunakan values.yaml) Helm Chart untuk multi-environment (Dev/Staging/Prod).
Kurva Belajar Rendah Sedang Tinggi Helm Chart untuk tim dengan skalabilitas tinggi.
Konsumsi Sumber Daya Sangat Rendah Rendah Sedang (render engine Helm) Diabaikan karena keuntungan skalabilitas jauh lebih besar.

[!WARNING] Jangan pernah menyimpan raw secret (password database, API key, private key SSH) secara plaintext di dalam Helm Chart atau repositori Git, meskipun repositori tersebut bersifat privat. Gunakan enkripsi berbasis Sealed Secrets atau External Secrets Operator.


4. Prasyarat Sistem & Persiapan Lingkungan

Sebelum mengimplementasikan Zero-Downtime GitOps Pipeline, pastikan infrastruktur dasar berikut telah terpasang dan terverifikasi:

  1. Klaster Kubernetes: Versi minimal 1.26+ (mendukung Ingress API networking.k8s.io/v1).
  2. Command Line Tools:
    • kubectl (sesuai dengan versi klaster)
    • helm (versi v3.12+)
    • argocd CLI
    • kubeseal (untuk manajemen Sealed Secrets)
  3. Infrastruktur Pendukung di Klaster:
    • Ingress Controller (Nginx Ingress atau Traefik)
    • Certificate Manager (cert-manager untuk SSL/TLS Let's Encrypt otomatis)
    • Storage Class (untuk database persisten seperti MySQL/MariaDB)

Verifikasi kesiapan klaster dengan menjalankan perintah berikut:

kubectl cluster-info
helm version
kubectl get nodes

5. Panduan Implementasi Langkah demi Langkah

Langkah 1: Instalasi ArgoCD di Klaster Kubernetes

Buat namespace khusus untuk ArgoCD, lalu instal manifes stabil 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

Dapatkan password awal untuk user admin:

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

Ubah akses ArgoCD Server agar dapat diakses melalui port-forwarding (untuk keperluan setup awal):

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

Akses https://localhost:8080 melalui browser, login menggunakan username admin dan password yang didapatkan sebelumnya.

Langkah 2: Membangun Struktur Helm Chart Modular

Buat struktur direktori repositori Git untuk aplikasi web enterprise (misal: backend Go + frontend Nginx).

helm-charts/
β”œβ”€β”€ app-web/
β”‚   β”œβ”€β”€ Chart.yaml
β”‚   β”œβ”€β”€ values.yaml
β”‚   β”œβ”€β”€ values-staging.yaml
β”‚   β”œβ”€β”€ values-production.yaml
β”‚   └── templates/
β”‚       β”œβ”€β”€ _helpers.tpl
β”‚       β”œβ”€β”€ deployment.yaml
β”‚       β”œβ”€β”€ service.yaml
β”‚       β”œβ”€β”€ ingress.yaml
β”‚       └── hpa.yaml

Berikut adalah isi file Chart.yaml yang valid:

apiVersion: v2
name: app-web
description: Helm Chart modular untuk aplikasi web enterprise
type: application
version: 1.0.0
appVersion: "1.4.2"

Berikut adalah file values.yaml untuk konfigurasi dasar (default values):

replicaCount: 2

image:
  repository: registry.company.internal/backend/app-web
  pullPolicy: IfNotPresent
  tag: "1.4.2"

imagePullSecrets: []
nameOverride: ""
fullnameOverride: ""

service:
  type: ClusterIP
  port: 80

ingress:
  enabled: true
  className: "nginx"
  annotations:
    cert-manager.io/cluster-issuer: "letsencrypt-prod"
    nginx.ingress.kubernetes.io/ssl-redirect: "true"
  hosts:
    - host: app.company.com
      paths:
        - path: /
          pathType: Prefix

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

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

Berikut adalah manifes templates/deployment.yaml yang mendukung rolling update tanpa downtime:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: {{ include "app-web.fullname" . }}
  labels:
    {{- include "app-web.labels" . | nindent 4 }}
spec:
  replicas: {{ .Values.replicaCount }}
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 0
  selector:
    matchLabels:
      {{- include "app-web.selectorLabels" . | nindent 6 }}
  template:
    metadata:
      labels:
        {{- include "app-web.selectorLabels" . | nindent 8 }}
    spec:
      {{- with .Values.imagePullSecrets }}
      imagePullSecrets:
        {{- toYaml . | nindent 8 }}
      {{- end }}
      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
          readinessProbe:
            httpGet:
              path: /healthz
              port: http
            initialDelaySeconds: 5
            periodSeconds: 10
          livenessProbe:
            httpGet:
              path: /healthz
              port: http
            initialDelaySeconds: 15
            periodSeconds: 20
          resources:
            {{- toYaml .Values.resources | nindent 12 }}

Langkah 3: Konfigurasi ArgoCD Application (Declarative Approach)

Alih-alih membuat aplikasi lewat UI, gunakan manifes ArgoCD Application agar seluruh definisi deployment tercatat di Git (App of Apps pattern).

Buat file argocd/app-production.yaml:

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

Terapkan manifes aplikasi tersebut ke klaster:

kubectl apply -f argocd/app-production.yaml

6. Bedah Kode & Penjelasan Detail Baris Kunci

  1. strategy.rollingUpdate.maxSurge: 1 dan maxUnavailable: 0: Konfigurasi ini memastikan zero-downtime mutlak. Ketika rilis versi baru dilakukan, Kubernetes akan membuat 1 pod baru (maxSurge) sebelum mematikan pod lama, dan melarang pod mati lebih dari 0 (maxUnavailable). Traffic web tidak akan terputus karena pod lama tetap melayani request sampai pod baru benar-benar lolos readinessProbe.
  2. readinessProbe dan livenessProbe: readinessProbe memberitahu Nginx Ingress kapan sebuah pod siap menerima traffic (misalnya koneksi ke database MySQL sudah terbentuk). livenessProbe mendeteksi apakah aplikasi mengalami deadlock dan perlu direstart otomatis oleh Kubelet.
  3. syncPolicy.automated.selfHeal: true: Fitur pamungkas ArgoCD. Jika seorang sysadmin mengubah konfigurasi pod secara manual via kubectl edit di production, ArgoCD akan mendeteksi perbedaan tersebut (Drift) dan langsung menimpanya kembali sesuai dengan kondisi di repositori Git.

7. Skenario Produksi & Studi Kasus Dunia Nyata

Pada sistem skala enterprise dengan jutaan request per hari, kegagalan saat migrasi database bersamaan dengan deployment kode backend sering menyebabkan broken connections.

Solusi dengan ArgoCD + Helm Hooks: Manfaatkan Helm Hooks seperti pre-install dan pre-upgrade untuk menjalankan migrasi skema database (misal: migrasi tabel MySQL) sebelum pod aplikasi utama diperbarui.

Contoh file templates/migration-job.yaml:

apiVersion: batch/v1
kind: Job
metadata:
  name: {{ include "app-web.fullname" . }}-db-migration
  annotations:
    "helm.sh/hook": pre-upgrade,pre-install
    "helm.sh/hook-delete-policy": hook-succeeded
spec:
  template:
    spec:
      containers:
        - name: migrator
          image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
          command: ["./app", "migrate"]
          env:
            - name: DB_HOST
              value: "mysql.production.svc.cluster.local"
      restartPolicy: Never

[!TIP] Gunakan hook-delete-policy: hook-succeeded agar pod Job migrasi yang sukses otomatis dibersihkan dari klaster untuk menghemat alokasi memori etcd.


8. Common Pitfalls, Anti-Patterns & Solusi

  • Anti-Pattern 1: Menggunakan Tag Image latest di Produksi
    • Dampak: ArgoCD tidak dapat melacak perubahan versi secara akurat, dan rollback menjadi tidak mungkin dilakukan.
    • Solusi: Selalu gunakan Semantic Versioning tag (misalnya v1.4.2) atau Commit SHA sebagai image tag di values.yaml.
  • Anti-Pattern 2: Terlalu Sering Melakukan Polling Git
    • Dampak: Membebani API server Git repository dan ArgoCD repo-server.
    • Solusi: Konfigurasikan Webhook langsung dari GitHub/GitLab ke ArgoCD Server agar sinkronisasi berjalan secara event-driven seketika saat git push terjadi.

9. Benchmark, Metrik Kinerja & Tuning Performa

Untuk menguji ketahanan pipeline dan performa aplikasi web di bawah beban tinggi selama proses deployment, gunakan tool benchmark seperti k6 atau wrk.

Contoh skrip pengujian k6 untuk memvalidasi zero-downtime:

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

export const options = {
  vus: 50,
  duration: '5m',
};

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

Tuning ArgoCD Repo Server

Jika klaster mengelola ratusan aplikasi Helm, argocd-repo-server sering mengalami lonjakan memori (OOMKilled). Lakukan tuning pada parameter deployment ArgoCD:

resources:
  limits:
    cpu: "2"
    memory: 2Gi
  requests:
    cpu: 500m
    memory: 512Mi

Serta tingkatkan jumlah replicas untuk argocd-repo-server melalui Helm chart instalasi ArgoCD.


10. Checklist Penerapan Produksi & Kesimpulan

Sebelum meluncurkan arsitektur GitOps ini ke lingkungan production, pastikan seluruh poin dalam checklist berikut telah terpenuhi:

  • Repositori Git terpisah antara kode aplikasi, konfigurasi Helm chart, dan manifes infrastruktur.
  • Seluruh secret telah dienkripsi menggunakan Sealed Secrets atau External Secrets.
  • Kebijakan selfHeal dan prune diaktifkan pada konfigurasi ArgoCD Application.
  • Readiness dan Liveness Probe terpasang dengan benar pada setiap pod aplikasi web.
  • Webhook Git terhubung ke ArgoCD untuk memangkas latensi sinkronisasi.
  • Monitoring Prometheus & Grafana aktif memantau kesehatan ArgoCD Controller dan klaster.

Dengan mengintegrasikan ArgoCD, Helm, dan Kubernetes secara benar, siklus rilis perangkat lunak perusahaan Anda akan mencapai tingkat keandalan tertinggi, memangkas risiko human error, serta menjamin ketersediaan layanan web tanpa henti bagi jutaan pengguna.

🏷️ Tags: #Devops #Kubernetes #Gitops #Argocd #Helm