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

