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 ได้อย่างมีประสิทธิภาพและปลอดภัย

