Kubernetes 实战,部署 WordPress 和 MySQL 集群

来自:素雅营销研究院

头像 方知笔记
2025年07月04日 06:40

前言

在云原生时代,Kubernetes (k8s) 已成为容器编排的事实标准。本文将详细介绍如何在 Kubernetes 集群上部署 WordPress 和 MySQL,构建一个高可用、可扩展的内容管理系统。

环境准备

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

  1. 可用的 Kubernetes 集群(Minikube、kubeadm 或云服务商提供的集群)
  2. kubectl 命令行工具已配置并能够访问集群
  3. 基本的 Kubernetes 概念知识(Pod、Deployment、Service、PV/PVC 等)

部署 MySQL 数据库

1. 创建 MySQL 密码 Secret

我们需要安全地存储 MySQL 的 root 密码:

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

应用配置:

kubectl apply -f mysql-secret.yaml

2. 创建 MySQL Deployment

# mysql-deployment.yaml
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-pv-claim

3. 创建 MySQL 持久化存储

# mysql-pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: mysql-pv-volume
labels:
type: local
spec:
storageClassName: manual
capacity:
storage: 10Gi
accessModes:
- ReadWriteOnce
hostPath:
path: "/mnt/data"
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mysql-pv-claim
spec:
storageClassName: manual
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi

4. 创建 MySQL Service

# mysql-service.yaml
apiVersion: v1
kind: Service
metadata:
name: mysql
spec:
ports:
- port: 3306
selector:
app: mysql
clusterIP: None

应用所有 MySQL 配置:

kubectl apply -f mysql-pv.yaml
kubectl apply -f mysql-deployment.yaml
kubectl apply -f mysql-service.yaml

部署 WordPress

1. 创建 WordPress Deployment

# wordpress-deployment.yaml
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_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-pv-claim

2. 创建 WordPress 持久化存储

# wordpress-pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: wordpress-pv-volume
labels:
type: local
spec:
storageClassName: manual
capacity:
storage: 10Gi
accessModes:
- ReadWriteOnce
hostPath:
path: "/mnt/wordpress"
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: wordpress-pv-claim
spec:
storageClassName: manual
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi

3. 创建 WordPress Service

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

应用所有 WordPress 配置:

kubectl apply -f wordpress-pv.yaml
kubectl apply -f wordpress-deployment.yaml
kubectl apply -f wordpress-service.yaml

验证部署

  1. 检查 Pod 状态:
kubectl get pods
  1. 获取 WordPress 访问地址:
kubectl get services wordpress

如果使用 Minikube,可以通过以下命令获取访问 URL:

minikube service wordpress --url

高级配置选项

1. 使用 Ingress 暴露服务

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

2. 配置 Horizontal Pod Autoscaler

# wordpress-hpa.yaml
apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
name: wordpress-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: wordpress
minReplicas: 2
maxReplicas: 5
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 50

故障排查

  1. 查看 Pod 日志:
kubectl logs <wordpress-pod-name>
  1. 检查 PersistentVolume 状态:
kubectl get pv
kubectl get pvc
  1. 进入 Pod 进行调试:
kubectl exec -it <pod-name> -- /bin/bash

总结

通过 Kubernetes 部署 WordPress 和 MySQL 提供了以下优势:

  • 高可用性:通过 ReplicaSet 确保应用始终运行
  • 可扩展性:轻松扩展 WordPress 实例数量
  • 持久化存储:确保数据不会因容器重启而丢失
  • 服务发现:Kubernetes DNS 自动解析服务名称

这种部署方式适合生产环境使用,可以根据实际需求进一步优化配置,如添加监控、日志收集和安全策略等。