K8S部署 WordPress + MySQL
本项目利于YAML文件进行部署,拆分成多个YAML文件,更能理解每个资源的作用。
推荐的yaml文件结构
bashwordpress-project/ ├── 01-namespace.yaml ├── 02-secret.yaml ├── 03-mysql-pvc.yaml ├── 04-mysql-statefulset.yaml ├── 05-mysql-service.yaml ├── 06-wordpress-deployment.yaml ├── 07-wordpress-service.yaml └── 08-ingress.yaml
一、编写yaml文件
1.创建wordpress命名空间(所有资源的基础,创建独立的逻辑隔离空间)
创建01-namespace.yaml文件写入以下内容
yaml
apiVersion: v1
kind: Namespace
metadata:
name: wordpress
2.创建秘钥管理(用于安全存储敏感信息密码、密钥等,这里用于MySQL读取密码、WordPress读取数据库密码)
创建02-secret.yaml文件写入以下内容
yaml
apiVersion: v1
kind: Secret
metadata:
name: mysql-pass
namespace: wordpress
type: Opaque
stringData:
password: "test123"
3.创建持久化存储(申请存储空间,数据持久化,Pod删除后数据不丢失)
创建03-mysql-pvc.yaml文件写入以下内容
yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mysql-pvc
namespace: wordpress
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
4.创建MySQL数据库(此模块运行MySQL数据库,保证稳定网络标识和存储)
创建04-mysql-statefulset.yaml文件写入以下内容
yaml
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:5.7
ports:
- containerPort: 3306
env:
- name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-pass
key: password
volumeMounts:
- name: mysql-storage
mountPath: /var/lib/mysql
volumeClaimTemplates:
- metadata:
name: mysql-storage
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
5.创建 MySQL服务发现(为MySQL提供稳定的访问入口,WordPress Pod通过它连接MySQL)
创建05-mysql-service.yaml文件写入以下内容
yaml
apiVersion: v1
kind: Service
metadata:
name: mysql
namespace: wordpress
spec:
type: ClusterIP
ports:
- port: 3306
targetPort: 3306
selector:
app: mysql
6.创建WordPress应用(该模块运行WordPress Web应用,依赖MySQL服务可用)
创建06-wordpress-deployment.yaml文件写入以下内容
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
value: wordpress
- name: WORDPRESS_DB_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-pass
key: password
- name: WORDPRESS_DB_NAME
value: wordpress
ports:
- containerPort: 80
resources:
requests:
memory: "128Mi"
cpu: "100m"
limits:
memory: "256Mi"
cpu: "500m"
7.创建WordPress服务暴露(暴露WordPress供外部访问)
创建07-wordpress-service.yaml文件写入以下内容
yaml
apiVersion: v1
kind: Service
metadata:
name: wordpress
namespace: wordpress
spec:
type: NodePort
ports:
- port: 80
nodePort: 30088 #宿主机外部端口
selector:
app: wordpress
8.创建入口规则(可选,提供HTTP/HTTPS路由规则,支持域名访问)
创建08-ingress.yaml文件写入以下内容
yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: wordpress-ingress
namespace: wordpress
spec:
rules:
- host: wordpress.local
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: wordpress
port:
number: 80
9.创建 ConfigMap(可选,把配置文件、环境变量、命令行参数等从容器镜像中分离出来)
创建09-configmap.yaml文件写入以下内容
bash
apiVersion: v1
kind: ConfigMap
metadata:
name: wordpress-config
namespace: wordpress
data:
UPLOAD_MAX_FILESIZE: "64M"
POST_MAX_SIZE: "64M"
MEMORY_LIMIT: "256M"
参数说明
| 参数 | 值 | 作用 | 影响 |
|---|---|---|---|
| UPLOAD_MAX_FILESIZE | 64M | PHP 允许上传的单个文件最大大小 | 限制图片、文档等上传 |
| POST_MAX_SIZE | 64M | PHP 允许提交的整个请求体最大大小 | 限制表单提交总数据量 |
| MEMORY_LIMIT | 256M | PHP 脚本可使用的最大内存 | 限制程序运行内存消耗 |
二、创建资源
bash
kubectl apply -f wordpress-project/
执行以上命令会按文件夹中数字前缀顺序创建文件
bash
01-namespace.yaml ← 第一个创建
02-secret.yaml
03-mysql-pvc.yaml
04-mysql-statefulset.yaml
05-mysql-service.yaml
06-wordpress-deployment.yaml
07-wordpress-service.yaml
08-ingress.yaml ← 最后创建

输出以上内容代表服务已经创建成功了!
三、验证
bash
root@k8s-master:/data/k8s/wordpress-project# kubectl get all -n wordpress
NAME READY STATUS RESTARTS AGE
pod/mysql-0 1/1 Running 0 3h11m
pod/wordpress-776f9b797d-sbsb5 1/1 Running 0 178m
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/mysql ClusterIP 10.96.51.170 <none> 3306/TCP 3h11m
service/wordpress NodePort 10.104.5.167 <none> 80:30088/TCP 3h11m
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/wordpress 1/1 1 1 3h11m
NAME DESIRED CURRENT READY AGE
replicaset.apps/wordpress-776f9b797d 1 1 1 178m
replicaset.apps/wordpress-9cf5899c8 0 0 0 3h11m
NAME READY AGE
statefulset.apps/mysql 1/1 3h11m
四、验证可能遇到的问题
1.MySQL Pod 处于 Pending 状态
通常是PVC绑定问题,PVC没有绑定要PV

bash
root@k8s-master:/data/k8s# kubectl get pv
No resources found
这是一个手动搭建的K8S集群,需要手动创建PV来绑定PVC
推荐解决办法:创建PV绑定现有PVC
bash
# 1. 创建 PV(匹配 PVC 的 1Gi 容量)
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: PersistentVolume
metadata:
name: mysql-pv
spec:
capacity:
storage: 1Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
storageClassName: "" # 空字符串,匹配没有 StorageClass 的 PVC
hostPath:
path: /data/mysql-pv
type: DirectoryOrCreate
EOF
bash
# 2. 为 StatefulSet 的 PVC 也创建一个 PV
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: PersistentVolume
metadata:
name: mysql-storage-mysql-0-pv
spec:
capacity:
storage: 1Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
storageClassName: ""
hostPath:
path: /data/mysql-storage-mysql-0
type: DirectoryOrCreate
EOF
检查绑定状态
bash
root@k8s-master:/data/k8s/wordpress-project# kubectl get pvc -n wordpress
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS VOLUMEATTRIBUTESCLASS AGE
mysql-pvc Bound mysql-storage-mysql-0-pv 1Gi RWO <unset> 3h20m
mysql-storage-mysql-0 Bound mysql-pv 1Gi RWO <unset> 3h20m
root@k8s-master:/data/k8s/wordpress-project# kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS VOLUMEATTRIBUTESCLASS REASON AGE
mysql-pv 1Gi RWO Retain Bound wordpress/mysql-storage-mysql-0 <unset> 3h14m
mysql-storage-mysql-0-pv 1Gi RWO Retain Bound wordpress/mysql-pvc <unset> 3h14m
等待pod启动
bash
kubectl get pod -n wordpress -w
最终验证

看到所有服务都启动,部署成功了!
2.WordPress连接数据库失败
浏览器访问集群IP:30088,提示数据库连接失败,可能原因是WordPress数据库和用户未被创建

解决办法:创建数据库和用户
①登录MySQL
bash
kubectl exec -it mysql-0 -n wordpress -- mysql -u root -p
②在 MySQL 命令行中直接执行
mysql
#在mysql> 提示符下执行:
CREATE DATABASE wordpress;
CREATE USER 'wordpress'@'%' IDENTIFIED BY 'test123';
GRANT ALL PRIVILEGES ON wordpress.* TO 'wordpress'@'%';
FLUSH PRIVILEGES;
EXIT;
执行后刷新网页,应该看到 WordPress 安装页面 而不是错误!
解决办法:创建数据库和用户
①登录MySQL
bash
kubectl exec -it mysql-0 -n wordpress -- mysql -u root -p
②在 MySQL 命令行中直接执行
mysql
#在mysql> 提示符下执行:
CREATE DATABASE wordpress;
CREATE USER 'wordpress'@'%' IDENTIFIED BY 'YourPassword123';
GRANT ALL PRIVILEGES ON wordpress.* TO 'wordpress'@'%';
FLUSH PRIVILEGES;
EXIT;
执行后刷新网页,应该看到 WordPress 安装页面 而不是错误!
