App of Apps Pattern ใน Argo CD จัดการหลาย Application ด้วย Application เดียว
App of Apps Pattern เป็นรูปแบบการจัดการแอปพลิเคชันขั้นสูงใน Argo CD ที่ช่วยให้นักพัฒนาและผู้ดูแลระบบสามารถจัดการแอปพลิเคชันหลายตัวได้อย่างมีประสิทธิภาพ โดยใช้แอปพลิเคชันเดียวเป็นตัวจัดการหลัก (Parent Application) ที่ควบคุมแอปพลิเคชันลูก (Child Applications) ทั้งหมด
เมื่อคุณใช้ ผู้ให้บริการโฮสติ้ง Cloud VPS สำหรับการ Deploy โปรเจกต์ Kubernetes ขนาดใหญ่ การใช้ App of Apps Pattern จะช่วยให้คุณจัดการ Infrastructure เป็นหน่วยเล็ก ๆ ได้ง่ายขึ้น และสามารถ Scale ระบบได้อย่างราบรื่น
App of Apps Pattern คืออะไร
App of Apps Pattern เป็นรูปแบบ GitOps ที่อิงจากแนวคิดของ Declarative Management โดยจะมีแอปพลิเคชันหลักหนึ่งตัวที่ทำหน้าที่เป็น “Application Controller” เพื่อจัดการแอปพลิเคชันลูกหลายตัวพร้อม ๆ กัน
ลักษณะเด่นของ App of Apps Pattern
- Centralized Management: จัดการแอปพลิเคชันทั้งหมดจากจุดเดียว ทำให้ง่ายต่อการติดตามสถานะและอัปเดต
- Modular Architecture: แบ่งแอปพลิเคชันออกเป็นส่วน ๆ เล็ก ๆ ทำให้ง่ายต่อการบำรุงรักษาและพัฒนา
- Scalability: เหมาะสำหรับการจัดการแอปพลิเคชันจำนวนมาก โดยไม่ต้องสร้าง Argo CD Application แยกสำหรับแต่ละตัว
- Consistency: ป้องกันการไม่สอดคล้องกันของการ Deploy โดยทำให้ทุกแอปพลิเคชันอัปเดตพร้อม ๆ กัน
- Flexibility: สามารถควบคุมการ Deploy ของแอปพลิเคชันลูกแต่ละตัวได้อย่างอิสระ
เหตุใดจึงควรใช้ App of Apps Pattern
เมื่อคุณมีโปรเจกต์ขนาดใหญ่ที่ต้องการจัดการแอปพลิเคชันหลายตัว App of Apps Pattern จะเป็นทางออกที่ดีที่สุด
ข้อดีของการใช้ App of Apps Pattern
- ลดความซับซ้อน: แทนที่จะจัดการแอปพลิเคชันแต่ละตัวใน Argo CD คุณจะจัดการแอปพลิเคชันเดียวที่ควบคุมทั้งหมด
- เพิ่มประสิทธิภาพ: ทำให้การ Deploy และอัปเดตเร็วขึ้น เพราะสามารถอัปเดตแอปพลิเคชันลูกหลายตัวพร้อม ๆ กัน
- ง่ายต่อการบำรุงรักษา: เมื่อมีการเปลี่ยนแปลงใด ๆ คุณเพียงแค่อัปเดต Parent Application ก็พอ
- สนับสนุนการ Scale: เมื่อโปรเจกต์เติบโต คุณสามารถเพิ่มแอปพลิเคชันลูกใหม่ได้ง่าย ๆ
- ควบคุมเวอร์ชัน: สามารถควบคุมเวอร์ชันของแต่ละแอปพลิเคชันลูกได้อย่างอิสระ
ขณะที่คุณใช้ ผู้ให้บริการโฮสติ้ง Cloud VPS สำหรับ Hosting โปรเจกต์ Kubernetes ของคุณ การใช้ App of Apps Pattern จะช่วยให้คุณสามารถจัดการ Infrastructure เป็นรูปแบบที่สะดวกและมีประสิทธิภาพ
โครงสร้างไดเรกทอรี่สำหรับ App of Apps
วิธีที่ดีที่สุดในการจัดการ App of Apps Pattern คือการสร้างโครงสร้างไดเรกทอรี่ที่เป็นระเบียบและง่ายต่อการเข้าใจ
ตัวอย่างโครงสร้างไดเรกทอรี่
my-app-of-apps/
├── argocd/
│ ├── parent/
│ │ └── application.yaml # Parent Application
│ └── children/
│ ├── web-app.yaml # Child Application 1
│ ├── api-app.yaml # Child Application 2
│ ├── database-app.yaml # Child Application 3
│ └── cache-app.yaml # Child Application 4
├── apps/
│ ├── web-app/
│ │ ├── Chart.yaml
│ │ ├── values.yaml
│ │ └── templates/
│ ├── api-app/
│ │ ├── Chart.yaml
│ │ ├── values.yaml
│ │ └── templates/
│ ├── database-app/
│ │ ├── Chart.yaml
│ │ ├── values.yaml
│ │ └── templates/
│ └── cache-app/
│ ├── Chart.yaml
│ ├── values.yaml
│ └── templates/
├── environments/
│ ├── dev/
│ │ └── values.yaml
│ ├── staging/
│ │ └── values.yaml
│ └── production/
│ └── values.yaml
└── README.md
โครงสร้างนี้ช่วยให้คุณแยกแยะความแตกต่างระหว่าง Parent Application และ Child Applications ได้ชัดเจน ทำให้ง่ายต่อการบำรุงรักษา
Parent Application Manifest
Parent Application คือแอปพลิเคชันหลักที่ทำหน้าที่ควบคุมแอปพลิเคชันลูกทั้งหมด มันเป็น Argo CD Application ธรรมดาที่ชี้ไปยังไดเรกทอรี่ที่เก็บ Child Applications
ตัวอย่าง Parent Application Manifest
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: my-app-of-apps
namespace: argocd
spec:
project: default
source:
repoURL: https://github.com/yourusername/my-app-of-apps.git
targetRevision: main
path: argocd/children
destination:
server: https://kubernetes.default.svc
namespace: default
syncPolicy:
automated:
prune: true
selfHeal: true
syncOptions:
- CreateNamespace=true
คำอธิบายของ Parent Application Manifest
- metadata.name: ชื่อของ Parent Application ในระบบ Argo CD
- source.repoURL: URL ของ Git repository ที่เก็บ Application Manifests
- source.path: ชี้ไปยังไดเรกทอรี่ที่เก็บ Child Applications YAML files
- destination.server: Kubernetes cluster ที่ Deploy ไป
- syncPolicy: กำหนดนโยบายการ Sync อัตโนมัติ
เมื่อ Parent Application ชี้ไปยังไดเรกทอรี่ Argo CD จะสแกนไฟล์ YAML ทั้งหมดในไดเรกทอรีนั้นและสร้าง Application สำหรับแต่ละไฟล์โดยอัตโนมัติ
Child Application Manifests
Child Applications คือแอปพลิเคชันแต่ละตัวที่ถูกควบคุมโดย Parent Application แต่ละ Child Application สามารถมีการ Deploy แยกแต่งต่างได้
ตัวอย่าง Child Application 1: Web Application
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: web-app
namespace: argocd
spec:
project: default
source:
repoURL: https://github.com/yourusername/my-app-of-apps.git
targetRevision: main
path: apps/web-app
destination:
server: https://kubernetes.default.svc
namespace: web-app
syncPolicy:
automated:
prune: true
selfHeal: true
syncOptions:
- CreateNamespace=true
ตัวอย่าง Child Application 2: API Application
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: api-app
namespace: argocd
spec:
project: default
source:
repoURL: https://github.com/yourusername/my-app-of-apps.git
targetRevision: main
path: apps/api-app
destination:
server: https://kubernetes.default.svc
namespace: api-app
syncPolicy:
automated:
prune: true
selfHeal: true
syncOptions:
- CreateNamespace=true
ตัวอย่าง Child Application 3: Database Application
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: database-app
namespace: argocd
spec:
project: default
source:
repoURL: https://github.com/yourusername/my-app-of-apps.git
targetRevision: main
path: apps/database-app
destination:
server: https://kubernetes.default.svc
namespace: database
syncPolicy:
automated:
prune: true
selfHeal: true
syncOptions:
- CreateNamespace=true
โปรดทราบว่าแต่ละ Child Application มี namespace ที่แตกต่างกัน ซึ่งช่วยให้สามารถแยกการทำงานของแต่ละแอปพลิเคชันได้
พฤติกรรมการ Sync ของ App of Apps
เมื่อ Parent Application ทำการ Sync แอปพลิเคชันลูกจะ Sync ไปด้วยโดยอัตโนมัติ ขึ้นอยู่กับ syncPolicy ที่กำหนดไว้
วิธีการ Sync
- Manual Sync: ต้องกดปุ่ม Sync ด้วยตนเองผ่านทาง Argo CD UI หรือ CLI
- Automated Sync: เมื่อมีการเปลี่ยนแปลงใน Git repository Argo CD จะ Sync โดยอัตโนมัติ
- Selective Sync: สามารถเลือก Sync เฉพาะแอปพลิเคชันลูกที่ต้องการเท่านั้น
ตัวอย่างการตั้งค่า Automated Sync
syncPolicy:
automated:
prune: true # ลบ resources ที่ไม่อยู่ใน Git
selfHeal: true # แก้ไขอัตโนมัติเมื่อมีการเปลี่ยนแปลง
syncOptions:
- CreateNamespace=true # สร้าง namespace อัตโนมัติ
- PrunePropagationPolicy=background # ลบ background
ด้วยการตั้งค่านี้ Parent Application จะทำการ Sync Child Applications ทุกครั้งที่มีการเปลี่ยนแปลงใน Git repository
Best Practices สำหรับ App of Apps Pattern
การใช้ App of Apps Pattern อย่างถูกต้องต้องปฏิบัติตามข้อปฏิบัติที่ดีของ GitOps และ Argo CD
1. ใช้ Git Repository สำหรับจัดการการ Deploy
ทุกการเปลี่ยนแปลงควรอยู่ใน Git repository และสามารถ Track ได้ ช่วยให้สามารถ Rollback ได้ง่ายเมื่อมีปัญหา
2. แบ่ง Applications ตามหน้าที่
จัดกลุ่ม Applications ตามหน้าที่หลักเช่น web, api, database, cache เพื่อให้ง่ายต่อการจัดการและบำรุงรักษา
3. ใช้ Namespaces เพื่อแยก Applications
ให้แต่ละแอปพลิเคชัน Deploy ไปยัง namespace ที่แตกต่างกัน ช่วยให้ง่ายต่อการควบคุมการเข้าถึงและทำให้ปลอดภัยขึ้น
4. ตั้งค่า Resource Quotas และ Limits
กำหนด Resource Quotas สำหรับแต่ละ namespace เพื่อป้องกันแอปพลิเคชันใดแอปพลิเคชันหนึ่งใช้ resources มากเกินไป
5. ใช้ Kustomize หรือ Helm สำหรับ Templating
ใช้เครื่องมือ Templating เช่น Kustomize หรือ Helm เพื่อให้สามารถทำการ Deploy ไปยัง environments ต่าง ๆ ได้อย่างง่ายดาย
6. ตั้งค่า Health Check ที่เหมาะสม
ตรวจสอบให้แน่ใจว่า Health Check ของ Applications ถูกตั้งค่าให้สามารถตรวจจับปัญหาได้อย่างถูกต้องและเร็ว
7. ติดตาม Sync Status
จัดตั้งการแจ้งเตือน (Notifications) เพื่อได้รับข้อมูลเมื่อ Parent Application หรือ Child Applications ไม่ Sync
ตัวอย่างการปฏิบัติจริง
เมื่อคุณ Deploy โปรเจกต์ไปยัง ผู้ให้บริการโฮสติ้ง Cloud VPS โดยใช้ Argo CD และ App of Apps Pattern ให้ทำดังนี้
ขั้นตอนที่ 1: สร้าง Parent Application
สร้างไฟล์ parent-app.yaml ที่ชี้ไปยังไดเรกทอรี่ child applications
ขั้นตอนที่ 2: สร้าง Child Applications
สร้างไฟล์ YAML สำหรับแต่ละ child application เช่น web-app.yaml, api-app.yaml เป็นต้น
ขั้นตอนที่ 3: Apply Parent Application
kubectl apply -f parent-app.yaml
ขั้นตอนที่ 4: ตรวจสอบสถานะ
argocd app list
argocd app get my-app-of-apps
ด้วยวิธีนี้ Parent Application จะสร้าง Child Applications ทั้งหมดโดยอัตโนมัติและจัดการ Deploy ของแต่ละตัว
หัวข้อขั้นสูง
การใช้ App of Apps กับ Kustomize
Kustomize ช่วยให้คุณสามารถจัดการ Kubernetes manifests ได้อย่างมีประสิทธิภาพ โดยสามารถสร้าง overlays สำหรับ environments ต่าง ๆ
การใช้ App of Apps กับ Helm
Helm charts ช่วยให้คุณสามารถสร้าง reusable Kubernetes packages ได้ สำหรับ App of Apps Pattern คุณสามารถใช้ Helm charts สำหรับ Child Applications
Cross-Cluster Deployment
App of Apps Pattern สนับสนุนการ Deploy ไปยัง Multiple Kubernetes clusters พร้อมกัน ซึ่งเหมาะสำหรับการสร้าง High Availability
การแก้ปัญหาทั่วไป
Child Applications ไม่ Sync
หากพบว่า Child Applications ไม่ Sync ให้ตรวจสอบ
- Git repository URL ถูกต้องหรือไม่
- Access Token มีสิทธิ์เพียงพอหรือไม่
- Argo CD Server มีการเชื่อมต่อ Kubernetes Cluster ถูกต้องหรือไม่
Resource Conflict
ถ้า Child Applications ใช้ resources ที่ชื่อเดียวกัน อาจเกิด conflict ให้ใช้ namespace ที่แตกต่างกันสำหรับแต่ละแอปพลิเคชัน
Performance Issues
เมื่อมี Child Applications จำนวนมาก ให้พิจารณาแบ่งเป็น Multiple Parent Applications เพื่อปรับปรุงประสิทธิภาพ
สรุป
App of Apps Pattern เป็นวิธีที่มีประสิทธิภาพสำหรับจัดการแอปพลิเคชัน Kubernetes หลายตัวด้วย Argo CD โดยให้ความสะดวกในการ Deploy, Update, และ Monitor applications ทั้งหมดจากจุดเดียว
เมื่อใช้ ผู้ให้บริการโฮสติ้ง Cloud VPS สำหรับการ Host Kubernetes cluster ของคุณ คุณสามารถใช้ App of Apps Pattern เพื่อให้การจัดการ Infrastructure เป็นไปอย่างมีประสิทธิภาพและเป็นระเบียบ
หากท่านต้องการความช่วยเหลือในการจัดตั้ง Argo CD หรือ App of Apps Pattern บน Kubernetes Cluster สามารถติดต่อ ผู้ให้บริการโฮสติ้ง Co, Ltd. ได้ที่ https://de.co.th หรือ https://de.co.th/cloud-vps

