Deploy Application ด้วย Argo CD + Kustomize บน Cloud VPS

Deploy Application ด้วย Argo CD + Kustomize บน Cloud VPS

บทนำ

การ Deploy Application บนโครงสร้าง Kubernetes ในปัจจุบันต้องการเครื่องมือที่ทรงพลังและยืดหยุ่น โดย Argo CD และ Kustomize เป็นชุดเครื่องมือที่ได้รับความนิยมอย่างมากในการจัดการ Infrastructure as Code (IaC) และ Continuous Deployment (CD) บนแพลตฟอร์ม Kubernetes

บทความนี้จะอธิบายวิธีการใช้ Argo CD และ Kustomize เพื่อ Deploy Application บน Cloud VPS ของ ผู้ให้บริการโฮสติ้ง อย่างเป็นระบบและมีประสิทธิภาพสูง

Kustomize คืออะไร

Kustomize เป็นเครื่องมือที่ช่วยให้การจัดการไฟล์ YAML Kubernetes มีความยืดหยุ่นมากขึ้น โดยไม่จำเป็นต้องใช้ Template Engine เช่น Helm หรือ Jinja2

Kustomize ช่วยให้คุณสามารถ:

  • สร้าง Base Configuration ที่ใช้ร่วมกันในหลายเวอร์ชัน
  • สร้าง Overlays สำหรับแต่ละสภาพแวดล้อม (Development, Staging, Production)
  • ใช้ Patches เพื่อแก้ไขค่าเฉพาะในแต่ละสภาพแวดล้อม
  • จัดการ ConfigMap และ Secret อย่างมีประสิทธิภาพ

Argo CD และการทำงานกับ Kustomize

Argo CD เป็นเครื่องมือ GitOps สำหรับการจัดการ Continuous Deployment บน Kubernetes โดยทำการโคลน Repository จาก Git และทำการ Sync Configuration โดยอัตโนมัติ

เมื่อ Argo CD ทำงานร่วมกับ Kustomize จะเกิดประโยชน์ดังนี้:

  • Argo CD อ่านไฟล์ kustomization.yaml จาก Repository
  • Kustomize ทำการสร้าง Manifest YAML ฉบับสุดท้าย
  • Argo CD ทำการ Deploy Manifest ไปยัง Kubernetes Cluster บน Cloud VPS
  • โครงสร้าง Git จะกลายเป็น Single Source of Truth สำหรับการจัดการ Configuration

โครงสร้างไดเรกทอรี่และ Base/Overlays Pattern

การใช้ Kustomize อย่างมีประสิทธิภาพจำเป็นต้องมีโครงสร้างไดเรกทอรี่ที่เป็นระเบียบ:

my-app-repo/
├── base/
│   ├── kustomization.yaml
│   ├── deployment.yaml
│   ├── service.yaml
│   └── configmap.yaml
├── overlays/
│   ├── dev/
│   │   ├── kustomization.yaml
│   │   └── patches/
│   ├── staging/
│   │   ├── kustomization.yaml
│   │   └── patches/
│   └── prod/
│       ├── kustomization.yaml
│       └── patches/
└── README.md

Base Directory: เก็บ Manifest YAML พื้นฐานที่ใช้ร่วมกัน

Overlays Directory: เก็บ Configuration เฉพาะของแต่ละสภาพแวดล้อม

ตัวอย่าง Base Configuration

ไฟล์ base/kustomization.yaml ที่กำหนด Resource พื้นฐาน:

apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization

namespace: default

resources:
  - deployment.yaml
  - service.yaml
  - configmap.yaml

commonLabels:
  app: my-application
  managed-by: kustomize

ไฟล์ base/deployment.yaml:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
spec:
  replicas: 2
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
      - name: my-app-container
        image: my-app:latest
        ports:
        - containerPort: 8080
        env:
        - name: APP_ENV
          valueFrom:
            configMapKeyRef:
              name: app-config
              key: environment

ไฟล์ base/service.yaml:

apiVersion: v1
kind: Service
metadata:
  name: my-app-service
spec:
  type: ClusterIP
  ports:
  - port: 80
    targetPort: 8080
    protocol: TCP
  selector:
    app: my-app

ตัวอย่าง Overlays สำหรับสภาพแวดล้อมต่างๆ

ไฟล์ overlays/prod/kustomization.yaml สำหรับ Production Environment:

apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization

namespace: production

bases:
  - ../../base

commonLabels:
  environment: production

replicas:
  - name: my-app
    count: 5

configMapGenerator:
  - name: app-config
    behavior: merge
    literals:
      - environment="production"
      - log-level="warn"

images:
  - name: my-app
    newName: my-app
    newTag: v1.0.0

ไฟล์ overlays/dev/kustomization.yaml สำหรับ Development Environment:

apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization

namespace: development

bases:
  - ../../base

commonLabels:
  environment: development

replicas:
  - name: my-app
    count: 1

images:
  - name: my-app
    newName: my-app
    newTag: latest

การตั้งค่า Argo CD สำหรับใช้งาน Kustomize

สร้างไฟล์ argocd-application.yaml เพื่อบอก Argo CD ว่าจะใช้ Kustomize:

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: my-app
  namespace: argocd
spec:
  project: default

  source:
    repoURL: https://github.com/your-org/my-app-repo.git
    targetRevision: main
    path: overlays/prod

    kustomize:
      version: v5.0.0
      commonLabels:
        app: my-app

  destination:
    server: https://kubernetes.default.svc
    namespace: production

  syncPolicy:
    automated:
      prune: true
      selfHeal: true
    syncOptions:
    - CreateNamespace=true

  revisionHistoryLimit: 10

ขั้นตอนการ Deploy Application บน Cloud VPS

  1. เตรียมโครงสร้าง Repository: สร้าง Git Repository ตามโครงสร้างที่กำหนดในส่วนข้างต้น
  2. ติดตั้ง Argo CD: ติดตั้ง Argo CD บน Kubernetes Cluster บน ผู้ให้บริการโฮสติ้ง Cloud VPS
  3. เชื่อมต่อ Repository: เชื่อมต่อ Git Repository กับ Argo CD
  4. สร้าง Application Resource: สร้าง Application Resource ตามตัวอย่างข้างต้น
  5. ทดสอบ Sync: ทดสอบการ Sync ระหว่าง Git และ Kubernetes Cluster
  6. Monitor Deployment: ตรวจสอบสถานะของ Deployment ผ่าน Argo CD Dashboard

ข้อควรระวังและ Best Practices

  • รักษา Secret แยกต่างหากและอย่าเก็บไว้ใน Repository
  • ใช้ Tag Version ที่ชัดเจนแทน Latest Tag ใน Production
  • ทดสอบ Configuration บน Environment ต่างๆ ก่อนนำไปใช้ใน Production
  • ตั้งค่า Argo CD ให้ทำการ Sync โดยอัตโนมัติเฉพาะใน Development เท่านั้น
  • เก็บ Patch Files และ Overlay Configuration อย่างเป็นระบบ

ผู้ให้บริการโฮสติ้ง Cloud VPS สำหรับการ Deploy

ผู้ให้บริการโฮสติ้ง Cloud VPS (https://de.co.th/cloud-vps) เป็นโซลูชันที่เหมาะสำหรับการจัดการ Kubernetes Cluster ขนาดใหญ่ โดยมีความปลอดภัย ความเสถียร และประสิทธิภาพสูง

ด้วยการใช้ Argo CD + Kustomize บน Cloud VPS จะช่วยให้:

  • ลดเวลาในการ Deploy Application
  • ปรับปรุงความเสถียรของระบบ
  • ลดข้อผิดพลาดในการจัดการ Configuration
  • เพิ่มความปลอดภัยของข้อมูลและระบบ

สรุป

การใช้ Argo CD และ Kustomize ร่วมกันเป็นวิธีที่ทรงพลังและมีประสิทธิภาพในการ Deploy Application บน Kubernetes Cluster โดยเฉพาะบน ผู้ให้บริการโฮสติ้ง Cloud VPS

ด้วยการปฏิบัติตามหลักการ GitOps และการใช้ Kustomize เพื่อจัดการ Configuration อย่างเป็นระบบ จะช่วยให้การจัดการ Infrastructure และ Application มีประสิทธิภาพและความปลอดภัยสูงสุด