Sync Options ใน Argo CD ปรับแต่งพฤติกรรม Sync อย่างละเอียด

บทนำ: Sync Options ในการจัดการแอปพลิเคชัน

เมื่อทำงานกับ Argo CD ในสภาพแวดล้อม Kubernetes บน Cloud VPS ของ ผู้ให้บริการโฮสติ้ง คุณจะต้องเข้าใจวิธีการควบคุมพฤติกรรมการซิงโครไนซ์ (Sync) ของแอปพลิเคชัน Sync Options เป็นการตั้งค่าที่ช่วยให้คุณมีความสามารถในการปรับแต่งวิธีที่ Argo CD ทำการประมวลผล และปรับใช้การเปลี่ยนแปลงกับคลัสเตอร์ของคุณ

Sync Options คืออะไร

Sync Options เป็นการตั้งค่าในไฟล์ Application manifest ที่ช่วยควบคุมพฤติกรรมการซิงโครไนซ์ของ Argo CD ด้วย Sync Options คุณสามารถ:

  • ควบคุมวิธีการตรวจสอบความถูกต้องของทรัพยากร (Validate)
  • สร้างเนมสเปส (Namespace) โดยอัตโนมัติ
  • กำหนดนโยบายการลบทรัพยากร (Prune Policy)
  • ใช้การแทนที่ทรัพยากร (Replace)
  • ใช้การใช้งานฝั่งเซิร์ฟเวอร์ (Server-Side Apply)

ตัวเลือก Sync Options ทั้งหมด

1. Validate – ตรวจสอบความถูกต้องของทรัพยากร

Validate Option ใช้ในการตรวจสอบว่าทรัพยากร YAML ที่ผู้ใช้ส่งมานั้นถูกต้องหรือไม่ หากตั้งเป็น false จะข้ามการตรวจสอบและสามารถปรับใช้ได้แม้ว่า YAML อาจมีข้อผิดพลาด

กรณีการใช้งาน: ใช้เมื่อต้องการปรับใช้ custom resource definitions (CRDs) ที่ไม่มี schema ที่ชัดเจน

2. CreateNamespace – สร้างเนมสเปสโดยอัตโนมัติ

เมื่อตั้ง CreateNamespace เป็น true Argo CD จะสร้างเนมสเปสที่ระบุในแอปพลิเคชันโดยอัตโนมัติหากไม่มีอยู่

3. PrunePropagationPolicy – นโยบายการลบ Cascade

Option นี้กำหนดว่าควรลบทรัพยากรที่เกี่ยวข้องด้วยหรือไม่ เมื่อ Argo CD ลบทรัพยากรหลัก ค่าดีฟอลต์คือ “foreground” ซึ่งจะรอให้ทรัพยากรย่อยถูกลบก่อน

4. PruneLast – ลบทรัพยากรเป็นครั้งสุดท้าย

เมื่อตั้ง PruneLast เป็น true Argo CD จะลบทรัพยากรเป็นขั้นตอนสุดท้ายของการซิงโครไนซ์ สิ่งนี้มีประโยชน์เมื่อต้องการให้การลบเกิดขึ้นหลังจากที่ทรัพยากรใหม่มีการจัดการอย่างสมบูรณ์

5. Replace – แทนที่ทรัพยากร

เมื่อตั้ง Replace เป็น true Argo CD จะลบและสร้างทรัพยากรใหม่แทนที่จะแก้ไขทรัพยากรที่มีอยู่

6. ServerSideApply – ใช้การใช้งานฝั่งเซิร์ฟเวอร์

Server-Side Apply เป็นวิธีการใหม่ในการแก้ไข resources ใน Kubernetes หากตั้ง ServerSideApply เป็น true Argo CD จะใช้ Server-Side Apply แทน Client-Side Apply ซึ่งให้การแก้ไขที่ดีขึ้นสำหรับ resources ที่มี controllers ที่เขียนค่า fields

7. FailOnSharedResource – ล้มเหลวหากมีทรัพยากรที่ใช้ร่วมกัน

เมื่อตั้ง FailOnSharedResource เป็น true Argo CD จะล้มเหลวการซิงโครไนซ์หากพบว่าทรัพยากรกำลังถูกจัดการโดยแอปพลิเคชันอื่นด้วย

8. RespectIgnoreDifferences – เคารพการไม่สนใจความแตกต่าง

Option นี้ช่วยให้ Argo CD เคารพการตั้ง ignoreDifferences ในแอปพลิเคชัน แล้วจึงไม่พิจารณาความแตกต่างในบางฟิลด์เมื่อเปรียบเทียบสถานะปัจจุบัน

9. ApplyOutOfSyncOnly – ใช้งานเฉพาะสำหรับทรัพยากรที่ out-of-sync

เมื่อตั้ง ApplyOutOfSyncOnly เป็น true Argo CD จะใช้งานเฉพาะทรัพยากรที่อยู่ในสถานะ out-of-sync

วิธีการตั้งค่า Sync Options ใน Application YAML

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: my-app
  namespace: argocd
spec:
  project: default
  source:
    repoURL: https://github.com/example/repo
    targetRevision: HEAD
    path: manifests
  destination:
    server: https://kubernetes.default.svc
    namespace: production
  syncPolicy:
    automated:
      prune: true
      selfHeal: true
    syncOptions:
    - CreateNamespace=true
    - Validate=true
    - PrunePropagationPolicy=foreground
    - RespectIgnoreDifferences=true

ตัวอย่างการใช้งาน Sync Options

ตัวอย่าง 1: สร้างเนมสเปสและซิงโครไนซ์โดยอัตโนมัติ

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

ตัวอย่าง 2: ใช้ Server-Side Apply และป้องกันความขัดแย้ง

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: secure-app
  namespace: argocd
spec:
  project: default
  source:
    repoURL: https://github.com/example/repo
    path: apps/secure-app
    targetRevision: main
  destination:
    server: https://kubernetes.default.svc
    namespace: default
  syncPolicy:
    syncOptions:
    - ServerSideApply=true
    - FailOnSharedResource=true
    - RespectIgnoreDifferences=true

ตัวอย่าง 3: ลบทรัพยากรเป็นครั้งสุดท้าย

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: stateful-app
  namespace: argocd
spec:
  project: default
  source:
    repoURL: https://github.com/example/repo
    path: apps/stateful
    targetRevision: main
  destination:
    server: https://kubernetes.default.svc
    namespace: default
  syncPolicy:
    syncOptions:
    - PruneLast=true
    - PrunePropagationPolicy=background

การรวมตัวเลือกหลายอย่างเข้าด้วยกัน

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: production-app
  namespace: argocd
spec:
  project: default
  source:
    repoURL: https://github.com/example/repo
    path: apps/production
    targetRevision: main
  destination:
    server: https://kubernetes.default.svc
    namespace: production
  syncPolicy:
    automated:
      prune: true
      selfHeal: true
    syncOptions:
    - CreateNamespace=true
    - Validate=true
    - ServerSideApply=true
    - RespectIgnoreDifferences=true
    - FailOnSharedResource=true
    - PruneLast=true
    - PrunePropagationPolicy=foreground

กรณีการใช้งานตามสภาพแวดล้อม

สภาพแวดล้อมการพัฒนา (Development)

syncOptions:
- CreateNamespace=true
- Replace=true

สภาพแวดล้อมการผลิต (Production)

บน Cloud VPS ของ ผู้ให้บริการโฮสติ้ง คุณต้องระมัดระวังมากขึ้น:

syncOptions:
- Validate=true
- ServerSideApply=true
- FailOnSharedResource=true
- RespectIgnoreDifferences=true
- PruneLast=true

แนวปฏิบัติที่ดีที่สุด (Best Practices)

1. ใช้ Validate อย่างเสมอในสภาพแวดล้อมการผลิต – การตรวจสอบ YAML ช่วยป้องกันการปรับใช้ manifest ที่มีข้อผิดพลาด

2. เข้าใจความแตกต่างระหว่าง Prune Policies – foreground, background, และ orphan เป็นค่าต่างกัน สำหรับแอปพลิเคชัน stateful ใช้ background หรือ orphan

3. ใช้ PruneLast สำหรับการลบที่ปลอดภัย – เมื่อลบแอปพลิเคชัน ตั้ง PruneLast=true เพื่อให้ยุติการลบจนกว่า resources ใหม่จะพร้อม

4. ใช้ ServerSideApply สำหรับการจัดการฟิลด์ที่ดีขึ้น – ServerSideApply ให้การจัดการ field ownership ที่ดีขึ้น

5. ตั้ง FailOnSharedResource เพื่อป้องกันความขัดแย้ง

6. ทดสอบใน Staging ก่อน Production – ทุกครั้งที่เปลี่ยน Sync Options ให้ทดสอบใน staging environment ก่อน

การแก้ไขปัญหาทั่วไป

Argo CD ไม่สามารถสร้างเนมสเปสได้

ตรวจสอบว่า CreateNamespace=true ถูกตั้งอย่างถูกต้องใน syncOptions และ Argo CD controller มีสิทธิ์ที่จำเป็น

Sync ล้มเหลวเนื่องจาก shared resource

หากจำเป็นต้องแชร์ resources ระหว่างแอปพลิเคชัน ตั้ง FailOnSharedResource=false และปรับ ignoreDifferences ให้เหมาะสม

Validation ล้มเหลวแต่ YAML ถูกต้อง

อาจเป็นปัญหากับ CRD definitions ตั้ง Validate=false ชั่วคราวเพื่อ debugging หรือตรวจสอบว่า CRD ถูก install อย่างถูกต้อง

สรุป

Sync Options เป็นเครื่องมือที่ทรงพลังในการปรับแต่งพฤติกรรมการซิงโครไนซ์ของ Argo CD ด้วยการเข้าใจและใช้ตัวเลือกเหล่านี้อย่างถูกต้อง คุณสามารถสร้าง deployment workflows ที่ปลอดภัย มั่นคง และมีประสิทธิภาพสูง สำหรับสภาพแวดล้อมการผลิต เราแนะนำให้ใช้ Cloud VPS ของ ผู้ให้บริการโฮสติ้ง เพื่อให้ได้ผลประโยชน์จากการจัดการโครงสร้างพื้นฐานที่มืออาชีพและการสนับสนุน 24/7