前言
在当今云原生时代,Kubernetes(简称k8s)已成为容器编排的事实标准。本文将详细介绍如何在Kubernetes集群上部署WordPress内容管理系统及其依赖的MySQL数据库,实现一个高可用、可扩展的网站架构。
环境准备
在开始部署前,请确保您已具备以下条件:
- 一个运行中的Kubernetes集群(可以是Minikube、k3s或云服务商提供的托管集群)
- 已安装kubectl命令行工具并配置好集群访问权限
- 基本的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'));
// 其他配置...
维护与扩展
- 备份策略:定期备份MySQL数据库和WordPress文件
- 自动扩展:配置HPA(Horizontal Pod Autoscaler)实现自动扩缩容
- 监控:集成Prometheus和Grafana监控应用性能
- 日志收集:使用EFK(Elasticsearch+Fluentd+Kibana)堆栈收集日志
常见问题解决
- Pod启动失败:检查日志
kubectl logs <pod-name>
- 持久化存储问题:确认StorageClass配置正确
- 连接数据库失败:验证MySQL服务是否正常运行
- 性能问题:考虑添加缓存层(如Redis)
总结
通过Kubernetes部署WordPress和MySQL,我们获得了一个高可用、易于扩展的网站架构。Kubernetes提供了强大的编排能力,使得应用的部署、升级和维护变得更加简单高效。随着业务增长,您可以轻松扩展WordPress实例数量或升级MySQL配置,而无需担心停机问题。
这种部署方式特别适合需要高可用性、自动恢复和弹性扩展的生产环境,为您的WordPress网站提供了企业级的可靠性和性能保障。