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 ที่พร้อมสำหรับการใช้งานจริง
