Sync Policy ใน Argo CD: Manual Sync vs Auto Sync ใช้แบบไหนดี?

Sync Policy ใน Argo CD คืออะไร?

Sync Policy คือนโยบายที่กำหนดวิธีการซิงโครไนซ์ (Synchronize) ระหว่างสิ่งที่เก็บไว้ใน Git Repository กับสถานะปัจจุบันในคลัสเตอร์ Kubernetes ของคุณ Argo CD จะตรวจสอบว่าสิ่งที่อยู่ใน Repository ตรงกับสิ่งที่ Running ในคลัสเตอร์หรือไม่ และจะทำการ Deploy ตามนโยบายที่คุณกำหนด

มี 2 ประเภทหลักของ Sync Policy:

  • Manual Sync: ต้องคลิกปุ่มเอง ยังไม่ Auto Deploy
  • Auto Sync: Argo CD จะ Deploy โดยอัตโนมัติเมื่อมีการเปลี่ยนแปลงใน Git Repository

Manual Sync: การ Sync แบบควบคุมด้วยตัวเอง

Manual Sync ทำงานอย่างไร?

เมื่อตั้งค่า Sync Policy เป็น Manual Argo CD จะตรวจสอบเอกสารใน Git Repository อย่างสม่ำเสมอ แต่จะไม่ Deploy โดยอัตโนมัติ แทนที่จะนั้น คุณจะต้องคลิกปุ่ม “Sync” ในหน้า Argo CD UI เอง หรือใช้คำสั่ง CLI เพื่อให้มีการซิงโครไนซ์

ตัวอย่างคำสั่ง CLI สำหรับ Manual Sync:

argocd app sync my-app

Manual Sync กับการเขียน YAML

นี่คือตัวอย่าง Application manifest ที่ตั้งค่า Sync Policy เป็น Manual:

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: my-app
  namespace: argocd
spec:
  project: default
  source:
    repoURL: https://github.com/myorg/myrepo
    targetRevision: main
    path: k8s/
  destination:
    server: https://kubernetes.default.svc
    namespace: default
  syncPolicy:
    syncOptions:
    - CreateNamespace=true

เมื่อไม่มี automated field ใน syncPolicy นั้นหมายความว่า Argo CD ตั้งค่าเป็น Manual Sync โดยค่าเริ่มต้น

ใช้ Manual Sync เมื่อไหร่?

  • Production Environment: คุณต้องการควบคุมการ Deploy อย่างระมัดระวัง
  • Compliance Requirement: องค์กรของคุณมีนโยบายต้องอนุมัติก่อนทำการเปลี่ยนแปลง
  • Testing ก่อน Deploy: คุณต้องการตรวจสอบการเปลี่ยนแปลงก่อนจะ Deploy จริง
  • Critical System: ระบบที่มีความเสี่ยงสูง เช่น ระบบการเงิน

ข้อดีและข้อเสีย Manual Sync

ข้อดี:

  • ควบคุม Deploy ได้อย่างเต็มที่
  • ลดความเสี่ยงจากการเปลี่ยนแปลงที่ไม่คาด
  • ต้องได้รับอนุมัติจากผู้บริหารก่อน Deploy
  • ปลอดภัยสำหรับ Production

ข้อเสีย:

  • ช้าลงเพราะต้องรอการอนุมัติและการ Deploy ด้วยตัวเอง
  • อาจลืมทำการ Deploy ได้
  • เพิ่มความซับซ้อนในการจัดการ Workflow
  • ไม่เหมาะสำหรับ CI/CD Pipeline ที่ต้องการความเร็ว

Auto Sync: การ Sync แบบอัตโนมัติ

Auto Sync ทำงานอย่างไร?

เมื่อเปิด Auto Sync Argo CD จะตรวจสอบสถานะของ Repository ของคุณอย่างต่อเนื่อง (โดยค่าเริ่มต้นทุก 3 นาที) เมื่อ Argo CD ตรวจพบว่า Git Repository มีการเปลี่ยนแปลงใหม่ มันจะ Deploy โดยอัตโนมัติทันที

การตั้งค่า Auto Sync ด้วย YAML

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: my-app
  namespace: argocd
spec:
  project: default
  source:
    repoURL: https://github.com/myorg/myrepo
    targetRevision: main
    path: k8s/
  destination:
    server: https://kubernetes.default.svc
    namespace: default
  syncPolicy:
    automated:
      prune: true
      selfHeal: true
    syncOptions:
    - CreateNamespace=true

ทำความเข้าใจ Auto Sync Options

Prune = true

เมื่อเปิด Prune Argo CD จะลบ Resources ที่ไม่อยู่ใน Git Repository แล้ว นี่เป็นเรื่องสำคัญเพราะมันช่วยให้สถานะของ Kubernetes Cluster ตรงกับ Git Source of Truth ทุกครั้ง

SelfHeal = true

Self Heal ช่วยให้ Argo CD ตรวจสอบและแก้ไขสถานะของ Cluster โดยอัตโนมัติ หากมีการเปลี่ยนแปลงจาก Git Source เช่น ถ้ามีคนทำการเปลี่ยน Pod แบบ Manual ด้วยคำสั่ง kubectl Argo CD จะแก้ไขมันกลับตามที่อยู่ใน Git

ใช้ Auto Sync เมื่อไหร่?

  • Development Environment: ต้องการความเร็วและ Flexibility สูง
  • Staging Environment: ต้องการทดสอบอย่างรวดเร็ว
  • Microservices Architecture: มีการ Deploy ที่บ่อยๆ
  • Continuous Deployment: คุณต้องการให้ Deploy เร็ว และมีข้อผิดพลาดน้อย

เปรียบเทียบ Manual Sync vs Auto Sync

เกณฑ์ Manual Sync Auto Sync
ความเร็ว ช้า (ต้องรอการอนุมัติ) เร็ว (อัตโนมัติ)
ความปลอดภัย สูง (ควบคุมทั้งหมด) ปานกลาง (ต้องเชื่อใจระบบ)
ความซับซ้อน สูง (ต้องคน Deploy) ต่ำ (โดยอัตโนมัติ)
เหมาะสำหรับ Dev ไม่เหมาะ เหมาะสูง
เหมาะสำหรับ Prod เหมาะสูง ไม่เหมาะ (ปลอดภัยน้อย)

เลือก Sync Policy ที่เหมาะสมตามสภาพแวดล้อม

Development Environment

สำหรับ Development ควรใช้ Auto Sync เพราะต้องการทดสอบอย่างรวดเร็ว ความเสี่ยงต่ำเพราะไม่ใช่ Production และช่วยลดเวลาการ Deploy

syncPolicy:
  automated:
    prune: true
    selfHeal: true
  syncOptions:
  - CreateNamespace=true

Production Environment

Production ควรใช้ Manual Sync หรือ Auto Sync ที่มี Prune = false เพราะต้องเลี่ยงการ Deploy ที่อาจทำให้ระบบขัดข้อง

syncPolicy:
  syncOptions:
  - CreateNamespace=true

ตัวอย่างการตั้งค่า YAML ที่สมบูรณ์

Development Application (Auto Sync)

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: my-app-dev
  namespace: argocd
spec:
  project: default
  source:
    repoURL: https://github.com/myorg/myrepo
    targetRevision: develop
    path: k8s/dev/
  destination:
    server: https://kubernetes.default.svc
    namespace: dev
  syncPolicy:
    automated:
      prune: true
      selfHeal: true
    syncOptions:
    - CreateNamespace=true
    retry:
      limit: 5
      backoff:
        duration: 5s
        factor: 2
        maxDuration: 3m

Production Application (Manual Sync)

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: my-app-prod
  namespace: argocd
spec:
  project: production
  source:
    repoURL: https://github.com/myorg/myrepo
    targetRevision: main
    path: k8s/prod/
  destination:
    server: https://kubernetes.default.svc
    namespace: production
  syncPolicy:
    syncOptions:
    - CreateNamespace=true
    retry:
      limit: 3
      backoff:
        duration: 5s
        factor: 2
        maxDuration: 1m

ปัญหาที่พบบ่อยและวิธีแก้ไข

Auto Sync ทำให้ Deployment ผิดพลาด

วิธีแก้ไข: ตั้ง prune: false เพื่อไม่ให้ลบ Resources โดยไม่ตั้งใจ หรือเปลี่ยนเป็น Manual Sync เพื่อตรวจสอบก่อน

Manual Sync ทำให้ Deployment ช้า

วิธีแก้ไข: ตั้ง Webhook จาก GitHub เพื่อให้ Argo CD ตรวจสอบ Repository เร็วขึ้น หรือใช้ ArgoCD CLI เพื่อ Deploy ด้วย Script

Best Practices สำหรับ Sync Policy

1. ใช้ Git Source of Truth เสมอ – ไม่ควรทำการเปลี่ยนแปลง Resources ด้วยคำสั่ง kubectl โดยตรง

2. ทำการตรวจสอบการ Deploy ก่อนซิงโครไนซ์ – ใช้ argocd app diff เพื่อดูความแตกต่างก่อน Sync

3. ตั้ง Retry Policy – ตั้ง Retry Policy ให้เพื่อให้ Deploy มีความทนทานมากขึ้น

4. ใช้ Notifications – ตั้ง Notifications เพื่อให้ทราบสถานะของ Deployment

5. ระวังการใช้ Prune – เมื่อเปิด Prune ให้ระวังเพราะอาจลบ Resources ที่สำคัญได้

การใช้ Argo CD กับ ผู้ให้บริการโฮสติ้ง Cloud VPS

หากคุณใช้ ผู้ให้บริการโฮสติ้ง Cloud VPS สำหรับ Kubernetes Cluster ของคุณ Argo CD จะช่วยให้การจัดการ Deployment เป็นเรื่องง่ายขึ้น โดยสามารถตั้ง Sync Policy ตามการจำแนกประเภท Environment ของคุณได้

ผู้ให้บริการโฮสติ้ง Cloud VPS มีความเสถียรและมี High Availability ซึ่งเหมาะสำหรับการใช้งานร่วมกับ Argo CD ทั้งใน Development และ Production environments

สรุป

การเลือก Sync Policy ที่เหมาะสมนั้นขึ้นอยู่กับความต้องการของ Environment ของคุณ Manual Sync เหมาะสำหรับ Production ที่ต้องการความปลอดภัยสูง ส่วน Auto Sync เหมาะสำหรับ Development และ Staging ที่ต้องการความเร็ว ด้วยการเข้าใจ Sync Policy อย่างลึกซึ้ง คุณจะสามารถจัดการ Kubernetes Deployment ได้อย่างมีประสิทธิภาพและปลอดภัย