发布于2026-07-23 阅读(0)
扫一扫,手机访问
在Kubernetes上部署WordPress,整体思路其实不算复杂,但涉及的环节比较多。先梳理一下大致步骤:
下面一步步来走一遍。
首先从WordPress官网下载最新版本(这里用的是6.0中文版),解压后进入目录。
[root@testserver01 ~]# wget --no-check-certificate https://cn.wordpress.org/wordpress-6.0-zh_CN.tar.gz [root@testserver01 ~]# tar xf wordpress-6.0-zh_CN.tar.gz [root@testserver01 ~]# cd wordpress
然后需要准备wp-config.php。复制示例文件,并把数据库连接信息改成占位符变量,方便后续通过环境变量动态注入。同时Authentication的key可以保留默认生成的(生产环境建议单独生成),后续也可以通过环境变量覆盖。
[root@testserver01 wordpress]# cp wp-config-sample.php wp-config.php [root@testserver01 wordpress]# vim wp-config.php R4V}+()^]Y>db|Y8@yY-;|hemOR|VA/5MUP;h7E&yR*FVYO9a?Rq'); // ... 其余密钥省略 ... $table_prefix = 'wp_'; define( 'WP_DEBUG', false ); /* 停止编辑,开始发布 */ require_once ABSPATH . 'wp-settings.php';
构建镜像前需要安装Nginx和PHP。由于YUM安装过程中网络可能较慢,可以提前把RPM包下载到本地,再复制进镜像,这样构建更快也更稳定。
[root@testserver01 ~]# rpm -ivh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm [root@testserver01 ~]# yum install --downloadonly --downloaddir=./download nginx php71w-fpm php71w-xsl php71w php71w-ldap php71w-cli php71w-common php71w-devel php71w-gd php71w-pdo php71w-mysqL php71w-mbstring php71w-bcmath php71w-mcrypt # 如果还缺依赖包,执行下条命令 [root@testserver01 ~]# yum install --downloadonly --downloaddir=./download gcc gcc-c++ make zlib zlib-devel pcre pcre-devel libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libxml2 libxml2-devel glibc glibc-devel glib2 glib2-devel bzip2 bzip2-devel ncurses ncurses-devel curl curl-devel e2fsprogs e2fsprogs-devel krb5 krb5-devel openssl openssl-devel openldap openldap-devel nss_ldap openldap-clients postgresql-devel libxslt-devel libmcrypt libmcrypt-devel
编写Dockerfile,基于CentOS 7,将RPM包复制进去安装,再复制WordPress代码,配置Nginx和PHP-FPM的用户,最后暴露80端口,使用自定义的entrypoint脚本启动。
[root@testserver01 wordpress]# vim Dockerfile
FROM docker.m.daocloud.io/centos:7
ENV Web_Dir="/usr/share/nginx/html"
RUN mkdir /download
COPY ./download/*.rpm /download/
RUN rpm -ivh --nodeps --force /download/*.rpm
RUN rm -rf ${Web_Dir} /download/
COPY . ${Web_Dir}
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"]
启动脚本的作用是在容器启动时替换wp-config.php中的数据库连接变量,然后启动PHP-FPM和Nginx。
[root@testserver01 wordpress ]# vim entrypoint.sh
#1.替换变量
Wordpress_File=/usr/share/nginx/html/wp-config.php
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}
#2. 启动nginx php
php-fpm && \
nginx -g "daemon off;"
最后构建镜像并推送到私有仓库(Harbor)。
[root@testserver01 wordpress ]# docker build -t harbor.xxxx.com/base/wordpress:v6.0 -f Dockerfile . [root@testserver01 wordpress ]# docker push harbor.xxxx.com/base/wordpress:v6.0
数据库有两种选择:集群内跑MySQL,或者使用集群外已有的MySQL。
集群内MySQL
使用StatefulSet部署MySQL,通过Headless Service实现稳定网络标识。同时创建一个ConfigMap来配置MySQL的my.cnf参数。
[root@master01 wordpress]# cat 01-mysql.yaml
### headless
apiVersion: v1
kind: Service
metadata:
name: mysql-svc
spec:
clusterIP: None
selector:
app: mysql
ports:
- port: 3306
targetPort: 3306
---
### statefulset
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: mysql
spec:
serviceName: mysql-svc
replicas: 1
selector:
matchLabels:
app: mysql
template:
metadata:
labels:
app: mysql
spec:
nodeName: node01.xxxx.com
containers:
- name: db
image: harbor.xxxx.com/base/mysql:5.7
imagePullPolicy: Always
securityContext:
privileged: true
resources:
requests:
cpu: 1
memory: 2Gi
limits:
cpu: 2
memory: 4Gi
env:
- name: MYSQL_ROOT_PASSWORD
value: 12345678
- name: MYSQL_DATABASE
value: wordpress
ports:
- containerPort: 3306
volumeMounts:
- name: data
mountPath: /var/lib/mysql
- name: mysqlconf
mountPath: /etc/my.cnf
subPath: my.cnf
volumes:
- name: mysqlconf
configMap:
name: mysql-config
volumeClaimTemplates:
- metadata:
name: data
spec:
storageClassName: "nfs-provisioner-storage"
accessModes:
- "ReadWriteMany"
resources:
requests:
storage: "20Gi"
[root@master01 wordpress]# cat mysql_conf.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: mysql-config
data:
my.cnf: |-
[mysqld]
max_connections = 100
key_buffer_size = 32M
max_allowed_packet = 16M
thread_stack = 192K
sort_buffer_size = 256K
read_buffer_size = 256K
read_rnd_buffer_size = 256K
myisam_sort_buffer_size = 64M
innodb_buffer_pool_size = 128M
集群外部MySQL
如果不想在K8s集群内跑MySQL,也可以直接使用外部的MySQL实例。只需创建一个无头Service和一个Endpoints对象,指向外部数据库的IP和端口。
[root@harbor002 wordpress]# docker run -p3306:3306 -e "MYSQL_ROOT_PASSWORD=oldxu3957" harbor.xxxx.com/base/mysql:5.7
[root@master01 wordpress]# vim 06-external-mysql.yaml
apiVersion: v1
kind: Service
metadata:
name: mysql-external
spec:
ports:
- port: 3306
targetPort: 3306
clusterIP: None
---
apiVersion: v1
kind: Endpoints
metadata:
name: mysql-external
subsets:
- addresses:
- ip: 192.168.20.232
ports:
- port: 3306
WordPress需要Nginx解析PHP请求,所以先写一个简单的Nginx虚拟主机配置,处理静态文件和PHP转发。
[root@master01 wordpress]# cat wp.conf
server {
listen 80;
server_name _;
root /usr/share/nginx/html;
location / {
index index.php;
}
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
然后将这个配置文件挂载到集群中,使用ConfigMap来管理。
[root@master01 wordpress]# kubectl create configmap nginxconfs --from-file=./wp.conf
WordPress启动时需要知道数据库连接信息,这些敏感数据应该放在Kubernetes Secret中,而不是硬编码在镜像里。下面创建一个Secret,将数据库名、用户名、密码、主机地址都存进去。
[root@master01 wordpress]# cat 04-wp-secret.yaml apiVersion: v1 kind: Secret metadata: name: wordpress-secret stringData: DB_NAME: wordpress DB_USER: root DB_PASSWORD: oldxu3957 DB_HOST: mysql-external.default.svc.cluster.local # 这里指向外部MySQL的Service域名
WordPress的上传图片目录(wp-content/uploads)需要持久化,并且当Pod重新调度时数据不能丢失。这里使用StorageClass动态创建PVC,挂载到NFS上。
[root@master01 wordpress]# cat 03-wp-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: wordpress-data
spec:
storageClassName: "nfs-provisioner-storage"
accessModes:
- ReadWriteMany
resources:
requests:
storage: 10Gi
万事俱备,最后创建Deployment和Service。Deployment中挂载了Nginx配置的ConfigMap、图片存储的PVC,并通过Secret注入环境变量。
[root@master01 wordpress]# vim 02-wordpress.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: wordpress-deploy
spec:
replicas: 1
selector:
matchLabels:
app: wordpress
template:
metadata:
labels:
app: wordpress
spec:
containers:
- name: wordpress
image: harbor.iha vecar.com/base/wordpress:v6.0
ports:
- containerPort: 80
envFrom:
- secretRef:
name: wordpress-secret
volumeMounts:
- name: config
mountPath: /etc/nginx/conf.d/
- name: images
mountPath: /usr/share/nginx/html/wp-content/uploads/
volumes:
- name: config
configMap:
name: nginxconfs
- name: images
persistentVolumeClaim:
claimName: wordpress-data
---
apiVersion: v1
kind: Service
metadata:
name: wordpress-svc
spec:
selector:
app: wordpress
ports:
- port: 80
targetPort: 80
最后一步,通过Ingress将WordPress暴露到集群外,绑定一个域名(比如wordpress.xxxx.com)。
[root@master01 wordpress]# cat 05-wordpress-ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: wordpress-ingress
spec:
ingressClassName: "nginx"
rules:
- host: "wordpress.xxxx.com"
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: wordpress-svc
port:
number: 80
配置完成后,在浏览器访问http://wordpress.xxxx.com,就能看到WordPress的安装界面了。填写数据库信息(这里数据库已经预先创建好,直接使用root用户即可),然后完成安装。

至此,整个Kubernetes部署WordPress的流程就结束了。从镜像构建、数据库搭建、配置注入到服务发布,每一步都通过Kubernetes原生资源实现,既灵活又易于维护。如果后续需要扩展,只需要调整副本数或更新镜像即可。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8