Deploy WordPress + MySQL บน Kubernetes ด้วย Cloud VPS แบบ Production-Ready

Deploy WordPress + MySQL บน Kubernetes ด้วย Cloud VPS แบบ Production-Ready

การ Deploy WordPress ไปยัง Kubernetes อาจดูซับซ้อน แต่เมื่อคุณเข้าใจขั้นตอนและ Best Practices แล้ว มันจะกลายเป็นวิธีที่ทรงพลังในการจัดการเว็บไซต์ WordPress ในสภาพแวดล้อม Production ด้วย Cloud VPS ของ ผู้ให้บริการโฮสติ้ง คุณจะได้รับ Infrastructure ที่มีความเสถียรและสามารถปรับขนาดได้ตามความต้องการ

ทำไมต้อง Deploy WordPress บน Kubernetes

Kubernetes ให้ข้อได้เปรียบมากมายสำหรับการ Deploy WordPress:

  • High Availability (HA): WordPress replicas สามารถวิ่งบน multiple nodes เพื่อ Failover อัตโนมัติ
  • Auto Scaling: ปรับจำนวน Pods ตามการใช้งาน CPU และ Memory
  • Load Balancing: Kubernetes Service จัดการการกระจายเสนอขอไปยัง Pods ที่หลากหลาย
  • Storage Management: PersistentVolume และ PersistentVolumeClaim จัดการ Upload ไฟล์และ Database
  • Declarative Configuration: ใช้ YAML files เพื่อ Version Control ทั้ง Infrastructure และ Application

Architecture ของ WordPress ใน Kubernetes

ระบบ Production-Ready WordPress บน Kubernetes ประกอบด้วยส่วนประกอบหลักดังนี้:

  • WordPress Pods: Deployment ที่มี 2-3 replicas สำหรับ HA
  • MySQL StatefulSet: Database layer ที่เสถียรพร้อม Persistent Storage
  • Service: ClusterIP สำหรับ Internal communication, LoadBalancer สำหรับ External access
  • Ingress: จัดการ HTTP/HTTPS routing และ SSL/TLS termination
  • ConfigMap & Secret: เก็บ Configuration และ Sensitive data อย่างปลอดภัย
  • PersistentVolume: เก็บ WordPress files และ Database data

1. สร้าง Namespace

ทำให้ Kubernetes cluster สะอาดและจัดระเบียบโดยการสร้าง Namespace ที่เฉพาะเจาะจงสำหรับ WordPress

kubectl create namespace wordpress
kubectl config set-context --current --namespace=wordpress

2. สร้าง Secret สำหรับ Database Credentials

เก็บ MySQL credentials อย่างปลอดภัยใน Kubernetes Secret

kubectl create secret generic mysql-credentials \
  --from-literal=MYSQL_ROOT_PASSWORD=your-secure-root-password \
  --from-literal=MYSQL_DATABASE=wordpress \
  --from-literal=MYSQL_USER=wordpress \
  --from-literal=MYSQL_PASSWORD=your-secure-password \
  -n wordpress

3. สร้าง PersistentVolumeClaim สำหรับ MySQL

MySQL ต้องการ Persistent Storage เพื่อเก็บ Database files

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mysql-pvc
  namespace: wordpress
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: standard
  resources:
    requests:
      storage: 20Gi

4. Deploy MySQL StatefulSet

StatefulSet ให้ Stable identity และ Persistent storage สำหรับ MySQL

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: mysql
  namespace: wordpress
spec:
  serviceName: mysql
  replicas: 1
  selector:
    matchLabels:
      app: mysql
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
      - name: mysql
        image: mysql:8.0
        ports:
        - containerPort: 3306
          name: mysql
        env:
        - name: MYSQL_ROOT_PASSWORD
          valueFrom:
            secretKeyRef:
              name: mysql-credentials
              key: MYSQL_ROOT_PASSWORD
        - name: MYSQL_DATABASE
          valueFrom:
            secretKeyRef:
              name: mysql-credentials
              key: MYSQL_DATABASE
        volumeMounts:
        - name: mysql-storage
          mountPath: /var/lib/mysql
  volumeClaimTemplates:
  - metadata:
      name: mysql-storage
    spec:
      accessModes: [ "ReadWriteOnce" ]
      resources:
        requests:
          storage: 20Gi

5. สร้าง MySQL Service

apiVersion: v1
kind: Service
metadata:
  name: mysql
  namespace: wordpress
spec:
  selector:
    app: mysql
  ports:
  - port: 3306
    targetPort: 3306
  clusterIP: None

6. สร้าง ConfigMap สำหรับ WordPress Configuration

เก็บ WordPress environment variables ใน ConfigMap

apiVersion: v1
kind: ConfigMap
metadata:
  name: wordpress-config
  namespace: wordpress
data:
  WORDPRESS_DB_HOST: "mysql.wordpress.svc.cluster.local"
  WORDPRESS_DB_NAME: "wordpress"
  WORDPRESS_DB_USER: "wordpress"
  WORDPRESS_TABLE_PREFIX: "wp_"

7. Deploy WordPress Deployment

สร้าง Deployment ที่มี 2-3 replicas เพื่อ High Availability

apiVersion: apps/v1
kind: Deployment
metadata:
  name: wordpress
  namespace: wordpress
spec:
  replicas: 3
  selector:
    matchLabels:
      app: wordpress
  template:
    metadata:
      labels:
        app: wordpress
    spec:
      containers:
      - name: wordpress
        image: wordpress:6.4-apache
        ports:
        - containerPort: 80
          name: http
        envFrom:
        - configMapRef:
            name: wordpress-config
        env:
        - name: WORDPRESS_DB_PASSWORD
          valueFrom:
            secretKeyRef:
              name: mysql-credentials
              key: MYSQL_PASSWORD
        volumeMounts:
        - name: wordpress-storage
          mountPath: /var/www/html
        livenessProbe:
          httpGet:
            path: /
            port: 80
          initialDelaySeconds: 30
          periodSeconds: 10
        readinessProbe:
          httpGet:
            path: /
            port: 80
          initialDelaySeconds: 5
          periodSeconds: 5
      volumes:
      - name: wordpress-storage
        emptyDir: {}

8. สร้าง WordPress Service

apiVersion: v1
kind: Service
metadata:
  name: wordpress
  namespace: wordpress
spec:
  type: LoadBalancer
  selector:
    app: wordpress
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80

ตรวจสอบการ Deploy

# ตรวจสอบสถานะของ Pods
kubectl get pods -n wordpress

# ตรวจสอบ Services
kubectl get svc -n wordpress

# ตรวจสอบ Logs
kubectl logs -f deployment/wordpress -n wordpress

# เข้าถึง WordPress
kubectl port-forward svc/wordpress 8080:80 -n wordpress
# หลังจากนั้นเข้า http://localhost:8080

Scaling และ Load Balancing

ปรับจำนวน WordPress replicas ได้ง่าย:

kubectl scale deployment wordpress --replicas=5 -n wordpress

สำหรับ Auto Scaling อัตโนมัติตามการใช้งาน ให้ใช้ HorizontalPodAutoscaler:

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: wordpress-hpa
  namespace: wordpress
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: wordpress
  minReplicas: 2
  maxReplicas: 10
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 70

ความปลอดภัยและ TLS/SSL

ตั้งค่า Ingress เพื่อจัดการ HTTPS:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: wordpress-ingress
  namespace: wordpress
spec:
  tls:
  - hosts:
    - example.com
    secretName: wordpress-tls
  rules:
  - host: example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: wordpress
            port:
              number: 80

Backup และ Disaster Recovery

ทำการ Backup MySQL database เป็นประจำ:

kubectl exec -it mysql-0 -n wordpress -- \
  mysqldump -uroot -p$MYSQL_ROOT_PASSWORD --all-databases > backup.sql

Best Practices

  • ใช้ Namespace เพื่อแยก Applications
  • กำหนด Resource Requests และ Limits สำหรับทุก Pods
  • ใช้ ConfigMap และ Secret สำหรับ Configuration Management
  • ตั้งค่า Health Checks (Liveness และ Readiness Probes)
  • ใช้ Network Policies เพื่อจำกัด Network Traffic
  • บำรุงรักษา Backups ของ Database อย่างสม่ำเสมอ
  • ตรวจสอบ Pod Security Policies และ RBAC

บทสรุป

การ Deploy WordPress บน Kubernetes ด้วย Cloud VPS ของ ผู้ให้บริการโฮสติ้ง ทำให้คุณสามารถสร้าง Infrastructure ที่มีความยืดหยุ่น เสถียร และสามารถปรับขนาดได้ตามความต้องการ ด้วยการทำตามขั้นตอนที่กล่าวไว้ข้างต้น คุณจะมี Production-Ready WordPress environment ที่พร้อมสำหรับการใช้งานจริง