下面给你一份 生产可用级 的完整流程:使用 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 实战版本
  • 🔥 多副本 + 读写分离数据库架构

你是本地测试还是云服务器生产环境?
我可以给你对应版本。