K8S部署WordPress+MySQL:模块化YAML配置详解

K8S部署 WordPress + MySQL

本项目利于YAML文件进行部署,拆分成多个YAML文件,更能理解每个资源的作用。

推荐的yaml文件结构

bash 复制代码
wordpress-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 安装页面 而不是错误!

相关推荐
忡黑梨2 小时前
eNSP_ACL原理及应用
运维·服务器·网络·tcp/ip·github·负载均衡
日取其半万世不竭2 小时前
用云服务器搭建Frp内网穿透,实现远程访问家里电脑
运维·服务器
代码中介商2 小时前
Linux 进程间通信(IPC):管道与信号量完全指南
linux·运维·服务器
mjhcsp2 小时前
雨云服务器使用方法(入门1)
服务器
张青贤2 小时前
linux离线部署docker和docker-compose
linux·docker·docker-compose
Rick19932 小时前
mysql 慢查询如何快速定位
数据库·mysql
Zender Han3 小时前
Docker 部署 OpenClaw:从安装到日常使用的完整指南
docker·openclaw
Johnstons3 小时前
网络抓包留存平台怎么选:全量留存、按需抓包与传统镜像方案的边界、场景与判断标准
运维·服务器·网络·网络运维
晨晖23 小时前
linux命令7(systemctl服务进行管理)
linux·运维·服务器