使用Kubernetes部署WordPress与MySQL的完整指南

来自:素雅营销研究院

头像 方知笔记
2025年05月05日 06:41

前言

在当今云原生时代,Kubernetes(简称k8s)已成为容器编排的事实标准。本文将详细介绍如何在Kubernetes集群上部署WordPress内容管理系统及其依赖的MySQL数据库,实现一个高可用、可扩展的网站架构。

环境准备

在开始部署前,请确保您已具备以下条件:

  1. 一个运行中的Kubernetes集群(可以是Minikube、k3s或云服务商提供的托管集群)
  2. 已安装kubectl命令行工具并配置好集群访问权限
  3. 基本的Kubernetes概念知识(如Pod、Deployment、Service等)

部署MySQL数据库

1. 创建MySQL Secret

我们需要创建一个Secret来安全地存储MySQL的root密码:

apiVersion: v1
kind: Secret
metadata:
name: mysql-secret
type: Opaque
data:
password: $(echo -n "yourpassword" | base64) # 替换为您的实际密码

2. 创建MySQL持久化存储

为了保证数据持久化,我们需要创建PersistentVolumeClaim:

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

3. 部署MySQL服务

创建MySQL Deployment和服务:

apiVersion: apps/v1
kind: Deployment
metadata:
name: mysql
spec:
selector:
matchLabels:
app: mysql
strategy:
type: Recreate
template:
metadata:
labels:
app: mysql
spec:
containers:
- image: mysql:5.7
name: mysql
env:
- name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-secret
key: password
ports:
- containerPort: 3306
name: mysql
volumeMounts:
- name: mysql-persistent-storage
mountPath: /var/lib/mysql
volumes:
- name: mysql-persistent-storage
persistentVolumeClaim:
claimName: mysql-pvc
---
apiVersion: v1
kind: Service
metadata:
name: mysql
spec:
ports:
- port: 3306
selector:
app: mysql
clusterIP: None

部署WordPress

1. 创建WordPress持久化存储

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

2. 部署WordPress应用

apiVersion: apps/v1
kind: Deployment
metadata:
name: wordpress
spec:
selector:
matchLabels:
app: wordpress
strategy:
type: Recreate
template:
metadata:
labels:
app: wordpress
spec:
containers:
- image: wordpress:latest
name: wordpress
env:
- name: WORDPRESS_DB_HOST
value: mysql
- name: WORDPRESS_DB_USER
value: root
- name: WORDPRESS_DB_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-secret
key: password
ports:
- containerPort: 80
name: wordpress
volumeMounts:
- name: wordpress-persistent-storage
mountPath: /var/www/html
volumes:
- name: wordpress-persistent-storage
persistentVolumeClaim:
claimName: wordpress-pvc

3. 暴露WordPress服务

apiVersion: v1
kind: Service
metadata:
name: wordpress
spec:
ports:
- port: 80
selector:
app: wordpress
type: LoadBalancer

访问WordPress

部署完成后,可以通过以下命令获取WordPress的外部访问地址:

kubectl get svc wordpress

等待EXTERNAL-IP分配后,即可通过该IP访问WordPress安装界面,完成后续配置。

高级配置选项

1. 使用Ingress暴露服务

如果集群中已安装Ingress控制器,可以创建Ingress资源替代LoadBalancer服务:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: wordpress-ingress
spec:
rules:
- host: wordpress.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: wordpress
port:
number: 80

2. 配置资源限制

为Pod添加资源限制:

resources:
requests:
memory: "256Mi"
cpu: "250m"
limits:
memory: "512Mi"
cpu: "500m"

3. 使用ConfigMap配置WordPress

可以通过ConfigMap管理WordPress的wp-config.php配置:

apiVersion: v1
kind: ConfigMap
metadata:
name: wordpress-config
data:
wp-config.php: |
<?php
define('DB_HOST', 'mysql');
define('DB_USER', 'root');
define('DB_PASSWORD', getenv('WORDPRESS_DB_PASSWORD'));
// 其他配置...

维护与扩展

  1. 备份策略:定期备份MySQL数据库和WordPress文件
  2. 自动扩展:配置HPA(Horizontal Pod Autoscaler)实现自动扩缩容
  3. 监控:集成Prometheus和Grafana监控应用性能
  4. 日志收集:使用EFK(Elasticsearch+Fluentd+Kibana)堆栈收集日志

常见问题解决

  1. Pod启动失败:检查日志kubectl logs <pod-name>
  2. 持久化存储问题:确认StorageClass配置正确
  3. 连接数据库失败:验证MySQL服务是否正常运行
  4. 性能问题:考虑添加缓存层(如Redis)

总结

通过Kubernetes部署WordPress和MySQL,我们获得了一个高可用、易于扩展的网站架构。Kubernetes提供了强大的编排能力,使得应用的部署、升级和维护变得更加简单高效。随着业务增长,您可以轻松扩展WordPress实例数量或升级MySQL配置,而无需担心停机问题。

这种部署方式特别适合需要高可用性、自动恢复和弹性扩展的生产环境,为您的WordPress网站提供了企业级的可靠性和性能保障。