下面给你一份 生产可用级 的完整流程:使用 Kubernetes(k8s) 部署 WordPress + MySQL + 持久化存储 + Ingress 访问。
适用于:
- 单机测试(Minikube / Docker Desktop)
- 云服务器 K8s 集群
- 生产环境基础部署
一、整体架构说明
部署结构:
用户访问
↓
Ingress
↓
WordPress Pod
↓
MySQL Pod
↓
Persistent Volume
组件说明:
- WordPress Deployment
- MySQL StatefulSet
- PVC 持久化存储
- Service 内部通信
- Ingress 对外访问
二、准备环境
1️⃣ 安装 Kubernetes
可选方案:
- 本地:Minikube
- Docker Desktop 自带 K8s
- 云服务器:kubeadm / 云厂商托管
检查是否安装成功:
kubectl version
kubectl get nodes
三、创建命名空间
kubectl create namespace wordpress
四、创建 MySQL
mysql-secret.yaml
apiVersion: v1
kind: Secret
metadata:
name: mysql-secret
namespace: wordpress
type: Opaque
stringData:
MYSQL_ROOT_PASSWORD: root123
MYSQL_DATABASE: wordpress
MYSQL_USER: wpuser
MYSQL_PASSWORD: wp123
应用:
kubectl apply -f mysql-secret.yaml
mysql-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mysql-pvc
namespace: wordpress
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 5Gi
mysql-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: mysql
namespace: wordpress
spec:
selector:
matchLabels:
app: mysql
template:
metadata:
labels:
app: mysql
spec:
containers:
- name: mysql
image: mysql:8.0
envFrom:
- secretRef:
name: mysql-secret
ports:
- containerPort: 3306
volumeMounts:
- name: mysql-storage
mountPath: /var/lib/mysql
volumes:
- name: mysql-storage
persistentVolumeClaim:
claimName: mysql-pvc
mysql-service.yaml
apiVersion: v1
kind: Service
metadata:
name: mysql
namespace: wordpress
spec:
ports:
- port: 3306
selector:
app: mysql
五、部署 WordPress
wordpress-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: wordpress-pvc
namespace: wordpress
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 5Gi
wordpress-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: wordpress
namespace: wordpress
spec:
replicas: 1
selector:
matchLabels:
app: wordpress
template:
metadata:
labels:
app: wordpress
spec:
containers:
- name: wordpress
image: wordpress:latest
env:
- name: WORDPRESS_DB_HOST
value: mysql
- name: WORDPRESS_DB_USER
valueFrom:
secretKeyRef:
name: mysql-secret
key: MYSQL_USER
- name: WORDPRESS_DB_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-secret
key: MYSQL_PASSWORD
- name: WORDPRESS_DB_NAME
valueFrom:
secretKeyRef:
name: mysql-secret
key: MYSQL_DATABASE
ports:
- containerPort: 80
volumeMounts:
- name: wp-storage
mountPath: /var/www/html
volumes:
- name: wp-storage
persistentVolumeClaim:
claimName: wordpress-pvc
wordpress-service.yaml
apiVersion: v1
kind: Service
metadata:
name: wordpress
namespace: wordpress
spec:
type: ClusterIP
ports:
- port: 80
selector:
app: wordpress
六、配置 Ingress(对外访问)
前提:必须安装 Nginx Ingress Controller
安装:
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/cloud/deploy.yaml
ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: wordpress-ingress
namespace: wordpress
spec:
rules:
- host: wp.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: wordpress
port:
number: 80
应用:
kubectl apply -f ingress.yaml
七、验证部署
查看 Pod:
kubectl get pods -n wordpress
查看 Service:
kubectl get svc -n wordpress
查看 Ingress:
kubectl get ingress -n wordpress
访问:
http://wp.example.com
八、生产优化建议
✅ 1. MySQL 使用 StatefulSet
生产环境建议:
- 不要用 Deployment
- 使用 StatefulSet
- 使用独立存储类
✅ 2. 使用独立数据库(推荐)
生产不要在 K8s 内跑 MySQL。
建议:
- 云数据库
- 独立 MySQL 服务器
✅ 3. 增加资源限制
resources:
requests:
memory: "256Mi"
cpu: "250m"
limits:
memory: "512Mi"
cpu: "500m"
✅ 4. 启用 HPA 自动扩容
kubectl autoscale deployment wordpress \
--cpu-percent=50 \
--min=1 \
--max=5 \
-n wordpress
✅ 5. HTTPS(生产必须)
使用 cert-manager:
kubectl apply -f https://github.com/cert-manager/cert-manager/releases/latest/download/cert-manager.yaml
然后配置 Let’s Encrypt。
九、完整部署顺序
按顺序执行:
1. namespace
2. mysql secret
3. mysql pvc
4. mysql deployment
5. mysql service
6. wordpress pvc
7. wordpress deployment
8. wordpress service
9. ingress
十、常见问题
❌ Pod CrashLoopBackOff
查看日志:
kubectl logs pod-name -n wordpress
❌ 数据库连接失败
检查:
WORDPRESS_DB_HOST=mysql
是否和 service 名字一致。
❌ 访问不了域名
检查:
kubectl get ingress -A
总结
k8s 部署 WordPress 核心就是:
- Service 负责内部访问
- PVC 负责数据持久化
- Ingress 负责外部访问
- Secret 负责敏感信息
如果你愿意,我可以给你:
- 🔥 一份生产级 Helm Chart 版本
- 🔥 带 HTTPS + HPA + Redis 缓存的完整架构
- 🔥 阿里云 / 腾讯云 K8s 实战版本
- 🔥 多副本 + 读写分离数据库架构
你是本地测试还是云服务器生产环境?
我可以给你对应版本。
发表回复