Workshop: Deploy Laravel App ด้วย Argo CD + Helm บน Kubernetes Cloud VPS

Workshop: Deploy Laravel App ด้วย Argo CD + Helm บน Kubernetes Cloud VPS

บทความนี้เป็นคู่มือการเรียนรู้เชิงปฏิบัติสำหรับการ Deploy แอปพลิเคชัน Laravel ด้วย Argo CD และ Helm บน Kubernetes ที่ทำงานบน Cloud VPS ของ ผู้ให้บริการโฮสติ้ง

บทนำ

การ Deploy แอปพลิเคชัน Laravel บน Kubernetes ด้วย Argo CD และ Helm เป็นวิธีการที่ทันสมัย ช่วยให้การจัดการเวอร์ชันและ Deployment อัตโนมัติ ลดข้อผิดพลาดในการจัดการแอปพลิเคชัน ผู้ให้บริการโฮสติ้ง Cloud VPS มอบความยืดหยุ่นและประสิทธิภาพสูงสำหรับโครงการขนาดใหญ่

ข้อกำหนดเบื้องต้น

  • Kubernetes Cluster ที่ติดตั้งบน Cloud VPS (เวอร์ชัน 1.24+)
  • Laravel 10 หรือเวอร์ชันใหม่กว่า
  • Docker และ Docker Registry
  • Helm 3.10+
  • Argo CD เวอร์ชัน 2.6+
  • kubectl command-line tool
  • Git Repository สำหรับเก็บ Helm Chart

ขั้นตอนที่ 1: Dockerize Laravel Application

ขั้นแรกให้สร้าง Dockerfile สำหรับแอปพลิเคชัน Laravel:

FROM php:8.2-fpm as base
WORKDIR /app
COPY . .
RUN apt-get update && apt-get install -y \
    curl \
    libpq-dev \
    git \
    && docker-php-ext-install pdo_mysql

FROM base as builder
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
RUN composer install --no-interaction --optimize-autoloader

FROM php:8.2-fpm
WORKDIR /app
COPY --from=builder /app /app
RUN apt-get update && apt-get install -y libpq-dev \
    && docker-php-ext-install pdo_mysql
COPY docker/php.ini /usr/local/etc/php/php.ini
EXPOSE 9000
CMD ["php-fpm"]

ขั้นตอนที่ 2: สร้าง Helm Chart

สร้างโครงสร้าง Helm Chart สำหรับการจัดการ Kubernetes Resources:

laravel-helm-chart/
├── Chart.yaml
├── values.yaml
├── templates/
│   ├── deployment.yaml
│   ├── service.yaml
│   ├── configmap.yaml
│   └── secret.yaml

ไฟล์ Chart.yaml

apiVersion: v2
name: laravel-app
description: Helm chart for Laravel application
type: application
version: 1.0.0
appVersion: "1.0"

ไฟล์ values.yaml

replicaCount: 2

image:
  repository: your-registry/laravel-app
  tag: "1.0.0"
  pullPolicy: IfNotPresent

service:
  type: ClusterIP
  port: 80
  targetPort: 9000

ingress:
  enabled: true
  className: "nginx"
  hosts:
    - host: laravel-app.example.com
      paths:
        - path: /
          pathType: Prefix

resources:
  limits:
    cpu: 500m
    memory: 512Mi
  requests:
    cpu: 250m
    memory: 256Mi

env:
  APP_NAME: "Laravel App"
  APP_ENV: "production"
  LOG_CHANNEL: "stdout"

database:
  host: postgres-service
  port: 5432
  name: laravel_db

Template Deployment

apiVersion: apps/v1
kind: Deployment
metadata:
  name: {{ include "laravel-app.fullname" . }}
spec:
  replicas: {{ .Values.replicaCount }}
  selector:
    matchLabels:
      app: laravel-app
  template:
    metadata:
      labels:
        app: laravel-app
    spec:
      containers:
      - name: laravel
        image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
        ports:
        - containerPort: 9000
        env:
        - name: APP_KEY
          valueFrom:
            secretKeyRef:
              name: laravel-secrets
              key: app-key
        - name: DB_PASSWORD
          valueFrom:
            secretKeyRef:
              name: laravel-secrets
              key: db-password
        livenessProbe:
          httpGet:
            path: /health
            port: 9000
          initialDelaySeconds: 30
          periodSeconds: 10

ขั้นตอนที่ 3: ติดตั้ง Argo CD บน Kubernetes

ติดตั้ง Argo CD บนคลัสเตอร์ Kubernetes ของ Cloud VPS:

kubectl create namespace argocd
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
kubectl port-forward svc/argocd-server -n argocd 8080:443

รับค่า Password เริ่มต้น:

kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d

ขั้นตอนที่ 4: ตั้งค่า Argo CD Application ด้วย Helm

สร้างไฟล์ Argo CD Application YAML:

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: laravel-app
  namespace: argocd
spec:
  project: default
  source:
    repoURL: https://github.com/youruser/laravel-helm-chart
    targetRevision: main
    path: laravel-helm-chart
    helm:
      releaseName: laravel-app
      values: |
        image:
          tag: "1.0.0"
  destination:
    server: https://kubernetes.default.svc
    namespace: production
  syncPolicy:
    automated:
      prune: true
      selfHeal: true
    syncOptions:
    - CreateNamespace=true

นำไปใช้กับ Argo CD:

kubectl apply -f argocd-application.yaml

ขั้นตอนที่ 5: จัดการ Database Migrations

สร้าง Kubernetes Job สำหรับ Database Migrations:

apiVersion: batch/v1
kind: Job
metadata:
  name: laravel-migrations
spec:
  template:
    spec:
      containers:
      - name: migrate
        image: your-registry/laravel-app:1.0.0
        command: ["php", "artisan", "migrate", "--force"]
        env:
        - name: DB_PASSWORD
          valueFrom:
            secretKeyRef:
              name: laravel-secrets
              key: db-password
      restartPolicy: Never

ขั้นตอนที่ 6: ตัวแปรสภาพแวดล้อม

สร้าง ConfigMap และ Secret สำหรับจัดการตัวแปร:

kubectl create configmap laravel-config \
  --from-literal=APP_NAME="Laravel App" \
  --from-literal=APP_ENV="production"

kubectl create secret generic laravel-secrets \
  --from-literal=app-key="base64:..." \
  --from-literal=db-password="your-password"

ขั้นตอนที่ 7: ทดสอบและตรวจสอบ Deployment

ตรวจสอบสถานะของ Application บน Argo CD:

kubectl get applications -n argocd
kubectl describe application laravel-app -n argocd
kubectl logs -n production deployment/laravel-app

ทดสอบ HTTP Request:

kubectl port-forward service/laravel-app 8080:80 -n production
curl http://localhost:8080

แนวทางปฏิบัติที่ดี

  • ใช้ GitOps Workflow สำหรับจัดการเวอร์ชัน
  • ควบคุมการอัปเดตอัตโนมัติด้วย Argo CD Sync Policies
  • ใช้ Private Docker Registry เพื่อความปลอดภัย
  • สร้าง Health Checks และ Probes สำหรับทุกคอนเทนเนอร์
  • ติดตั้ง Kubernetes Dashboard สำหรับการมอนิเตอร์
  • ใช้ Persistent Volumes สำหรับข้อมูลที่ต้องการจัดเก็บ

การอัปเดตเวอร์ชันแอปพลิเคชัน

อัปเดตเวอร์ชัน Docker Image และ Push ไปยัง Registry:

docker build -t your-registry/laravel-app:1.1.0 .
docker push your-registry/laravel-app:1.1.0

อัปเดต values.yaml ในกิต Repository:

image:
  tag: "1.1.0"

Argo CD จะตรวจสอบการเปลี่ยนแปลงและ Sync โดยอัตโนมัติ

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

ปัญหา: Pod ไม่สามารถเริ่มต้นได้ – ตรวจสอบ logs ด้วย kubectl logs และตรวจสอบ Image Registry Access

ปัญหา: Argo CD ไม่ Sync – ตรวจสอบ Git Repository Credentials และ Helm Chart Syntax

ปัญหา: Database Connection Error – ตรวจสอบ Secret Configuration และ Network Policy

บทสรุป

การ Deploy Laravel Application บน Kubernetes ด้วย Argo CD และ Helm บน ผู้ให้บริการโฮสติ้ง Cloud VPS นำเสนอวิธีการที่เป็นระบบและมีประสิทธิภาพ ผ่านการปฏิบัติตามขั้นตอนนี้ คุณสามารถตั้งค่า GitOps Workflow ที่ช่วยลดข้อผิดพลาดและเพิ่มประสิทธิภาพการพัฒนา

หากต้องการการสนับสนุนเพิ่มเติมในการตั้งค่า Kubernetes Cluster บน Cloud VPS หรือ Cloud Hosting ของเรา โปรดติดต่อทีมสนับสนุนของ ผู้ให้บริการโฮสติ้ง ได้ที่ ผู้ให้บริการโฮสติ้ง Cloud VPS หรือ ผู้ให้บริการโฮสติ้ง Cloud Hosting


ผู้ให้บริการโฮสติ้ง Knowledge Base – ศูนย์ความรู้อบรม Workshop และบทความสำหรับการพัฒนาระบบ Cloud VPS และ Cloud Hosting

สำหรับข้อมูลเพิ่มเติม: https://de.co.th