导读:本期聚焦于小伙伴创作的《在 Kubernetes 上部署高可用 WordPress 站点:完整指南》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《在 Kubernetes 上部署高可用 WordPress 站点:完整指南》有用,将其分享出去将是对创作者最好的鼓励。

在 Kubernetes 上部署高可用 WordPress 站点:完整指南

在 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 的安装与初始化。通过此架构,您将获得一个高可用、易维护且数据安全的站点环境。

Kubernetes WordPress部署高可用架构容器化WordPress持久化存储生产就绪

免责声明:已尽一切努力确保本网站所含信息的准确性。网站部分内容来源于网络或由用户自行发表,内容观点不代表本站立场。本站是个人网站免费分享,内容仅供个人学习、研究或参考使用,如内容中引用了第三方作品,其版权归原作者所有。若内容触犯了您的权益,请联系我们进行处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。前端、网络、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握网站开发与运维所需的核心技术栈。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端逻辑,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。