Argo CD Application คืออะไร? สร้างและจัดการ Application แรก

Argo CD Application คืออะไร?

Argo CD Application เป็นทรัพยากร Kubernetes Custom Resource Definition (CRD) ที่ใช้ในการบอก Argo CD ว่าควรจะนำใช้งาน (deploy) source code หรือ manifests จากที่ใด (source) ไปยังไหน (destination) บน Kubernetes cluster

Application resource ทำหน้าที่เป็นสะพานเชื่อมระหว่าง Git repository (ที่เก็บ Kubernetes manifests) และ Kubernetes cluster เมื่อมีการเปลี่ยนแปลงในโค้ดบน Git repository Argo CD จะตรวจสอบและอัปเดต cluster โดยอัตโนมัติ

ประโยชน์ของการใช้ Argo CD Application

  • จัดการ declarative configuration ผ่าน Git
  • ติดตามการเปลี่ยนแปลง (audit trail) ของ deployments
  • ปรับปรุง reliability ด้วยการซิงโครไนซ์อัตโนมัติ
  • ควบคุมการ rollback และ update ด้วย GitOps workflow

Application Manifest YAML – โครงสร้างพื้นฐาน

Argo CD Application ถูกกำหนดโดยใช้ YAML manifest ที่มีโครงสร้างดังต่อไปนี้:

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: my-first-app
  namespace: argocd
spec:
  project: default
  source:
    repoURL: https://github.com/yourusername/your-repo
    targetRevision: HEAD
    path: manifests/
  destination:
    server: https://kubernetes.default.svc
    namespace: default
  syncPolicy:
    automated:
      prune: true
      selfHeal: true
    syncOptions:
    - CreateNamespace=true
  revisionHistoryLimit: 10

องค์ประกอบหลักของ Application Spec

Source (แหล่งที่มา): ระบุ Git repository URL ที่เก็บ Kubernetes manifests และ branch หรือ tag ที่ต้องการใช้

source:
  repoURL: https://github.com/your-org/configs
  targetRevision: main
  path: apps/production/
  helm:
    releaseName: myapp
    values: |
      replicas: 3
      image:
        tag: v1.2.0

Destination (ปลายทาง): ระบุ Kubernetes cluster และ namespace ที่ต้องการนำใช้งาน Application

destination:
  server: https://kubernetes.default.svc
  namespace: production
  name: in-cluster

Sync Policy (นโยบายการซิงโครไนซ์): ควบคุมวิธีการซิงโครไนซ์ระหว่าง Git state และ cluster state

syncPolicy:
  automated:
    prune: true
    selfHeal: true
    allowEmpty: false
  syncOptions:
  - CreateNamespace=true
  - PrunePropagationPolicy=foreground
  retry:
    limit: 5
    backoff:
      duration: 5s
      factor: 2
      maxDuration: 3m

สร้าง Application แรกของคุณ

วิธีที่ 1: ใช้ Argo CD CLI

หากคุณต้องการสร้าง Application ผ่าน command line interface สามารถใช้คำสั่งดังนี้:

argocd app create my-first-app \
  --repo https://github.com/yourusername/your-repo \
  --path manifests/ \
  --dest-server https://kubernetes.default.svc \
  --dest-namespace default \
  --auto-prune \
  --self-heal

เมื่อสร้าง Application แล้ว ให้ตรวจสอบสถานะด้วยคำสั่ง:

argocd app get my-first-app
argocd app list

หากต้องการซิงโครไนซ์ (deploy) Application ให้ใช้คำสั่ง:

argocd app sync my-first-app

วิธีที่ 2: ใช้ Argo CD Web UI

Argo CD มี Web interface ที่สะดวกใจสำหรับการสร้างและจัดการ Applications:

  1. เข้าไปยัง Argo CD dashboard (โดยปกติ https://localhost:8080)
  2. คลิก “New App” button ที่มุมบน
  3. กรอกรายละเอียดดังนี้:
    • Application Name: ชื่อ application เช่น “my-first-app”
    • Project: เลือก “default” project
    • Repository URL: URL ของ Git repository
    • Revision: ระบุ branch เช่น “main” หรือ “HEAD”
    • Path: path ไปยัง manifests directory เช่น “manifests/” หรือ “k8s/”
    • Destination Cluster: เลือก cluster (in-cluster)
    • Destination Namespace: ระบุ namespace เช่น “default” หรือ “production”
  4. เปิด “Sync Policy” และเลือก “Automated” เพื่อให้ sync อัตโนมัติ
  5. คลิก “Create” เพื่อสร้าง Application

การตั้งค่า Source และ Destination

Source Configuration

Source ในที่นี้หมายถึง Git repository ที่เก็บ Kubernetes manifests ของคุณ

source:
  repoURL: https://github.com/organization/infrastructure-configs
  targetRevision: v1.2.3
  path: apps/web-app/
  plugin:
    name: my-custom-plugin
  kustomize:
    version: v4.5.2
    commonLabels:
      app: my-app
      version: v1

Argo CD รองรับหลายวิธีในการแยกวิเคราะห์ manifests:

  • Plain YAML: ไฟล์ Kubernetes manifests ธรรมดา
  • Kustomize: ใช้ kustomization.yaml เพื่อปรับแต่ง manifests
  • Helm: ใช้ Helm charts สำหรับการจัดการ templates
  • Jsonnet: ใช้ Jsonnet สำหรับการสร้าง manifests แบบ dynamic
  • Custom Plugins: ใช้ custom plugins สำหรับวิธีอื่น ๆ

Destination Configuration

Destination ระบุว่าจะนำใช้งาน Application ไปยัง cluster และ namespace ใด

destination:
  server: https://kubernetes.example.com:6443
  namespace: production
  name: production-cluster

สำหรับการจัดการ infrastructure ขนาดใหญ่ที่ใช้ Kubernetes หลายตัว คุณสามารถใช้บริการ ผู้ให้บริการโฮสติ้ง Cloud VPS เพื่อรันและจัดการ Kubernetes clusters ที่มีความเสถียรสูง ด้วยประสิทธิภาพเหนือกว่า

Health Status และ Sync Status

Health Status

Health status บอกถึงสภาพของ resources ที่ deploy บน cluster

  • Healthy: ทุก resources ทำงานได้ปกติและอยู่ในสถานะที่คาดหวัง
  • Progressing: Resources กำลังเปลี่ยนสถานะไปยังสถานะที่ต้องการ
  • Degraded: Resources มีปัญหาหรือไม่ทำงาน
  • Unknown: ไม่สามารถบอกสถานะของ resources ได้
  • Missing: Resources ที่ควรมีอยู่นั้นหายไป

Sync Status

Sync status แสดงว่า Application state ใน cluster ตรงกับ Git state หรือไม่

  • Synced: Git state และ cluster state เหมือนกัน
  • Out of Sync: Git state และ cluster state ไม่เหมือนกัน
  • Unknown: ไม่สามารถตรวจสอบ sync status ได้

ดูรายละเอียดของ health และ sync status ด้วยคำสั่ง:

argocd app get my-first-app
argocd app wait my-first-app --health

การจัดการ Application

แก้ไข Application

หากต้องการเปลี่ยนแปลง Application configuration คุณสามารถแก้ไขได้สองวิธี:

วิธีที่ 1: ใช้ CLI

argocd app patch my-first-app --type merge \
  -p '{"spec":{"source":{"targetRevision":"develop"}}}'

วิธีที่ 2: ใช้ Web UI – เปิด Application details แล้วคลิก “Edit” เพื่อแก้ไข YAML manifest

ซิงโครไนซ์ Application

บังคับให้ Application ซิงโครไนซ์กับ Git state:

argocd app sync my-first-app
argocd app sync my-first-app --force
argocd app sync my-first-app --prune

ลบ Application

ลบ Application เมื่อไม่ต้องการใช้งานอีกต่อไป:

argocd app delete my-first-app
argocd app delete my-first-app --cascade

Refresh Application

บังคับให้ Argo CD ตรวจสอบ Git repository และ refresh Application state:

argocd app get my-first-app --refresh
argocd app wait my-first-app

Best Practices สำหรับ Argo CD Application

โครงสร้าง Git Repository

จัดระเบียบ Git repository ให้มีโครงสร้างที่ชัดเจน:

your-repo/
├── apps/
│   ├── web-app/
│   │   ├── kustomization.yaml
│   │   ├── deployment.yaml
│   │   └── service.yaml
│   └── api-app/
│       ├── deployment.yaml
│       └── service.yaml
├── base/
│   ├── namespace.yaml
│   └── rbac.yaml
└── overlays/
    ├── development/
    │   └── kustomization.yaml
    ├── staging/
    │   └── kustomization.yaml
    └── production/
        └── kustomization.yaml

ใช้ Git Branches สำหรับ Environments ต่างๆ

สร้าง Application หลายตัวที่ชี้ไปยัง branches ต่างกัน เพื่อจัดการ development staging และ production environments แยกกัน

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: myapp-production
spec:
  source:
    repoURL: https://github.com/org/repo
    targetRevision: main
    path: apps/myapp/
  destination:
    server: https://kubernetes.default.svc
    namespace: production
---
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: myapp-staging
spec:
  source:
    repoURL: https://github.com/org/repo
    targetRevision: develop
    path: apps/myapp/
  destination:
    server: https://kubernetes.default.svc
    namespace: staging

ตั้งค่า RBAC และ Access Control

กำหนดสิทธิ์การเข้าถึง Application ให้เหมาะสม:

apiVersion: v1
kind: ConfigMap
metadata:
  name: argocd-rbac-cm
  namespace: argocd
data:
  policy.default: role:readonly
  policy.csv: |
    p, role:developer, applications, get, */*, allow
    p, role:developer, applications, sync, */*, allow
    p, role:admin, applications, *, */*, allow
    g, dev-team, role:developer
    g, ops-team, role:admin

ใช้ Application Sets สำหรับ Multi-Cluster Deployments

สำหรับการจัดการหลาย applications หรือหลาย clusters ให้ใช้ ApplicationSet:

apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
  name: myapp-deployment
spec:
  generators:
  - list:
      elements:
      - cluster: production
        namespace: prod
      - cluster: staging
        namespace: staging
  template:
    spec:
      source:
        repoURL: https://github.com/org/repo
        path: apps/myapp/
        targetRevision: main
      destination:
        server: '{{ cluster }}'
        namespace: '{{ namespace }}'

การจัดการ Secrets อย่างปลอดภัย

ห้ามเก็บ secrets ในที่เปิดเผย ให้ใช้ Sealed Secrets หรือ External Secrets Operator:

apiVersion: bitnami.com/v1alpha1
kind: SealedSecret
metadata:
  name: my-secret
spec:
  encryptedData:
    password: AgBkS2fZs1...
  template:
    metadata:
      name: my-secret
    type: Opaque

ตรวจสอบและ Monitoring

ตั้งค่า monitoring สำหรับ Argo CD Applications:

  • ใช้ Prometheus เพื่อเก็บเมตริกส์ของ Argo CD
  • ตั้งค่า alerts สำหรับ sync failures และ health issues
  • บันทึก audit logs ของการเปลี่ยนแปลง (changes)
  • ตรวจสอบ Application status อย่างสม่ำเสมอ

สรุป

Argo CD Application คือเครื่องมือที่ทรงพลังสำหรับการจัดการ Kubernetes deployments ด้วยวิธี GitOps ด้วยการทำความเข้าใจเกี่ยวกับ Application manifest YAML การสร้าง Application ผ่าน CLI และ UI การตั้งค่า source และ destination ตลอดจนการปฏิบัติตามหลักปฏิบัติที่ดี คุณสามารถควบคุมและจัดการ applications บน Kubernetes ได้อย่างมีประสิทธิภาพและปลอดภัย

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