前言
在云原生時(shí)代,Kubernetes (k8s) 已成為容器編排的事實(shí)標(biāo)準(zhǔn)。本文將詳細(xì)介紹如何在 Kubernetes 集群上部署 WordPress 和 MySQL,構(gòu)建一個(gè)高可用、可擴(kuò)展的內(nèi)容管理系統(tǒng)。
環(huán)境準(zhǔn)備
在開(kāi)始部署前,請(qǐng)確保已具備以下條件:
- 可用的 Kubernetes 集群(Minikube、kubeadm 或云服務(wù)商提供的集群)
- kubectl 命令行工具已配置并能夠訪問(wèn)集群
- 基本的 Kubernetes 概念知識(shí)(Pod、Deployment、Service、PV/PVC 等)
部署 MySQL 數(shù)據(jù)庫(kù)
1. 創(chuàng)建 MySQL 密碼 Secret
我們需要安全地存儲(chǔ) MySQL 的 root 密碼:
# mysql-secret.yaml
apiVersion: v1
kind: Secret
metadata:
name: mysql-secret
type: Opaque
data:
password: $(echo -n "yourpassword" | base64) # 替換為你的密碼
應(yīng)用配置:
kubectl apply -f mysql-secret.yaml
2. 創(chuàng)建 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. 創(chuàng)建 MySQL 持久化存儲(chǔ)
# 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. 創(chuàng)建 MySQL Service
# mysql-service.yaml
apiVersion: v1
kind: Service
metadata:
name: mysql
spec:
ports:
- port: 3306
selector:
app: mysql
clusterIP: None
應(yīng)用所有 MySQL 配置:
kubectl apply -f mysql-pv.yaml
kubectl apply -f mysql-deployment.yaml
kubectl apply -f mysql-service.yaml
部署 WordPress
1. 創(chuàng)建 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. 創(chuàng)建 WordPress 持久化存儲(chǔ)
# 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. 創(chuàng)建 WordPress Service
# wordpress-service.yaml
apiVersion: v1
kind: Service
metadata:
name: wordpress
spec:
ports:
- port: 80
selector:
app: wordpress
type: LoadBalancer
應(yīng)用所有 WordPress 配置:
kubectl apply -f wordpress-pv.yaml
kubectl apply -f wordpress-deployment.yaml
kubectl apply -f wordpress-service.yaml
驗(yàn)證部署
- 檢查 Pod 狀態(tài):
kubectl get pods
- 獲取 WordPress 訪問(wèn)地址:
kubectl get services wordpress
如果使用 Minikube,可以通過(guò)以下命令獲取訪問(wèn) URL:
minikube service wordpress --url
高級(jí)配置選項(xiàng)
1. 使用 Ingress 暴露服務(wù)
# 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 狀態(tài):
kubectl get pv
kubectl get pvc
- 進(jìn)入 Pod 進(jìn)行調(diào)試:
kubectl exec -it <pod-name> -- /bin/bash
總結(jié)
通過(guò) Kubernetes 部署 WordPress 和 MySQL 提供了以下優(yōu)勢(shì):
- 高可用性:通過(guò) ReplicaSet 確保應(yīng)用始終運(yùn)行
- 可擴(kuò)展性:輕松擴(kuò)展 WordPress 實(shí)例數(shù)量
- 持久化存儲(chǔ):確保數(shù)據(jù)不會(huì)因容器重啟而丟失
- 服務(wù)發(fā)現(xiàn):Kubernetes DNS 自動(dòng)解析服務(wù)名稱
這種部署方式適合生產(chǎn)環(huán)境使用,可以根據(jù)實(shí)際需求進(jìn)一步優(yōu)化配置,如添加監(jiān)控、日志收集和安全策略等。