Performance Tuning ปรับแต่ง Argo CD สำหรับ Cluster ขนาดใหญ่

ปรับแต่ง Argo CD สำหรับ Cluster ขนาดใหญ่ – Performance Tuning Guide

Argo CD เป็น GitOps tool ยอดนิยมสำหรับการจัดการ Kubernetes cluster ขนาดใหญ่ อย่างไรก็ตาม เมื่อจำนวน application และ cluster เพิ่มขึ้น ประสิทธิภาพอาจลดลง บทความนี้จะสอนวิธีปรับแต่ง Argo CD ให้ทำงานได้อย่างเหมาะสมในสภาพแวดล้อม cluster ขนาดใหญ่

ทำไมต้องปรับแต่ง Argo CD?

Argo CD ที่ใช้ default configuration อาจประสบปัญหา เช่น:

  • Sync time ช้า สำหรับ application หลายรายการ
  • CPU และ memory usage สูง ในเซิร์ฟเวอร์ controller
  • Git repository polling ทำให้ประสิทธิภาพลดลง
  • Reconciliation conflicts เมื่อมี application จำนวนมาก

การปรับแต่งที่ถูกต้องจะช่วยให้ Argo CD ทำงานได้อย่างมีประสิทธิภาพ โดยเฉพาะเมื่อใช้กับ Cloud VPS จาก ผู้ให้บริการโฮสติ้ง ที่มีทรัพยากรจำกัด

1. Controller Sharding – แบ่งการประมวลผล

Controller sharding ช่วยให้สามารถแบ่งภาระงาน application ไปยัง controller หลายตัว:

apiVersion: v1
kind: ConfigMap
metadata:
  name: argocd-cmd-params-cm
  namespace: argocd
data:
  application.instanceLabelKey: argocd.argoproj.io/instance
  server.insecure: "true"
  controller.sharding.enabled: "true"
  controller.sharding.replicas: "3"

การตั้งค่านี้จะแบ่ง application ออกเป็น 3 replica โดยอัตโนมัติ ลดภาระบน controller เดียว

2. เพิ่มทรัพยากร Repo Server

Repo server มีบทบาทสำคัญในการทำ Git clone และ rendering manifests:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: argocd-repo-server
  namespace: argocd
spec:
  replicas: 3
  template:
    spec:
      containers:
      - name: argocd-repo-server
        resources:
          requests:
            memory: "512Mi"
            cpu: "500m"
          limits:
            memory: "1Gi"
            cpu: "1000m"

การเพิ่มจำนวน replica และทรัพยากรของ repo server จะช่วยให้การ render manifests เร็วขึ้น

3. Redis Caching – เร่งการ Sync

Redis ช่วยเก็บข้อมูล Git manifest ไว้เพื่อลดการ clone ซ้ำ:

apiVersion: v1
kind: ConfigMap
metadata:
  name: argocd-cmd-params-cm
  namespace: argocd
data:
  reposerver.disable.tls: "false"
  redis.server: "argocd-redis:6379"

ให้มั่นใจว่า Redis pod มีทรัพยากรพอเพียง โดยเฉพาะเมื่อโฮสต์บน Cloud Hosting ของ ผู้ให้บริการโฮสติ้ง

4. Reconciliation Timeout Settings

ปรับเปลี่ยนเวลา timeout เพื่อให้ sync ไม่ทำงานจนหมด:

apiVersion: v1
kind: ConfigMap
metadata:
  name: argocd-cmd-params-cm
  namespace: argocd
data:
  application.instanceLabelKey: argocd.argoproj.io/instance
  controller.operation.processors: "10"
  controller.status.processors: "20"
  controller.repo.server.timeout.seconds: "180"
  server.repo.server.timeout.seconds: "180"

การเพิ่ม processors จะช่วยให้การ sync ของ application หลายตัวเกิดขึ้นพร้อมกัน

5. Git Webhook Optimization

ใช้ Git webhook แทน polling เพื่อเพิ่มประสิทธิภาพ:

apiVersion: v1
kind: ConfigMap
metadata:
  name: argocd-cmd-params-cm
  namespace: argocd
data:
  application.instanceLabelKey: argocd.argoproj.io/instance
  webhook.github.secret: "your-webhook-secret"
  webhook.gitlab.secret: "your-webhook-secret"

Webhook ช่วยลดการ poll repository ซ้ำๆ ซึ่งประหยัด bandwidth และ network I/O

6. Application Controller Tuning

ปรับแต่ง application controller สำหรับการจัดการ application จำนวนมาก:

apiVersion: v1
kind: ConfigMap
metadata:
  name: argocd-cmd-params-cm
  namespace: argocd
data:
  controller.splitter.collation.timeout: "5"
  controller.diff.server.side: "true"
  controller.default.compare.result: "ComparisonResult"

Server-side diff ช่วยลด resource usage บน client side และเพิ่มความเร็ว

7. Horizontal Pod Autoscaling

ใช้ HPA สำหรับ Argo CD components เพื่อให้ปรับตัวตามความต้องการ:

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: argocd-controller-hpa
  namespace: argocd
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: argocd-application-controller
  minReplicas: 2
  maxReplicas: 5
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 70

8. Monitoring และ Optimization

ตรวจสอบ metrics ของ Argo CD ประจำวัน:

  • argocd_app_sync_duration_seconds: เวลา sync ของ application
  • argocd_server_requests_total: จำนวน request ทั้งหมด
  • resource_requests_memory_bytes: การใช้ memory
  • process_resident_memory_bytes: Memory ที่ใช้จริง

ใช้ Prometheus และ Grafana ติดตาม metrics เหล่านี้อย่างต่อเนื่อง

คำแนะนำเพิ่มเติม

  • ตรวจสอบ argocd-server และ argocd-application-controller log เพื่อหาปัญหา
  • ใช้ cluster ขนาดใหญ่และทรัพยากรเพียงพอ สำหรับการใช้ production
  • ปรับแต่งค่า batch size ของ sync operation ตามขีดความสามารถของ network
  • ใช้ Cloud VPS จาก ผู้ให้บริการโฮสติ้ง ที่มี resource เพียงพอ

สรุป

การปรับแต่ง Argo CD สำหรับ cluster ขนาดใหญ่ต้องมีการวางแผนและการทดสอบที่เหมาะสม ด้วยการใช้ controller sharding, เพิ่มจำนวน repo server, ใช้ Redis caching, และปรับแต่ง reconciliation settings คุณสามารถเพิ่มประสิทธิภาพได้อย่างมีนัยสำคัญ หากต้องการ infrastructure ที่เหมาะสม ลองใช้ Cloud Hosting ของ ผู้ให้บริการโฮสติ้ง ที่มีทรัพยากรเพียงพอสำหรับ Argo CD ขนาดใหญ่