前言
在當今云原生時代,Kubernetes(簡稱k8s)已成為容器編排的事實標準。本文將詳細介紹如何在Kubernetes集群上部署WordPress內(nèi)容管理系統(tǒng)及其依賴的MySQL數(shù)據(jù)庫,實現(xiàn)一個高可用、可擴展的網(wǎng)站架構。
環(huán)境準備
在開始部署前,請確保您已具備以下條件:
- 一個運行中的Kubernetes集群(可以是Minikube、k3s或云服務商提供的托管集群)
- 已安裝kubectl命令行工具并配置好集群訪問權限
- 基本的Kubernetes概念知識(如Pod、Deployment、Service等)
部署MySQL數(shù)據(jù)庫
1. 創(chuàng)建MySQL Secret
我們需要創(chuàng)建一個Secret來安全地存儲MySQL的root密碼:
apiVersion: v1
kind: Secret
metadata:
name: mysql-secret
type: Opaque
data:
password: $(echo -n "yourpassword" | base64) # 替換為您的實際密碼
2. 創(chuàng)建MySQL持久化存儲
為了保證數(shù)據(jù)持久化,我們需要創(chuàng)建PersistentVolumeClaim:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mysql-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 5Gi
3. 部署MySQL服務
創(chuàng)建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. 創(chuàng)建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安裝界面,完成后續(xù)配置。
高級配置選項
1. 使用Ingress暴露服務
如果集群中已安裝Ingress控制器,可以創(chuàng)建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數(shù)據(jù)庫和WordPress文件
- 自動擴展:配置HPA(Horizontal Pod Autoscaler)實現(xiàn)自動擴縮容
- 監(jiān)控:集成Prometheus和Grafana監(jiān)控應用性能
- 日志收集:使用EFK(Elasticsearch+Fluentd+Kibana)堆棧收集日志
常見問題解決
- Pod啟動失敗:檢查日志
kubectl logs <pod-name>
- 持久化存儲問題:確認StorageClass配置正確
- 連接數(shù)據(jù)庫失敗:驗證MySQL服務是否正常運行
- 性能問題:考慮添加緩存層(如Redis)
總結
通過Kubernetes部署WordPress和MySQL,我們獲得了一個高可用、易于擴展的網(wǎng)站架構。Kubernetes提供了強大的編排能力,使得應用的部署、升級和維護變得更加簡單高效。隨著業(yè)務增長,您可以輕松擴展WordPress實例數(shù)量或升級MySQL配置,而無需擔心停機問題。
這種部署方式特別適合需要高可用性、自動恢復和彈性擴展的生產(chǎn)環(huán)境,為您的WordPress網(wǎng)站提供了企業(yè)級的可靠性和性能保障。