WordPress 数据迁移到Kubernetes (k8s)并配置持久化及网站域名修改
演示环境:http://i4t.cn 会始终保证可访问状态
架构说明
海外Nginx主要是解决域名需要备案的问题,frp为了解决家里Kubernetes集群没有公网IP,应用无法访问的问题。

WordPress镜像已经将Nginx和PHP封装在一起了,所以pod最好是运行2个,防止一个php资源请求处理不过来的问题。相关的插件安装配置最好使用一个Centos镜像用于导入导出
本次相关服务版本
- Kubernetes 1.24
- WordPress 6.2
- Mysql 8
文中使用nfs作为默认sc存储引擎,之间的搭建说过太多次了,这里就是直接使用,不讲sc的创建和nfs的相关 配置
Mysql服务创建
我们先为WordPress创建一个ns命名空间
[root@k8s-01 ~]# kubectl create ns wordpress
为mysql创建一个pvc存储
这里我已经有sc了,所以我直接创建pvc即可
[root@k8s-01 wordpress]# cat mysql-pvc.yamlapiVersion: v1kind: PersistentVolumeClaimmetadata:name: mysql-pvcnamespace: wordpressspec:accessModes:- ReadWriteOnceresources:requests:storage: 50GistorageClassName: nfs-storage
创建mysql-pvc
[root@k8s-01 wordpress]# kubectl apply -f mysql-pvc.yamlpersistentvolumeclaim/mysql-pvc created[root@k8s-01 wordpress]# kubectl get pvc -n wordpress|grep mysql-pvcmysql-pvc Bound pvc-7812e224-b4fb-4a36-be2c-0fc36e161ddc 50Gi RWO nfs-storage 18s[root@k8s-01 wordpress]#
首先先创建mysql deployment服务
[root@k8s-01 wordpress]# cat mysql-deployment.yamlapiVersion: apps/v1kind: Deploymentmetadata:name: mysqlnamespace: wordpresslabels:app: mysqlspec:replicas: 1selector:matchLabels:app: mysqltemplate:metadata:labels:app: mysqlspec:containers:- name: mysqlimage: mysql:8.0args:- --default_authentication_plugin=mysql_native_password- --character-set-server=utf8mb4- --collation-server=utf8mb4_unicode_cienv:- name: MYSQL_ROOT_PASSWORDvalue: MYSQL_ROOT_PASSWORD #mysql密码,自行修改ports:- containerPort: 3306volumeMounts:- mountPath: "/var/lib/mysql"name: mysql-datalivenessProbe:exec:command:- sh- '-c'- 'mysqladmin ping -u root -p${MYSQL_ROOT_PASSWORD}'volumes:- name: mysql-datapersistentVolumeClaim:claimName: mysql-pvc #创建mysql-pvc
进入mysql容器,开启connection_control.so插件
如果不开启,后面mysql日志会有大量警告日志
[root@k8s-01 wordpress]# kubectl exec -it -n wordpress mysql-7fddbb85bb-xzcmf bashkubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.bash-4.4# mysql -uroot -p#下面执行sql语句mysql> INSTALL PLUGIN CONNECTION_CONTROL SONAME 'connection_control.so';Query OK, 0 rows affected (0.00 sec)mysql> INSTALL PLUGIN CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS SONAME 'connection_control.so';Query OK, 0 rows affected (0.00 sec)
mysql-svc yaml文件如下
[root@k8s-01 wordpress]# cat mysql-svc.yamlapiVersion: v1kind: Servicemetadata:name: mysqlnamespace: wordpressspec:selector:app: mysqlports:- protocol: TCPport: 3306targetPort: 3306nodePort: 31306type: NodePort
创建mysql-svc
[root@k8s-01 wordpress]# vim mysql-svc.yaml[root@k8s-01 wordpress]# kubectl apply -f mysql-svc.yamlservice/mysql created[root@k8s-01 wordpress]#[root@k8s-01 wordpress]# kubectl get svc -n wordpress |grep mysqlmysql NodePort 10.102.12.169 <none> 3306:31306/TCP 6s
创建WordPress服务
接下来运行WordPress容器
为WordPress创建一个pvc
[root@k8s-01 wordpress]# cat wp-pvc.yamlapiVersion: v1kind: PersistentVolumeClaimmetadata:name: wp-pvcnamespace: wordpressspec:accessModes:- ReadWriteOnceresources:requests:storage: 50GistorageClassName: nfs-storage
接下来我们要到数据库中,创建mysql 对应库和用户数据
CREATE DATABASE abcdocker DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;create user 'i4t'@'%' identified by 'abcdocker';grant all privileges on *.* to 'i4t'@'%';#这里可以根据需求自行创建#我这里的数据库名称为abcdocker,用户为i4t
因为wordpress是php文件,后面可能会调整php的配置,我们需要为wordpress-deplpoyment创建一个configmap,用于php参数的调整
[root@k8s-01 wordpress]# cat wordpress-configmap.yamlapiVersion: v1kind: ConfigMapmetadata:name: wordpress-configmapnamespace: wordpressdata:uploads.ini: |file_uploads = Onmemory_limit 128Mupload_max_filesize 64Mpost_max_size 64Mmax_execution_time 300max_input_time 300WORDPRESS_CONFIG_EXTRA: |define('WP_MEMORY_LIMIT', '64M');@ini_set( 'upload_max_size', '64M' );@ini_set( 'post_max_size', '64M');@ini_set( 'max_execution_time', '300' );
WordPress-deployment文件如下
apiVersion: apps/v1kind: Deploymentmetadata:labels:app: wordpressname: wordpress-deploymentnamespace: wordpressspec:replicas: 1selector:matchLabels:app: wordpresstemplate:metadata:annotations:labels:app: wordpressspec:containers:- env:- name: WORDPRESS_DB_HOSTvalue: mysql- name: WORDPRESS_DB_NAMEvalue: i4t- name: WORDPRESS_DB_USERvalue: i4t- name: WORDPRESS_DB_PASSWORDvalue: MTZmYTU0Nzimage: wordpress:6.2-apacheimagePullPolicy: IfNotPresentname: wordpressports:- containerPort: 80name: wordpressprotocol: TCPvolumeMounts:- mountPath: /var/www/htmlname: wordpress-persistent-storage- mountPath: /usr/local/etc/php/conf.d/uploads.ininame: wordpress-configmapsubPath: uploads.inivolumes:- name: wordpress-persistent-storagepersistentVolumeClaim:claimName: wp-pvc- configMap:defaultMode: 420name: wordpress-configmapname: wordpress-configmap
请自行修改数据库的DB配置文件,根据需求修改
#相关变量,自行修改- name: WORDPRESS_DB_HOSTvalue: mysql- name: WORDPRESS_DB_NAMEvalue: i4t- name: WORDPRESS_DB_USERvalue: i4t- name: WORDPRESS_DB_PASSWORDvalue: MTZmYTU0Nz
svc 文件如下
[root@k8s-01 wordpress]# cat wordpress-svc.yamlapiVersion: v1kind: Servicemetadata:name: wordpress-svcnamespace: wordpressspec:selector:app: wordpressports:- protocol: TCPport: 80targetPort: 80nodePort: 31307type: NodePort
接下来我们检查所有的服务启动状态
[root@k8s-01 wordpress]# kubectl get pod,svc -n wordpressNAME READY STATUS RESTARTS AGEpod/mysql-7fddbb85bb-xzcmf 1/1 Running 0 46mpod/wordpress-deployment-5665566b9b-cm82w 1/1 Running 0 4m42sNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEservice/mysql NodePort 10.102.12.169 <none> 3306:31306/TCP 19mservice/wordpress-svc NodePort 10.98.207.64 <none> 80:31307/TCP 68s[root@k8s-01 wordpress]#[root@k8s-01 wordpress]#[root@k8s-01 wordpress]# curl 10.98.207.64 -IHTTP/1.1 302 FoundDate: Wed, 09 Aug 2023 08:00:13 GMTServer: Apache/2.4.56 (Debian)X-Powered-By: PHP/8.0.29Expires: Wed, 11 Jan 1984 05:00:00 GMTCache-Control: no-cache, must-revalidate, max-age=0X-Redirect-By: WordPressLocation: http://10.98.207.64/wp-admin/install.phpContent-Type: text/html; charset=UTF-8
使用nodeport访问测试
我这里直接访问nodeport ip:端口测试

启动Centos容器
因为默认的WordPress容器没有vim,我们的站点目录都是挂载进去的。如果后期修改php文件比较麻烦,所以我们安装一个Centos client挂载wp-pvc,后续可以直接在Centos容器修改
[root@k8s-01 wordpress]# cat centos.yamlapiVersion: apps/v1kind: Deploymentmetadata:labels:app: centosname: centos-clientnamespace: wordpressspec:replicas: 1selector:matchLabels:app: centostemplate:metadata:labels:app: centosspec:containers:- args:- while true; do sleep 30; done;command:- /bin/bash- '-c'- '--'image: centos:centos7.9.2009imagePullPolicy: IfNotPresentname: centossecurityContext:privileged: truevolumeMounts:- mountPath: /dataname: wordpress-persistent-storagevolumes:- name: wordpress-persistent-storagepersistentVolumeClaim:claimName: wp-pvc
迁移Mysql
我们从原来的服务器备份好Mysql数据,然后到新的服务器中导入进去
导入前可以drop database [业务库],把之前WordPress数据删除掉
#k8s节点安装mysql命令[root@k8s-01 tmp]# yum install -y mysql#找到sql文件[root@k8s-01 tmp]# lsi4t_20230809_163531.sql systemd-private-ecb644fe53cf473385f7a9ba14bea147-chronyd.service-ylF0Of test.sh vmware-root_733-4248680474#查看mysql svc ip[root@k8s-01 tmp]# kubectl get svc -n wordpressNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEmysql NodePort 10.102.12.169 <none> 3306:31306/TCP 129mwordpress-svc NodePort 10.98.207.64 <none> 80:31307/TCP 111m#登陆到mysql中[root@k8s-01 tmp]# mysql -uroot -p -h 10.102.12.169 -P3306Enter password:Welcome to the MariaDB monitor. Commands end with ; or g.Your MySQL connection id is 1044Server version: 8.0.34 MySQL Community Server - GPLCopyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.Type 'help;' or 'h' for help. Type 'c' to clear the current input statement.MySQL [(none)]> use i4t;Database changedMySQL [i4t]> show tables;Empty set (0.00 sec)#写入数据MySQL [i4t]> source /tmp/i4t_20230809_163531.sql;
写入完毕后
MySQL [i4t]> show tables;...| abc1_watu_master || abc1_watu_question || abc1_watu_takings || abc1_wpmailsmtp_debug_events || abc1_wpmailsmtp_tasks_meta || abc1_yarpp_related_cache || abc1_zrz_card || abc1_zrz_directmessage || abc1_zrz_invitation || abc1_zrz_message || abc1_zrz_order |+-----------------------------+49 rows in set (0.00 sec)
修改域名,需要及时修改域名,否则系统会跳转为正式环境
- 旧域名https://i4t.com
- 新域名http://i4t.cn
UPDATE wp_options SET option_value = replace(option_value, 'https://i4t.com', 'http://i4t.cn') WHERE option_name = 'home' OR option_name = 'siteurl';UPDATE wp_posts SET guid = replace(guid, 'https://i4t.com','http:// .newurl');UPDATE wp_posts SET post_content = replace(post_content, 'https://i4t.com', 'http://i4t.cn');UPDATE wp_postmeta SET meta_value = replace(meta_value,'https://i4t.com','http://i4t.cn');UPDATE wp_usermeta SET meta_value = replace(meta_value, 'https://i4t.com', 'http://i4t.cn');UPDATE wp_comments SET comment_content = REPLACE (comment_content, 'https://i4t.com', 'http://i4t.cn');UPDATE wp_comments SET comment_author_url = REPLACE (comment_author_url, 'https://i4t.com','http://i4t.cn');
迁移主题及静态文件
主题静态文件、插件、附件实际上都在我们wp-content目录下,直接将这个目录打包,然后替换到容器上就可以了。
#拷贝名称为web_i4t.com_20230809_013207.tar.gz 附件kubectl cp web_i4t.com_20230809_013207.tar.gz -n wordpress centos-client-75f686d587-lv2b2:/data/kubectl exec -it -n wordpress centos-client-75f686d587-lv2b2 bash
最终迁移访问效果图
