前言
在云原生时代,Kubernetes (k8s) 已成为容器编排的事实标准。本文将详细介绍如何在 Kubernetes 集群上部署 WordPress 和 MySQL,构建一个高可用、可扩展的内容管理系统。
环境准备
在开始部署前,请确保已具备以下条件:
- 可用的 Kubernetes 集群(Minikube、kubeadm 或云服务商提供的集群)
- kubectl 命令行工具已配置并能够访问集群
- 基本的 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
验证部署
- 检查 Pod 状态:
kubectl get pods
- 获取 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
故障排查
- 查看 Pod 日志:
kubectl logs <wordpress-pod-name>
- 检查 PersistentVolume 状态:
kubectl get pv
kubectl get pvc
- 进入 Pod 进行调试:
kubectl exec -it <pod-name> -- /bin/bash
总结
通过 Kubernetes 部署 WordPress 和 MySQL 提供了以下优势:
- 高可用性:通过 ReplicaSet 确保应用始终运行
- 可扩展性:轻松扩展 WordPress 实例数量
- 持久化存储:确保数据不会因容器重启而丢失
- 服务发现:Kubernetes DNS 自动解析服务名称
这种部署方式适合生产环境使用,可以根据实际需求进一步优化配置,如添加监控、日志收集和安全策略等。