k8s部署wordpress

在 K8s( Kubernetes)中部署 WordPress,通常需要结合Deployment(部署 WordPress 应用)+ Service(暴露访问)+ PersistentVolumeClaim(存储数据)+ 数据库(比如 MySQL) 来实现。以下是简化的核心步骤:

1. 准备数据库(以 MySQL 为例)

先部署 MySQL(也可以用已有数据库),需要配置存储和账号:

复制代码
# mysql-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: mysql
spec:
  replicas: 1
  selector:
    matchLabels:
      app: mysql
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
      - name: mysql
        image: mysql:5.7
        env:
        - name: MYSQL_ROOT_PASSWORD
          value: "root密码"
        - name: MYSQL_DATABASE
          value: "wordpress"  # WordPress要用的数据库名
        - name: MYSQL_USER
          value: "wordpress用户"
        - name: MYSQL_PASSWORD
          value: "用户密码"
        volumeMounts:
        - name: mysql-data
          mountPath: /var/lib/mysql
      volumes:
      - name: mysql-data
        persistentVolumeClaim:
          claimName: mysql-pvc

---
# mysql-service.yaml
apiVersion: v1
kind: Service
metadata:
  name: mysql
spec:
  ports:
  - port: 3306
  selector:
    app: mysql
  clusterIP: None  # 无头服务,让WordPress通过服务名访问

2. 部署 WordPress

配置 WordPress 的 Deployment 和 Service,关联 MySQL:

复制代码
# wordpress-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: 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:3306"  # 对应MySQL的Service名
        - name: WORDPRESS_DB_NAME
          value: "wordpress"
        - name: WORDPRESS_DB_USER
          value: "wordpress用户"
        - name: WORDPRESS_DB_PASSWORD
          value: "用户密码"
        volumeMounts:
        - name: wordpress-data
          mountPath: /var/www/html
      volumes:
      - name: wordpress-data
        persistentVolumeClaim:
          claimName: wordpress-pvc

---
# wordpress-service.yaml
apiVersion: v1
kind: Service
metadata:
  name: wordpress
spec:
  type: NodePort  # 暴露到节点端口,方便外部访问
  ports:
  - port: 80
    nodePort: 30080  # 外部访问端口(30000-32767之间)
  selector:
    app: wordpress

3. 配置存储(PVC)

需要提前创建 PersistentVolume(或用集群默认存储类),再创建 PVC:

复制代码
# pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mysql-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi

---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: wordpress-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi

4. 执行部署

依次执行以下命令:

复制代码
# 创建PVC
kubectl apply -f pvc.yaml

# 部署MySQL
kubectl apply -f mysql-deployment.yaml
kubectl apply -f mysql-service.yaml

# 部署WordPress
kubectl apply -f wordpress-deployment.yaml
kubectl apply -f wordpress-service.yaml

解决方法:

如果还没创建 mysql-service.yaml,直接在 master 节点用 vim 新建并写入内容,步骤如下:

  1. 执行命令新建文件:

    复制代码
    vim mysql-service.yaml
  2. 按下 i 键进入编辑模式,粘贴以下完整内容(替换注释里的密码 / 用户名):

    复制代码
    apiVersion: v1
    kind: Service
    metadata:
      name: mysql
    spec:
      ports:
      - port: 3306
      selector:
        app: mysql
      clusterIP: None  # 无头服务,让WordPress通过服务名访问
  3. 按下 Esc 键,输入 :wq 回车保存并退出。

第三步:按顺序执行所有部署文件(完整流程)

为了避免文件缺失 / 顺序错误,建议把所有需要的 yaml 文件都放在同一个目录,然后按以下顺序执行:

1. 先创建存储 PVC 文件(wordpress-pvc.yaml)
复制代码
vim wordpress-pvc.yaml

粘贴内容:

复制代码
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mysql-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: wordpress-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi

保存退出(Esc + :wq),执行创建:

复制代码
kubectl apply -f wordpress-pvc.yaml
2. 创建 MySQL 部署文件(mysql-deployment.yaml)
复制代码
vim mysql-deployment.yaml

粘贴内容(替换<你的root密码>/<wp用户名>/<wp密码>为实际值):

复制代码
apiVersion: apps/v1
kind: Deployment
metadata:
  name: mysql
spec:
  replicas: 1
  selector:
    matchLabels:
      app: mysql
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
      - name: mysql
        image: mysql:5.7
        env:
        - name: MYSQL_ROOT_PASSWORD
          value: "<你的root密码>"  # 替换成自己的密码
        - name: MYSQL_DATABASE
          value: "wordpress"
        - name: MYSQL_USER
          value: "<wp用户名>"      # 自定义WordPress数据库用户
        - name: MYSQL_PASSWORD
          value: "<wp密码>"        # 自定义用户密码
        volumeMounts:
        - name: mysql-data
          mountPath: /var/lib/mysql
      volumes:
      - name: mysql-data
        persistentVolumeClaim:
          claimName: mysql-pvc

保存退出,执行创建:

复制代码
kubectl apply -f mysql-deployment.yaml
3. 创建 MySQL Service(解决你最初的报错)
复制代码
kubectl apply -f mysql-service.yaml
4. 创建 WordPress 部署文件(wordpress-deployment.yaml)
复制代码
vim wordpress-deployment.yaml

粘贴内容(替换<wp用户名>/<wp密码>为和 MySQL 一致的值):

复制代码
apiVersion: apps/v1
kind: Deployment
metadata:
  name: 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:3306"
        - name: WORDPRESS_DB_NAME
          value: "wordpress"
        - name: WORDPRESS_DB_USER
          value: "<wp用户名>"  # 和MySQL里的MYSQL_USER一致
        - name: WORDPRESS_DB_PASSWORD
          value: "<wp密码>"    # 和MySQL里的MYSQL_PASSWORD一致
        volumeMounts:
        - name: wordpress-data
          mountPath: /var/www/html
      volumes:
      - name: wordpress-data
        persistentVolumeClaim:
          claimName: wordpress-pvc

保存退出,执行创建:

复制代码
kubectl apply -f wordpress-deployment.yaml
5. 创建 WordPress Service(暴露访问端口)
复制代码
vim wordpress-service.yaml

粘贴内容:

复制代码
apiVersion: v1
kind: Service
metadata:
  name: wordpress
spec:
  type: NodePort
  ports:
  - port: 80
    nodePort: 30080  # 外部访问端口(30000-32767之间)
  selector:
    app: wordpress

保存退出,执行创建:

复制代码
kubectl apply -f wordpress-service.yaml

第四步:验证部署是否成功

  1. 查看 Pod 状态(确保所有 Pod 都是Running):

    复制代码
    kubectl get pods
  2. 查看 Service 状态(确认 wordpress 的 NodePort 是 30080):

    复制代码
    kubectl get svc
  3. 访问 WordPress:打开浏览器,输入 K8s节点IP:30080(比如 master 节点 IP 是 192.168.1.100,就输入192.168.1.100:30080),即可进入 WordPress 安装界面。

root@master:~kubectl logs mysql-65d6f595cc-w6g8b # 替换成你的MySQL Pod名称称 2025-12-06 06:43:39+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.36-1.el8 started. 2025-12-06 06:43:39+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql' 2025-12-06 06:43:39+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.36-1.el8 started. 2025-12-06 06:43:40+00:00 [ERROR] [Entrypoint]: MYSQL_USER="root", MYSQL_USER and MYSQL_PASSWORD are for configuring a regular user and cannot be used for the root user Remove MYSQL_USER="root" and use one of the following to control the root user password: - MYSQL_ROOT_PASSWORD - MYSQL_ALLOW_EMPTY_PASSWORD - MYSQL_RANDOM_ROOT_PASSWORD

日志里的报错已经把问题说的非常明确了:MYSQL_USER="root", MYSQL_USER and MYSQL_PASSWORD are for configuring a regular user and cannot be used for the root user👉 翻译:你把 MYSQL_USER 设为了 root,但这个环境变量是用来创建普通用户的,不能给 root 用户用

下面是最快修复方案(不用重新写 yaml,直接编辑现有 Deployment),1 分钟就能解决:

第一步:编辑 MySQL 的 Deployment,修正环境变量

复制代码
kubectl edit deployment mysql

找到 env 部分,修改这 2 处:

  1. 删掉 MYSQL_USER: root(或把值改成非 root,比如wpuser);
  2. 删掉 MYSQL_PASSWORD: root123(如果是给 root 设密码,只保留MYSQL_ROOT_PASSWORD即可)。

✅ 修改后的env部分参考:

复制代码
env:
- name: MYSQL_ROOT_PASSWORD
  value: "root123"  # 只保留root密码
- name: MYSQL_DATABASE
  value: "wordpress"  # 保留数据库名
# 删掉 MYSQL_USER 和 MYSQL_PASSWORD 这两行(或改成普通用户)
# 可选:新增普通用户(推荐)
- name: MYSQL_USER
  value: "wpuser"
- name: MYSQL_PASSWORD
  value: "wp123456"

修改完成后,按 Esc + :wq 保存退出。

第二步:重启 MySQL Pod(触发配置生效)

复制代码
# 删除旧的崩溃Pod,Deployment会重建新Pod
kubectl delete pod mysql-65d6f595cc-w6g8b

第三步:同步修正 WordPress 的 Deployment(关键!)

如果刚才给 MySQL 加了普通用户wpuser,必须同步改 WordPress 的数据库连接配置:

复制代码
kubectl edit deployment wordpress

找到 env 部分,修改数据库用户和密码:

复制代码
env:
- name: WORDPRESS_DB_HOST
  value: "mysql:3306"
- name: WORDPRESS_DB_NAME
  value: "wordpress"
- name: WORDPRESS_DB_USER
  value: "wpuser"  # 匹配MySQL的普通用户
- name: WORDPRESS_DB_PASSWORD
  value: "wp123456"  # 匹配MySQL的普通用户密码

保存退出后,重启 WordPress Pod:

复制代码
kubectl rollout restart deployment wordpress

第四步:验证 MySQL Pod 是否正常运行

复制代码
kubectl get pods | grep mysql

✅ 正常输出(STATUS 为 Running,RESTARTS 为 0):

复制代码
mysql-xxxx-xxxx        1/1     Running   0          30s

核心逻辑说明:

  • MySQL 镜像的 MYSQL_USER 环境变量仅用于创建普通用户 ,root 用户的密码只能通过 MYSQL_ROOT_PASSWORD 配置;
  • 如果想让 WordPress 用 root 用户连接数据库:只需保留 MYSQL_ROOT_PASSWORD,删掉 MYSQL_USER/MYSQL_PASSWORD,同时把 WordPress 的 WORDPRESS_DB_USER 改成 rootWORDPRESS_DB_PASSWORD 改成 root123 即可;
  • 生产环境推荐用普通用户(如wpuser),更安全。

执行完后再查 Pod 状态,MySQL 就不会崩溃重启了,WordPress 也能正常连接数据库~

root@master:~# kubectl get pods | grep mysql mysql-6f6bbd4bb7-22trs 1/1 Running 0 91s 这就能访问wprdpress了

是的!现在 MySQL Pod 已经稳定运行(1/1 Running、重启次数 0),说明数据库侧的核心问题已经解决,接下来只要确认 WordPress Pod 也正常运行,就能访问 WordPress 了~

最后两步验证 + 访问:

1. 先检查 WordPress Pod 状态
复制代码
kubectl get pods | grep wordpress

✅ 正常输出(STATUS 为 Running):

复制代码
wordpress-xxxx-xxxx        1/1     Running   0          1m
2. 访问 WordPress(关键!)

打开浏览器,输入:你的K8s节点IP:30080(比如 master 节点 IP 是192.168.1.100,就输入 192.168.1.100:30080

👉 就能进入 WordPress 的可视化安装界面,按提示设置站点名称、管理员账号密码即可完成部署。

小提醒:

  • 如果 WordPress Pod 还在启动中(ContainerCreating),耐心等 10-20 秒(镜像拉取需要时间);

  • 如果访问失败,检查节点防火墙 / 安全组是否放行 30080 端口;

  • 后续想修改 WordPress 访问端口,可编辑 WordPress 的 Service:

    复制代码
    kubectl edit svc wordpress

    修改nodePort字段(范围 30000-32767)即可。

至此整个 K8s 部署 WordPress 的流程就完成了,你可以正常配置和使用 WordPress 啦 ✨!

相关推荐
一周困⁸天.9 小时前
K8S-Ingress资源对象
云原生·容器·kubernetes
2301_8107463112 小时前
CKA冲刺40天笔记 - day20-day21 SSL/TLS详解
运维·笔记·网络协议·kubernetes·ssl
❀͜͡傀儡师12 小时前
docker 部署 komari-monitor监控
运维·docker·容器·komari
悬弧14 小时前
第2章:工作负载管理 - 可视化应用部署
kubernetes·k8s
一条懒鱼66614 小时前
K8S-Ingress资源对象
云原生·容器·kubernetes
luback15 小时前
前端对Docker简单了解
运维·docker·容器
帷幄庸者15 小时前
记一次Kubernetes“僵尸”挖矿病毒的排查与歼灭全录
云原生·容器·kubernetes
eventer12317 小时前
在国产ARM64环境下从源码编译Greptime DB及构建Docker镜像实践
数据库·docker·容器
楓叶子18 小时前
K8S部署
云原生·容器·kubernetes