
在 Kubernetes 上部署高可用 WordPress 站点:完整指南
本文详细阐述了在 Kubernetes 集群中部署高可用 WordPress 站点的全流程。方案采用 Nginx 与 PHP-FPM 解耦架构,实现应用与数据库分离,并利用 Kubernetes 原生资源(Deployment、StatefulSet、ConfigMap、Ingress 等)进行编排与管理,确保应用具备优秀的可扩展性、可维护性与数据持久化能力。
一、构建自定义 WordPress 镜像
为了满足生产环境对性能与可控性的要求,我们基于 CentOS 7 构建包含 Nginx 和 PHP-FPM 的自定义镜像。
1. 准备应用代码与配置
下载 WordPress 中文版源码,并修改配置文件以支持环境变量注入。
# 下载并解压代码 wget --no-check-certificate https://cn.wordpress.org/wordpress-6.0-zh_CN.tar.gz tar xf wordpress-6.0-zh_CN.tar.gz cd wordpress # 复制配置文件模板 cp wp-config-sample.php wp-config.php
编辑 wp-config.php,将数据库连接参数替换为占位符,并配置安全密钥。
// ** MySQL 设置 - 具体信息请参考您正在使用的信息 ** //
/** WordPress 数据库的名称 */
define( 'DB_NAME', '{DB_NAME}' );
/** MySQL 数据库用户名 */
define( 'DB_USER', '{DB_USER}' );
/** MySQL 数据库密码 */
define( 'DB_PASSWORD', '{DB_PASSWORD}' );
/** MySQL 主机 */
define( 'DB_HOST', '{DB_HOST}' );
/** 创建数据表时默认的文字编码 */
define( 'DB_CHARSET', 'utf8mb4' );
/** 数据库整理类型。如不确定请勿更改 */
define( 'DB_COLLATE', '' );
/**
* 身份验证密钥和盐
* 请访问 https://api.wordpress.org/secret-key/1.1/salt/ 生成新的密钥
*/
define('AUTH_KEY', 'put your unique phrase here');
define('SECURE_AUTH_KEY', 'put your unique phrase here');
define('LOGGED_IN_KEY', 'put your unique phrase here');
define('NONCE_KEY', 'put your unique phrase here');
define('AUTH_SALT', 'put your unique phrase here');
define('SECURE_AUTH_SALT', 'put your unique phrase here');
define('LOGGED_IN_SALT', 'put your unique phrase here');
define('NONCE_SALT', 'put your unique phrase here');2. 编写 Dockerfile
构建镜像时,建议将 RPM 依赖包预先下载至本地,以提高构建速度并确保离线部署能力。
FROM centos:7
ENV Web_Dir="/usr/share/nginx/html"
# 复制本地 RPM 依赖包并安装
RUN mkdir /download
COPY ./download/*.rpm /download/
RUN rpm -ivh --nodeps --force /download/*.rpm &&
rm -rf /download/*.rpm
# 复制应用代码
COPY . ${Web_Dir}
# 创建用户并配置 Nginx、PHP-FPM
RUN useradd -M www &&
sed -i '/^user/c user www;' /etc/nginx/nginx.conf &&
sed -i '/^user/c user = www' /etc/php-fpm.d/www.conf &&
sed -i '/^group/c group = www' /etc/php-fpm.d/www.conf &&
chown -R www.www ${Web_Dir} /var/lib/nginx/
EXPOSE 80
# 复制并设置启动脚本
COPY ./entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh
ENTRYPOINT ["bash", "-c", "/entrypoint.sh"]3. 准备启动脚本
编写 entrypoint.sh,在容器启动时动态替换配置文件中的环境变量。
#!/bin/bash
# entrypoint.sh
Wordpress_File=/usr/share/nginx/html/wp-config.php
# 使用 sed 替换配置占位符,采用 | 作为分隔符以兼容特殊字符
sed -i "s|{DB_NAME}|${DB_NAME:-wordpress}|g" ${Wordpress_File}
sed -i "s|{DB_USER}|${DB_USER:-wordpress}|g" ${Wordpress_File}
sed -i "s|{DB_PASSWORD}|${DB_PASSWORD:-wordpress}|g" ${Wordpress_File}
sed -i "s|{DB_HOST}|${DB_HOST:-localhost}|g" ${Wordpress_File}
# 启动 PHP-FPM 和 Nginx
php-fpm && nginx -g "daemon off;"4. 构建并推送镜像
docker build -t your-registry.com/library/wordpress:v6.0 . docker push your-registry.com/library/wordpress:v6.0
二、部署 MySQL 数据库
生产环境推荐使用 StatefulSet 管理 MySQL,以保障数据的持久性与网络标识的稳定性。
1. 创建 MySQL 配置
通过 ConfigMap 管理 MySQL 配置文件,优化数据库参数。
apiVersion: v1 kind: ConfigMap metadata: name: mysql-config data: my.cnf: | [mysqld] max_connections = 1000 key_buffer_size = 256M max_allowed_packet = 64M innodb_buffer_pool_size = 1G character-set-server = utf8mb4 collation-server = utf8mb4_unicode_ci
2. 部署 StatefulSet
使用 StatefulSet 部署 MySQL,并挂载 PVC 实现数据持久化。
apiVersion: v1 kind: Service metadata: name: mysql-svc spec: clusterIP: None # Headless Service selector: app: mysql ports: - port: 3306 targetPort: 3306 --- apiVersion: apps/v1 kind: StatefulSet metadata: name: mysql spec: serviceName: mysql-svc replicas: 1 selector: matchLabels: app: mysql template: metadata: labels: app: mysql spec: containers: - name: db image: mysql:5.7 env: - name: MYSQL_ROOT_PASSWORD value: "YourStrongPassword123" # 请替换为强密码 - name: MYSQL_DATABASE value: wordpress ports: - containerPort: 3306 volumeMounts: - name: data mountPath: /var/lib/mysql - name: mysqlconf mountPath: /etc/mysql/conf.d/my.cnf subPath: my.cnf volumes: - name: mysqlconf configMap: name: mysql-config volumeClaimTemplates: - metadata: name: data spec: storageClassName: "nfs-client" # 替换为集群支持的 StorageClass accessModes: - ReadWriteOnce resources: requests: storage: 20Gi
3. 对接外部数据库(可选方案)
若使用集群外部的 MySQL,可创建 Service 和 Endpoints 将其映射至集群内部。
apiVersion: v1 kind: Service metadata: name: mysql-external spec: ports: - port: 3306 targetPort: 3306 clusterIP: None --- apiVersion: v1 kind: Endpoints metadata: name: mysql-external # 名称必须与 Service 一致 subsets: - addresses: - ip: 192.168.1.100 # 外部 MySQL IP ports: - port: 3306
三、准备 WordPress 运行配置
1. 配置 Nginx
创建 Nginx 配置文件,修复原配置中的正则匹配错误,正确处理 PHP 请求。
server {
listen 80;
server_name _;
root /usr/share/nginx/html;
index index.php;
location / {
try_files $uri $uri/ /index.php?$args;
}
# 修正:使用 $ 结尾精确匹配 .php 文件
location ~ .php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
location ~* .(js|css|png|jpg|jpeg|gif|ico|svg)$ {
expires max;
log_not_found off;
}
}基于该文件创建 ConfigMap:
kubectl create configmap nginx-wp-conf --from-file=wp.conf
2. 管理敏感信息
使用 Secret 存储数据库连接凭证,避免硬编码。
apiVersion: v1 kind: Secret metadata: name: wordpress-secret type: Opaque stringData: DB_NAME: "wordpress" DB_USER: "root" DB_PASSWORD: "YourStrongPassword123" # 需与数据库密码一致 DB_HOST: "mysql-0.mysql-svc.default.svc.cluster.local" # 集群内部地址 # 若使用外部数据库,DB_HOST 请填写: mysql-external
四、持久化存储与部署
1. 创建 PVC
为 WordPress 上传目录提供持久化存储,支持多 Pod 共享(ReadWriteMany)。
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: wordpress-data spec: storageClassName: "nfs-client" # 需支持 RWX 模式 accessModes: - ReadWriteMany resources: requests: storage: 10Gi
2. 部署 WordPress 应用
apiVersion: apps/v1 kind: Deployment metadata: name: wordpress spec: replicas: 2 selector: matchLabels: app: wordpress template: metadata: labels: app: wordpress spec: containers: - name: wordpress image: your-registry.com/library/wordpress:v6.0 imagePullPolicy: IfNotPresent ports: - containerPort: 80 envFrom: - secretRef: name: wordpress-secret volumeMounts: - name: nginx-config mountPath: /etc/nginx/conf.d/ - name: uploads-data mountPath: /usr/share/nginx/html/wp-content/uploads/ volumes: - name: nginx-config configMap: name: nginx-wp-conf - name: uploads-data persistentVolumeClaim: claimName: wordpress-data --- apiVersion: v1 kind: Service metadata: name: wordpress-svc spec: selector: app: wordpress ports: - port: 80 targetPort: 80 type: ClusterIP
五、服务发布
通过 Ingress 将服务暴露至外部,实现域名访问。
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: wordpress-ingress spec: ingressClassName: nginx rules: - host: "www.ipipp.com" http: paths: - path: / pathType: Prefix backend: service: name: wordpress-svc port: number: 80
六、部署验证
按顺序应用资源清单:
# 部署数据库 kubectl apply -f mysql-config.yaml kubectl apply -f 01-mysql.yaml # 部署应用 kubectl apply -f nginx-config.yaml kubectl apply -f wordpress-secret.yaml kubectl apply -f wordpress-pvc.yaml kubectl apply -f wordpress-deployment.yaml kubectl apply -f wordpress-ingress.yaml
验证资源状态:
kubectl get pods,svc,ingress,pvc
配置域名解析至 Ingress 入口后,访问域名即可完成 WordPress 的安装与初始化。通过此架构,您将获得一个高可用、易维护且数据安全的站点环境。