k8s经典实战—搭建WordPress

本文详细介绍了如何在Kubernetes(K8s)环境中搭建WordPress网站,包括LNMP环境的部署,MySQL数据库的配置,使用NFS共享存储,以及通过Harbor仓库管理镜像等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

                          k8s经典实战—搭建WordPress
说明:需要在k8s上部署lnmp环境,建议跟着步骤来端口最好不要改,希望你也能搭建成功,完成这个搭建后你对Kubernetes的技术基本上是入门了。首先看下效果图:

 

一、部署存储用户持久化存储

1. 准备一块100G磁盘做为LVM逻辑卷(参考:https://www.cnblogs.com/Dev0ps/p/9381244.html)

fdisk -l
fdisk /dev/vdb
mkdir /u01
pvcreate /dev/vdb1
vgcreate vg0 /dev/vdb1
lvcreate -L 99G -n oralv vg0
mkfs.ext4 /dev/vg0/oralv
mount /dev/vg0/oralv /u01/
echo "/dev/vg0/oralv                   /u01                       ext4    defaults        0 0" >>/etc/fstab

 用df -h 命令查看:


2、搭建NFS共享存储
2.1 nfs服务端

yum install nfs-utils -y
mkdir -pv /u01/nps/volumes
vim /etc/exports
/u01/nps/volumes    172.31.182.0/24(rw,no_root_squash)  
systemctl start nfs

 查看服务是否开启


2.2 创建nps挂载目录

mkdir -pv /u01/nps/volumes/data{mysql,nginx}

2.3 nfs客户端(k8s的node节点都需要安装)

yum install nfs-utils -y

#验证是否可以访问nfs服务端

[root@node01 ~]# showmount -e 172.31.182.145
Export list for 172.31.182.145:
/u01/nps/volumes 172.31.182.0/24
[root@node01 ~]# mount -t nfs 172.31.182.145:/u01/nps/volumes /mnt
echo "172.31.182.145:/u01/nps/volumes                   /mnt                       nfs    defaults        0 0" >>/etc/fstab

 二、创建pv

[root@master Dockerfile-lnmp]# cat pv.yaml

apiVersion: v1
kind: PersistentVolume
metadata:
  name: mysql-pv
spec:
  capacity:
    storage: 20Gi
  accessModes:
    - ReadWriteMany
  nfs:
    path: /u01/nps/volumes/data/mysql
    server: 172.31.182.145
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: wp-pv01
spec:
  capacity:
    storage: 5Gi
  accessModes:
    - ReadWriteMany
  nfs:
    path: /u01/nps/volumes/data/nginx
    server: 172.31.182.145
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: wp-pv02
spec:
  capacity:
    storage: 5Gi
  accessModes:
    - ReadWriteMany
  nfs:
    path: /u01/nps/volumes/data/nginx
    server: 172.31.182.145

创建pv:

kubectl apply -f pv.yaml    

三、部署mysql

3.1 创建mysql-deployment

[root@master Dockerfile-lnmp]# cat mysql-deployment.yaml
apiVersion: v1
kind: Service
metadata:
  name: wordpress-mysql
  labels:
    app: wordpress
spec:
  ports:
    - port: 3306
  selector:
    app: wordpress
    tier: mysql
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mysql-pv-claim
  labels:
    app: wordpress
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 20Gi
---
apiVersion: apps/v1beta2
kind: Deployment
metadata:
  name: wordpress-mysql
  labels:
    app: wordpress
spec:
  selector:
    matchLabels:
      app: wordpress
      tier: mysql
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: wordpress
        tier: mysql
    spec:
      containers:
      - name: mysql
    spec:
      containers:
      - name: mysql
        image: mysql:5.6
        env:
        - name: MYSQL_ROOT_PASSWORD
          valueFrom:
            secretKeyRef:
              name: mysql-pass
              key: password
        ports:
        - containerPort: 3306
          name: mysql
        volumeMounts:
        - mountPath: "/var/lib/mysql"
          name: mysql-data
      volumes:
      - name: mysql-data
        persistentVolumeClaim:
          claimName: mysql-pv-claim

创建mysql容器:

kubectl apply -f mysql-deployment.yaml  

3.2 通过secret创建mysql密码

kubectl create secret generic mysql-pass --from-literal=password=123456

四、上传镜像到Harbor

4.1 构建nginx镜像并上传

[root@master nginx]# docker build -t 172.31.182.143/dev/nginx:latest .
[root@master nginx]# docker push 172.31.182.143/dev/nginx:latest

4.2 构建php镜像并上传

[root@master php]# docker build -t 172.31.182.143/dev/php:latest .
[root@master php]# docker push 172.31.182.143/dev/php:latest

4.3 kubernetes配置Harbor仓库

kubectl create secret docker-registry regcred --docker-server=172.31.182.143 --docker-username=admin --docker-password=Harbor%12345 --docker-email=admin@qq.com

五、部署php环境

5.1 创建php-deployment
[root@master Dockerfile-lnmp]# cat php-deployment.yaml

apiVersion: v1
kind: Service
metadata:
  name: wordpress-php
  labels:
    app: wordpress
spec:
  ports:
    - port: 9000
  selector:
    app: wordpress-php
    tier: frontend
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: wp-pvc01
  labels:
    app: wordpress
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 5Gi
---
apiVersion: apps/v1beta2
kind: Deployment
metadata:
  name: wordpress-php
  labels:
    app: wordpress
spec:
  replicas: 3
  selector:
    matchLabels:
      app: wordpress-php
      tier: frontend
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: wordpress-php
        tier: frontend
    spec:
      imagePullSecrets:
      - name: regcred
      containers:
      - name: php
        image: 172.31.182.143/dev/php:latest
        ports:
        - containerPort: 9000
          name: wordpress
        volumeMounts:
        - name: php-data
          mountPath: "/usr/local/nginx/html"
      volumes:
      - name: php-data
        persistentVolumeClaim:
          claimName: wp-pvc01

创建php容器:

kubectl apply -f php-deployment.yaml       

六、部署nginx环境

6.1 创建nginx-deployment
[root@master Dockerfile-lnmp]# cat nginx-deployment.yaml

apiVersion: v1
kind: ConfigMap
metadata:
  name: nginx-wp-config
data:
  site.conf: |-
    server {
        listen 80;
        server_name localhost;
        root html;
        index index.php index.html;

        location ~ \.php$ {
            root html;
            fastcgi_pass wordpress-php:9000;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            include fastcgi_params;
        }
    }
---
apiVersion: v1
kind: Service
metadata:
  name: wordpress-nginx
  labels:
    app: wordpress
spec:
  ports:
    - port: 80
  selector:
    app: wordpress-nginx
    tier: frontend
  type: NodePort
  sessionAffinity: ClientIP
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: wp-pvc02
  labels:
    app: wordpress
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 5Gi
---
apiVersion: apps/v1beta2
kind: Deployment
metadata:
  name: wordpress-nginx
  labels:
    app: wordpress
spec:
  replicas: 3
  selector:
    matchLabels:
      app: wordpress-nginx
      tier: frontend
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: wordpress-nginx
        tier: frontend
    spec:
      imagePullSecrets:
      - name: regcred
      containers:
      - name: nginx
        image: 172.31.182.143/dev/nginx:latest
        ports:
        - containerPort: 80
          name: wordpress
        volumeMounts:
        - mountPath: "/usr/local/nginx/html"
          name: nginx-data
        - mountPath: "/usr/local/nginx/conf/vhost/site.conf"
          name: config
          subPath: site.conf
      volumes:
      - name: nginx-data
        persistentVolumeClaim:
          claimName: wp-pvc02
      - name: config
        configMap:
          name: nginx-wp-config

创建nginx容器:

kubectl apply -f nginx-deployment.yaml 

七、查看pod,svc,pv,pvc,secret的状态

7.1 kubectl get pod


7.2 kubectl get svc

我这里wordpress-nginx的NodePort随机生成是47074,访问时改为你们自己生成的即可!!
7.3 kubectl get pv,pvc

7.4  kubectl get secret

八、创建wordpress数据库

[root@master nginx]# kubectl exec -it wordpress-mysql-68cb6cc5b4-xxfhh bash

root@wordpress-mysql-68cb6cc5b4-xxfhh:/# mysql -uroot -p123456
Warning: Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 105
Server version: 5.6.43 MySQL Community Server (GPL)

Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> create database wordpress;

九、设置WordPress

9.1 解压WordPress安装包到nginx的挂载目录下:


访问地址为:http://nodeIP:nodePort//wordpress/index.php

9.2 配置相关信息,这里注意数据库主机就是mysql的service:wordpress-mysql

9.3 提交后设置账号密码,一个熟悉的wordpress就出现在我们面前,啧啧啧。。。

搭建博客用到的yaml文件及安装包可在以下地址获取:https://github.com/hejianlai/Docker-Kubernetes/tree/master/Kubernetes/Project/k8s_wordporss





 

转载于:https://www.cnblogs.com/Dev0ps/p/10759116.html

<think>好的,我现在需要解决用户在Kubernetes环境中运行WordPress时遇到的数据库连接错误问题。用户提到的是“Error establishing a database connection”,也就是建立数据库连接时出错。首先,我应该回忆一下常见的WordPress数据库连接错误的原因,并结合Kubernetes的环境特点来排查。 根据用户提供的引用内容,常规的WordPress数据库错误可能包括数据库密码错误、数据库服务不可用、配置错误等。但在Kubernetes环境中,可能还涉及到容器网络问题、服务发现、持久化存储配置等问题。我需要逐步分析可能的原因,并给出对应的解决方案。 首先,检查数据库配置是否正确。在Kubernetes中,通常会将数据库连接信息通过环境变量或ConfigMap传递给WordPress容器。需要确认WordPress的配置文件(如wp-config.php)中的数据库主机名、用户名、密码是否正确。例如,如果数据库作为另一个服务部署在Kubernetes集群内,主机名应该是服务名称,而不是localhost。例如,如果数据库服务名是mysql-service,那么主机名应该是这个名称,并且端口是否正确。 其次,检查数据库服务是否正常运行。在K8s中,可以通过kubectl命令查看数据库Pod的状态,确保其处于Running状态,并且没有重启次数过多的情况。同时,检查数据库的日志,查看是否有启动错误或连接问题。例如,使用kubectl logs <mysql-pod-name>来查看日志。 第三,网络连接问题。在Kubernetes中,服务之间的通信依赖于Service和DNS解析。需要确认WordPress的Pod是否能够正确解析数据库服务的DNS名称,并且网络策略允许流量通过。例如,使用kubectl exec进入WordPress的Pod,然后尝试通过telnet或nc命令连接数据库服务的端口,检查连通性。 第四,资源限制问题。如果数据库Pod的资源(如CPU、内存)不足,可能导致数据库服务不可用。需要检查资源使用情况,调整资源请求和限制。 第五,持久化存储问题。如果数据库使用Persistent Volume,需要确认存储卷是否正确挂载,并且有足够的空间。存储问题可能导致数据库无法启动或崩溃。 第六,检查数据库用户权限。确保WordPress使用的数据库用户具有正确的权限,允许从WordPress Pod的IP地址或服务名称进行连接。在MySQL中可能需要创建用户并授权,例如: CREATE USER 'wordpress'@'%' IDENTIFIED BY 'password'; GRANT ALL PRIVILEGES ON wordpress.* TO 'wordpress'@'%'; FLUSH PRIVILEGES; 第七,检查数据库是否崩溃或需要修复。有时候数据库表损坏可能导致连接问题,可以尝试进入数据库Pod运行mysqlcheck进行修复。 另外,在Kubernetes中,如果使用StatefulSet或有状态的部署,需要确保数据库的持久化卷声明(PVC)正确绑定,并且存储类(StorageClass)配置正确。 最后,如果问题间歇性出现,可能是由于数据库连接数达到上限,或者网络延迟导致超时。可以调整WordPress数据库连接配置,增加超时时间,或者在数据库端调整最大连接数。 总结下来,步骤可能包括验证配置、检查服务状态、测试网络连通性、审查资源使用、检查存储、验证权限,以及可能的数据库修复。需要逐步排除这些可能性,找到具体原因。</think>### Kubernetes中WordPress数据库连接错误的解决方案 #### 1. 检查数据库连接配置 - **确认环境变量/ConfigMap配置** 在Kubernetes部署WordPress时,通常通过环境变量设置数据库信息。检查Deployment或StatefulSet中的以下参数: ```yaml env: - name: WORDPRESS_DB_HOST value: "mysql-service" # 数据库服务名称 - name: WORDPRESS_DB_USER value: "wordpress" - name: WORDPRESS_DB_PASSWORD valueFrom: secretKeyRef: name: mysql-secret # 密码应从Secret读取 key: password ``` - **关键点**:`WORDPRESS_DB_HOST`应为Kubernetes中MySQL服务的名称(如`mysql-service`),而非`localhost`[^3]。 - **手动验证配置文件** 进入WordPress Pod检查`wp-config.php`: ```bash kubectl exec -it <wordpress-pod-name> -- cat /var/www/html/wp-config.php ``` 确认`DB_HOST`、`DB_USER`、`DB_PASSWORD`与Kubernetes中设置的Secret一致[^3]。 #### 2. 检查数据库服务状态 - **确认MySQL Pod状态** ```bash kubectl get pods -l app=mysql ``` - 若状态非`Running`,查看日志: ```bash kubectl logs <mysql-pod-name> ``` 常见问题:初始化失败、持久化卷挂载错误[^4]。 - **验证Service和Endpoint** ```bash kubectl describe service mysql-service kubectl get endpoints mysql-service ``` - 确保Endpoint列出的IP与MySQL Pod IP一致。若无IP,说明服务选择器(selector)与Pod标签不匹配。 #### 3. 测试网络连通性 - **从WordPress Pod发起连接测试** ```bash kubectl exec -it <wordpress-pod-name> -- sh # 安装telnet工具(Alpine镜像) apk add busybox-extras telnet mysql-service 3306 ``` - 若连接失败,检查: - 网络策略(NetworkPolicy)是否阻止流量 - 防火墙规则(如云厂商安全组) - 数据库是否监听所有接口(MySQL需配置`bind-address: 0.0.0.0`)。 #### 4. 检查数据库权限与用户 - **登录MySQL验证用户权限** ```bash kubectl exec -it <mysql-pod-name> -- mysql -u root -p ``` 执行以下SQL: ```sql SHOW GRANTS FOR 'wordpress'@'%'; -- 预期输出应包含GRANT ALL PRIVILEGES ON wordpress.* ``` - 若权限不足,重新授权: ```sql CREATE DATABASE wordpress; CREATE USER 'wordpress'@'%' IDENTIFIED BY 'your_password'; GRANT ALL PRIVILEGES ON wordpress.* TO 'wordpress'@'%'; FLUSH PRIVILEGES; ``` #### 5. 资源与存储问题排查 - **检查资源限制** 查看MySQL Pod是否因OOM(内存不足)被终止: ```bash kubectl describe pod <mysql-pod-name> ``` - 调整资源限制: ```yaml resources: requests: memory: "512Mi" cpu: "250m" limits: memory: "1Gi" cpu: "500m" ``` - **持久化卷(PVC)状态** ```bash kubectl get pvc kubectl describe pvc <mysql-pvc-name> ``` - 若PVC处于`Pending`状态,检查StorageClass配置或存储配额。 #### 6. 数据库修复与重启 - **修复损坏的数据库表** ```bash kubectl exec -it <mysql-pod-name> -- mysqlcheck -u root -p --auto-repair wordpress ``` - **重启数据库服务** ```bash kubectl delete pod <mysql-pod-name> # 触发Pod重建 ```[^4] #### 7. 高级调试:Sidecar容器监控 - **部署临时诊断工具** 在WordPress Pod中添加临时Sidecar容器: ```yaml containers: - name: debug-tools image: nicolaka/netshoot command: ["sleep", "3600"] ``` 使用`kubectl exec`进入该容器,通过`dig mysql-service`验证DNS解析,或使用`tcpdump`抓包分析连接问题。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值