จัดโครงสร้าง Git Repository สำหรับ Argo CD แบบ Monorepo และ Multi-repo

จัดโครงสร้าง Git Repository สำหรับ Argo CD แบบ Monorepo และ Multi-repo

เมื่อใช้ Argo CD สำหรับจัดการ Kubernetes deployments ในสภาพแวดล้อม production หนึ่งในสิ่งที่สำคัญที่สุดคือการออกแบบโครงสร้าง Git Repository ให้เหมาะสม เพราะมันจะส่งผลกระทบต่อการจัดการ configurations, collaboration, และการ scale ของ DevOps workflows

บทความนี้จะนำเสนอเทคนิคการจัดโครงสร้าง Git Repository สองแบบที่นิยมใช้กับ Argo CD ได้แก่ Monorepo และ Multi-repo พร้อมตัวอย่างปฏิบัติ ข้อดี-ข้อเสีย และบทบาทของ ApplicationSet สำหรับการจัดการหลาย repositories

Monorepo Strategy: ทุกอย่างใน Repository เดียว

Monorepo คือการจัดเก็บ configurations และ manifests สำหรับ applications หลายตัวใน Git repository เดียว ซึ่งให้ความสะดวกในการบำรุงรักษาและจัดการ version control ที่เป็นส่วนกลาง

โครงสร้าง Monorepo แบบพื้นฐาน

argocd-monorepo/
├── apps/
│   ├── frontend/
│   │   ├── kustomization.yaml
│   │   └── deployment.yaml
│   ├── backend/
│   │   ├── kustomization.yaml
│   │   └── service.yaml
│   └── database/
│       ├── kustomization.yaml
│       └── statefulset.yaml
├── environments/
│   ├── dev/
│   │   ├── namespace.yaml
│   │   └── kustomization.yaml
│   ├── staging/
│   │   ├── namespace.yaml
│   │   └── kustomization.yaml
│   └── production/
│       ├── namespace.yaml
│       └── kustomization.yaml
├── clusters/
│   ├── cluster-1/
│   │   └── config.yaml
│   └── cluster-2/
│       └── config.yaml
└── argocd-apps/
    ├── frontend-app.yaml
    ├── backend-app.yaml
    └── database-app.yaml

ตัวอย่าง Argo CD Application สำหรับ Monorepo

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

ข้อดีของ Monorepo

  • การจัดการ version control เป็นส่วนกลาง – ทุก applications มี version history เดียวกัน ทำให้ tracking changes ง่ายขึ้น
  • Atomic commits – สามารถ update multiple applications พร้อมกันในคำสั่ง commit เดียว
  • Code sharing – สามารถแบ่งปัน scripts, templates, หรือ base configurations ได้ง่ายขึ้น
  • Simplified branching strategy – ไม่ต้องจัดการ branches หลายตัวในหลาย repositories

ข้อเสียของ Monorepo

  • Repository size – repository จะใหญ่ขึ้นเมื่อมี applications เยอะ ส่งผลต่อ clone time
  • Merge conflicts – หลาย teams ทำงานกับไฟล์เดียวกันอาจเกิด conflicts บ่อยขึ้น
  • Access control ยุ่งยาก – ยากต่อการให้สิทธิ์เฉพาะส่วนของ applications บางตัว

Multi-repo Strategy: แยก Repository สำหรับแต่ละ Application

Multi-repo คือการแยก configurations สำหรับแต่ละ application หรือ team ไปยัง repositories ต่างๆ อย่างเป็นอิสระ ซึ่งมีความยืดหยุ่นและ scalability ที่สูง

โครงสร้าง Multi-repo

Organization/
├── argocd-config/  (Central repository)
│   ├── AppProject definitions
│   ├── RBAC policies
│   └── argocd-apps/
│       ├── frontend-app.yaml
│       ├── backend-app.yaml
│       └── database-app.yaml
│
├── frontend-gitops/  (Frontend team)
│   ├── environments/
│   │   ├── dev/
│   │   ├── staging/
│   │   └── production/
│   └── kustomization.yaml
│
├── backend-gitops/  (Backend team)
│   ├── environments/
│   │   ├── dev/
│   │   ├── staging/
│   │   └── production/
│   └── kustomization.yaml
│
└── database-gitops/  (Database team)
    ├── environments/
    ├── kustomization.yaml
    └── helm-values/

ตัวอย่าง Application สำหรับ Multi-repo

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: frontend-app
  namespace: argocd
spec:
  project: frontend-team
  source:
    repoURL: https://github.com/company/frontend-gitops
    targetRevision: main
    path: environments/production
  destination:
    server: https://kubernetes.default.svc
    namespace: production
  syncPolicy:
    automated:
      prune: true
      selfHeal: true

ข้อดีของ Multi-repo

  • Team independence – แต่ละ team สามารถจัดการ repository ของตัวเองได้อย่างเป็นอิสระ
  • Granular access control – ควบคุมสิทธิ์เข้าถึง per repository ได้อย่างละเอียด
  • Smaller repositories – repositories มีขนาดเล็ก ทำให้ clone และ operations เร็วขึ้น
  • Clear separation of concerns – แต่ละ application มี responsibility ชัดเจน
  • Fewer merge conflicts – ไม่ต้องแบ่งปันไฟล์ configurations กัน

ข้อเสียของ Multi-repo

  • Repository management complexity – ต้องจัดการหลาย repositories ทำให้ซับซ้อนขึ้น
  • Distributed version history – ยากต่อการติดตาม changes ที่เกี่ยวข้องกันหลาย repositories
  • Code duplication – อาจต้องคัดลอก base configurations หลายครั้งข้าม repositories

ApplicationSet สำหรับ Multi-repo Management

เมื่อใช้ Multi-repo pattern ขนาดใหญ่ ApplicationSet คือโซลูชันที่ช่วยให้จัดการหลาย Applications ได้อัตโนมัติ แทนการสร้าง Application manifests ทีละตัว

ตัวอย่าง ApplicationSet สำหรับ Multi-repo

apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
  name: multi-app-set
  namespace: argocd
spec:
  generators:
  - git:
      repoURL: https://github.com/company/argocd-config
      revision: HEAD
      directories:
      - path: "app-configs/*"
  template:
    metadata:
      name: '{{path.basename}}'
    spec:
      project: default
      source:
        repoURL: 'https://github.com/company/{{path.basename}}-gitops'
        targetRevision: main
        path: environments/production
      destination:
        server: https://kubernetes.default.svc
        namespace: '{{path.basename}}'
      syncPolicy:
        automated:
          prune: true
          selfHeal: true

ApplicationSet นี้จะสแกน directory ใน argocd-config repository และสร้าง Applications สำหรับแต่ละ app โดยอัตโนมัติ ทำให้การจัดการหลาย repositories กลายเป็นเรื่องง่ายขึ้น

เปรียบเทียบ Monorepo vs Multi-repo

เกณฑ์ Monorepo Multi-repo
Team Independence ต่ำ – ต้องประสานงานกัน สูง – เป็นอิสระ
Repository Size ใหญ่ – อาจช้า เล็ก – เร็ว
Merge Conflicts บ่อยขึ้น ไม่บ่อยนัก
Access Control ยุ่งยาก ง่าย – ต่อ repository
Code Sharing ง่าย ต้องใช้ shared repositories
Atomic Updates ง่าย – single commit ยากขึ้น

เลือกใช้ Monorepo หรือ Multi-repo เมื่อไร

ใช้ Monorepo เมื่อ:

  • มีจำนวน applications ไม่มาก (น้อยกว่า 10 ตัว) และมีความเกี่ยวข้องกันสูง
  • ต้องการ atomic updates ข้ามหลาย applications
  • มี single team หรือ teams ที่ทำงานใกล้ชิดกัน
  • ต้องการการแบ่งปัน base configurations หลาย applications

ใช้ Multi-repo เมื่อ:

  • มี applications จำนวนมาก และไม่เกี่ยวข้องกันมากนัก
  • มี multiple teams และแต่ละ team มี ownership ต่างกัน
  • ต้องการ fine-grained access control
  • ต้องการให้ teams สามารถเคลื่อนไหวได้เร็ว (fast-moving teams)

Best Practices สำหรับ Git Repository Structure

1. ใช้ Kustomize หรือ Helm เพิ่มความยืดหยุ่น

จัดเตรียม Kustomize bases หรือ Helm charts สำหรับสภาพแวดล้อมต่างๆ (dev, staging, production) เพื่อหลีกเลี่ยง YAML duplication

2. กำหนด GitOps Conventions

กำหนดชื่อ repository, branch naming, directory structure ให้มีความสอดคล้องกันทั้งองค์กร เพื่อให้ teams ใหม่เข้าใจง่ายขึ้น

3. ใช้ App of Apps Pattern

สำหรับ Monorepo ขนาดใหญ่ ให้ใช้ “app of apps” pattern – สร้าง Application หนึ่งตัวที่จัดการ Applications อื่นๆ

4. ควบคุม Secrets ให้ปลอดภัย

ไม่ควร commit secrets ไปยัง Git repositories ให้ใช้ sealed-secrets หรือ External Secrets Operator แทน

5. ตั้งค่า RBAC อย่างเหมาะสม

สำหรับ Multi-repo pattern ให้สร้าง AppProject ต่างๆ และมอบสิทธิ์ RBAC ให้กับ teams อย่างเหมาะสม

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

เพื่อให้ Argo CD ทำงานได้อย่างเต็มที่ คุณจะต้องมี infrastructure ที่สม่ำเสมอและเชื่อถือได้ ผู้ให้บริการโฮสติ้ง Cloud VPS นำเสนอโซลูชัน cloud infrastructure ที่เหมาะสมสำหรับการ deploy Kubernetes clusters และ Argo CD ด้วยบริการที่มั่นคง เร็ว และสามารถสเกลได้ตามความต้องการ

ด้วยแพลตฟอร์ม Cloud VPS ของ DE คุณสามารถ:

  • ตั้งค่า Kubernetes clusters หลายตัวข้ามหลาย regions
  • มั่นใจความพร้อมใช้งานสูง (High Availability) สำหรับ Argo CD server
  • ควบคุม resources อย่างมีประสิทธิภาพเพื่อเพิ่มประสิทธิภาพการ sync ของ Argo CD
  • บูรณาการกับระบบ monitoring และ logging ได้อย่างสมบูรณ์

สรุป

การเลือกระหว่าง Monorepo และ Multi-repo strategy นั้นขึ้นอยู่กับความต้องการและขนาดขององค์กร:

  • Monorepo เหมาะสำหรับ teams ขนาดเล็ก applications ที่มีความเกี่ยวข้องกัน และต้องการการแบ่งปันรหัสและการอัปเดตแบบ atomic
  • Multi-repo เหมาะสำหรับองค์กรใหญ่ที่มี teams หลายตัว applications จำนวนมาก และต้องการความเป็นอิสระของ teams
  • Hybrid approach มักเป็นตัวเลือกที่เหมาะสมที่สุดในทางปฏิบัติ

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