ตั้งค่า Argo CD แบบ High Availability (HA) สำหรับ Production บน Cloud VPS

ในยุคของ DevOps และ Kubernetes ปัจจุบัน การจัดการการ Deploy แอปพลิเคชันด้วยเครื่องมืออัตโนมัติเป็นความจำเป็น Argo CD เป็นเครื่องมือ GitOps ที่ได้รับความนิยมมากสำหรับการ Deploy แอปพลิเคชันบน Kubernetes อย่างไรก็ตาม เมื่อต้องเรียกใช้ Argo CD ในสภาพแวดล้อม Production ที่มีความต้องการ High Availability (HA) เราจำเป็นต้องตั้งค่าให้มีการ Redundancy และ Failover อัตโนมัติ บทความนี้จะอธิบายขั้นตอนละเอียดในการตั้งค่า Argo CD ให้มีสถาปัตยกรรมแบบ High Availability บน Cloud VPS ของ ผู้ให้บริการโฮสติ้ง

เหตุใดจึงจำเป็นต้อง High Availability สำหรับ Argo CD ใน Production

Argo CD เป็นองค์ประกอบสำคัญในไปป์ไลน์การ Deploy ของบริษัท เมื่อ Argo CD ไม่พร้อมให้บริการ ระบบการ Deployment อัตโนมัติจะหยุดชะงัก ส่งผลให้ไม่สามารถ Deploy แอปพลิเคชันใหม่ หรืออัปเดตเวอร์ชันได้ นี่เป็นความเสี่ยงที่สูงสำหรับธุรกิจใดๆ ที่พึ่งพา Continuous Deployment

การตั้งค่า Argo CD แบบ High Availability จะช่วย:

  • ลดเวลาหยุดชะงัก (Downtime) ของระบบ Deploy
  • รับประกันความพร้อมใช้งานสูง (High Availability) ด้วยการ Redundancy ของ Component
  • เพิ่มประสิทธิภาพในการจัดการ Repository และการประมวลผล Sync
  • ปรับขนาด (Scale) Argo CD เพื่อรองรับจำนวน Repository และ Application ที่เพิ่มขึ้น
  • ลดความเสี่ยงในการสูญหายข้อมูล ด้วยการใช้ External Database

สถาปัตยกรรม Argo CD High Availability

Argo CD HA ประกอบด้วย Component หลักดังนี้:

  • API Server – บริการ REST API ที่จัดการคำขอจาก Client (พร้อมให้บริการผ่าน Multiple Replicas)
  • Application Controller – ตรวจสอบสถานะของ Application และทำการ Sync (Multiple Replicas)
  • Repo Server – ดึงข้อมูล Configuration จาก Git Repository (Multiple Replicas)
  • Server (UI) – อินเทอร์เฟซผู้ใช้สำหรับการจัดการ Argo CD (Multiple Replicas)
  • Redis – ระบบ Caching และ Session Management (HA Mode)
  • PostgreSQL – ฐานข้อมูลสำหรับเก็บ State และ Configuration

ข้อกำหนดเบื้องต้น (Prerequisites)

Kubernetes Cluster แบบ Multi-Node

ในการตั้งค่า Argo CD HA คุณจำเป็นต้องมี Kubernetes Cluster ที่มีอย่างน้อย 3 Nodes ขึ้นไป (สำหรับ High Availability) บริการ Cloud VPS ของ ผู้ให้บริการโฮสติ้ง (https://de.co.th/cloud-vps) มีแพ็กเกจ Kubernetes ที่พร้อมสำหรับการตั้งค่าแบบนี้ โดยรองรับการจัดการ Multi-Node Cluster ได้อย่างสมบูรณ์

ตรวจสอบ Kubernetes Cluster ด้วยคำสั่ง:

kubectl get nodes
kubectl cluster-info
kubectl api-versions

Helm (เวอร์ชัน 3.x ขึ้นไป)

Helm เป็นเครื่องมือจัดการ Kubernetes Package ที่ทำให้การติดตั้ง Argo CD ง่ายขึ้น ติดตั้ง Helm ด้วยคำสั่ง:

curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
helm version

External Database (PostgreSQL)

เพื่อให้ Argo CD HA มีประสิทธิภาพสูงสุด ควรใช้ PostgreSQL ภายนอก (External Database) แทนการใช้ SQLite ที่เป็น Default

การติดตั้ง Argo CD HA

ขั้นตอนที่ 1: สร้าง Namespace

kubectl create namespace argocd

ขั้นตอนที่ 2: เพิ่ม Argo CD Helm Repository

helm repo add argo https://argoproj.github.io/argo-helm
helm repo update

ขั้นตอนที่ 3: สร้าง Values File สำหรับ HA Configuration

สร้างไฟล์ argocd-ha-values.yaml เพื่อกำหนดค่าสำหรับ High Availability:

global:
  domain: argocd.example.com

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

repoServer:
  replicas: 3
  resources:
    requests:
      cpu: 100m
      memory: 256Mi
    limits:
      cpu: 1000m
      memory: 1024Mi

applicationController:
  replicas: 3
  resources:
    requests:
      cpu: 250m
      memory: 512Mi
    limits:
      cpu: 1000m
      memory: 2Gi

redis:
  enabled: true
  replicas: 3

postgresql:
  enabled: true
  auth:
    username: argocd
    password: your-secure-password
    database: argocd

configs:
  secret:
    argocdServerAdminPassword: your-bcrypt-hashed-password

ขั้นตอนที่ 4: ติดตั้ง Argo CD ด้วย Helm

helm install argocd argo/argo-cd \
  --namespace argocd \
  --values argocd-ha-values.yaml \
  --version 6.0.0

ตรวจสอบการติดตั้งด้วยคำสั่ง:

kubectl get pods -n argocd
kubectl get services -n argocd

การตั้งค่า Redis High Availability

Redis เป็นส่วนสำคัญของ Argo CD HA สำหรับ Session และ Caching Management

ตรวจสอบ Redis Status

kubectl get pods -n argocd -l app.kubernetes.io/name=redis

กำหนดค่า Redis Sentinel (เพิ่มเติม)

สำหรับการ Failover อัตโนมัติของ Redis ให้ใช้ Redis Sentinel โดยแก้ไข Values ดังนี้:

redis:
  sentinel:
    enabled: true
    quorum: 2
    replicas: 3

การปรับขนาด Application Controller

Application Controller เป็นส่วนประมวลผลหลักของ Argo CD เมื่อต้องการให้การ Sync เร็วขึ้น ให้เพิ่มจำนวน Replicas:

kubectl scale deployment argocd-application-controller \
  --replicas=3 -n argocd

ตรวจสอบการปรับขนาด:

kubectl get deployment argocd-application-controller -n argocd -o wide

การตั้งค่า Repo Server Replicas

Repo Server จัดการการดึงข้อมูลจาก Git Repository การเพิ่ม Replicas จะช่วยให้สามารถจัดการ Repository จำนวนมากได้:

kubectl scale deployment argocd-repo-server \
  --replicas=3 -n argocd

การตั้งค่า Server (UI) Replicas

Server ให้บริการ Web UI และ gRPC API กำหนดค่าให้มี Multiple Replicas:

kubectl scale deployment argocd-server \
  --replicas=3 -n argocd

การใช้ External PostgreSQL Database

เหตุใดต้อง External Database

Default Argo CD ใช้ SQLite ซึ่งเหมาะสำหรับการใช้งานขนาดเล็ก สำหรับ Production HA ควรใช้ PostgreSQL ที่จัดการแยกต่างหาก

กำหนดค่า PostgreSQL

configs:
  secret:
    # PostgreSQL Connection String
    argocd-secret: |
      server.db.host: postgres.example.com
      server.db.port: 5432
      server.db.database: argocd
      server.db.username: argocd
      server.db.password: your-secure-password

สร้าง Database และ User

CREATE DATABASE argocd;
CREATE USER argocd WITH PASSWORD 'your-secure-password';
GRANT ALL PRIVILEGES ON DATABASE argocd TO argocd;
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL ON TABLES TO argocd;

การตั้งค่า Load Balancer สำหรับ Argo CD Server

ใน Production ให้ใช้ Load Balancer เพื่อกระจายการร้องขอไปยัง API Server Replicas

สร้าง Service แบบ LoadBalancer

apiVersion: v1
kind: Service
metadata:
  name: argocd-server-lb
  namespace: argocd
spec:
  type: LoadBalancer
  selector:
    app.kubernetes.io/name: argocd-server
  ports:
  - port: 443
    targetPort: 8080
    protocol: TCP
  sessionAffinity: ClientIP

การเพิ่ม Dex สำหรับ OIDC Authentication

ในสภาพแวดล้อม Production ควรตั้งค่า OIDC Authentication แทนการใช้ Username/Password อย่างเดียว

dex:
  enabled: true
  config:
    connectors:
    - type: oidc
      id: my-corp-oidc
      name: My Corporation
      config:
        clientID: your-client-id
        clientSecret: your-client-secret
        redirectURI: https://argocd.example.com/api/dex/callback
        issuer: https://your-oidc-provider.com

การ Monitoring และ Observability

เปิดใช้งาน Prometheus Metrics

kubectl port-forward svc/argocd-metrics -n argocd 8082:8082

ตรวจสอบ Health Status

kubectl exec -it deployment/argocd-server -n argocd -- \
  argocd admin dashboard

ตั้งค่า Monitoring Dashboard

สามารถสร้าง Grafana Dashboard เพื่อ Monitor Argo CD Metrics ได้ โดยเชื่อมต่อกับ Prometheus

Best Practices สำหรับ Argo CD HA

1. ใช้ Resources Requests และ Limits อย่างเหมาะสม

กำหนด CPU และ Memory Requests/Limits ให้เหมาะสมเพื่อลดความเสี่ยงของ Node Eviction

2. ใช้ Pod Disruption Budget (PDB)

apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
  name: argocd-server-pdb
  namespace: argocd
spec:
  minAvailable: 2
  selector:
    matchLabels:
      app.kubernetes.io/name: argocd-server

3. ตั้งค่า Health Check และ Probes

ตรวจสอบให้มี Liveness Probe และ Readiness Probe เพื่อ Kubernetes สามารถตรวจสอบสถานะได้

4. ใช้ Network Policy

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: argocd-network-policy
  namespace: argocd
spec:
  podSelector:
    matchLabels:
      app.kubernetes.io/part-of: argocd
  policyTypes:
  - Ingress
  - Egress

5. Backup และ Disaster Recovery

ตั้งค่า Backup สำหรับ PostgreSQL Database และ Git Repository Keys

kubectl exec -it pod/postgres -n argocd -- \
  pg_dump -U argocd argocd > argocd-backup.sql

6. อัปเดตและ Upgrade Strategy

เมื่อต้อง Upgrade Argo CD ให้ใช้ Rolling Update Strategy:

kubectl set image deployment/argocd-server \
  argocd-server=argoproj/argocd:v2.8.0 \
  -n argocd

การ Troubleshooting Argo CD HA

ตรวจสอบ Pod Status

kubectl get pods -n argocd -o wide
kubectl describe pod <pod-name> -n argocd

ดูลอก (Logs)

kubectl logs -f deployment/argocd-server -n argocd
kubectl logs -f deployment/argocd-application-controller -n argocd

ตรวจสอบ Resource Usage

kubectl top nodes
kubectl top pods -n argocd

ตรวจสอบ Database Connectivity

kubectl exec -it pod/postgres -n argocd -- psql -U argocd -d argocd -c "SELECT version();"

สรุป

การตั้งค่า Argo CD แบบ High Availability สำหรับ Production เป็นขั้นตอนสำคัญสำหรับองค์กรที่พึ่งพา Continuous Deployment โดยการทำให้ Argo CD HA จะรับประกัน:

  • ความพร้อมใช้งานสูง (High Availability) ด้วย Multiple Replicas
  • ประสิทธิภาพที่ดีด้วย Load Balancer และ Scaling
  • ความปลอดภัยของข้อมูล ด้วย External Database และ Backup
  • ความสะดวกในการ Monitoring และ Troubleshooting

การใช้ Cloud VPS ของ ผู้ให้บริการโฮสติ้ง (https://de.co.th/cloud-vps) ให้ความยืดหยุ่นและการจัดการ Kubernetes Infrastructure ที่มีประสิทธิภาพ ช่วยให้คุณเน้นการทำ Configuration และ Deployment Strategy สำหรับ Argo CD HA ได้อย่างเต็มที่