欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 健康 > 养生 > 使用Kubernetes部署MySQL+WordPress

使用Kubernetes部署MySQL+WordPress

2025/3/11 15:40:18 来源:https://blog.csdn.net/neeef_se/article/details/144788792  浏览:    关键词:使用Kubernetes部署MySQL+WordPress

目录

前提条件

部署MySQL和WordPress

编写yaml文件

应用yaml文件

存在问题及解决方案

创建PV(持久化卷)

创建一个PVC(持久化卷声明)

部署添加PVC

查看PV对应的主机存储

删除资源

查看资源

删除deployment和service

查看主机数据

删除PVC和PV

删除主机数据


前提条件

  • 拥有Kubernetes集群环境,可参考:Kubernetes集群搭建
  • 理解Kubernetes部署知识,可参考:使用Kubernetes部署第一个应用、Deloyment控制器

部署MySQL和WordPress

编写yaml文件

部署mysql和wordpress,需要编写对应的deployment,同时需要暴露应用,需要编写对应的service。为了简便这里把这些deployment和service全部编写在同一个yaml中。

[root@k8s-master01 db8]# vi wordpress-mysql.yaml

内容如下

apiVersion: apps/v1
kind: Deployment
metadata:name: wordpress-mysql8labels:app: wordpress-mysql8
spec:replicas: 1selector:matchLabels:app: wordpress-mysql8template:metadata:labels:app: wordpress-mysql8spec:containers:- name: mysql8image: registry.cn-hangzhou.aliyuncs.com/my-common-images/mysql:8.4.3env:- name: MYSQL_ROOT_PASSWORDvalue: "your_mysql_root_password"- name: MYSQL_DATABASEvalue: "wordpress"- name: MYSQL_USERvalue: "wordpress_user"- name: MYSQL_PASSWORDvalue: "your_wordpress_user_password"ports:- containerPort: 3306
---
apiVersion: v1
kind: Service
metadata:name: wordpress-mysql8-servicelabels:app: wordpress-mysql8
spec:type: ClusterIPports:- port: 3306targetPort: 3306selector:app: wordpress-mysql8
---
apiVersion: apps/v1
kind: Deployment
metadata:name: wordpresslabels:app: wordpress
spec:replicas: 1selector:matchLabels:app: wordpresstemplate:metadata:labels:app: wordpressspec:containers:- name: wordpressimage: registry.cn-hangzhou.aliyuncs.com/my-common-images/wordpress:latestenv:- name: WORDPRESS_DB_HOSTvalue: wordpress-mysql8-service- name: WORDPRESS_DB_USERvalue: "wordpress_user"- name: WORDPRESS_DB_PASSWORDvalue: "your_wordpress_user_password"- name: WORDPRESS_DB_NAMEvalue: "wordpress"ports:- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:name: wordpress-servicelabels:app: wordpress
spec:type: NodePortports:- port: 80targetPort: 80selector:app: wordpress

注意:记得将 your_mysql_root_passwordyour_wordpress_user_password 替换为安全的自定义密码,并且根据集群的网络和安全策略进行必要的调整,如配置防火墙以允许外部访问 NodePort

应用yaml文件

[root@k8s-master01 db8]# kubectl apply -f wordpress-mysql.yaml
deployment.apps/wordpress-mysql8 created
service/wordpress-mysql8-service created
deployment.apps/wordpress created
service/wordpress-service created

查看部署,查看服务

[root@k8s-master01 db8]# kubectl get deploy
NAME READY UP-TO-DATE AVAILABLE AGE
wordpress 1/1 1 1 12s
wordpress-mysql8 1/1 1 1 12s

[root@k8s-master01 db8]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.0.0.1 443/TCP 78d
wordpress-mysql8-service ClusterIP 10.15.203.40 3306/TCP 4m56s
wordpress-service NodePort 10.10.170.192 80:32201/TCP 4m56s

看到映射的NodePort 端口为32201,每个人查到的不一样,以查到的端口为准

浏览器访问节点ip:32201

选择合适语言,这里使用English为例,点击Continue

根据提示填写信息,测试环境密码建议修改简单些,便于测试。

根据提示输入登录信息,进入WordPress主页,如下

存在问题及解决方案

存在一个问题,MySQL的数据存储在Pod中,如果过程中Pod被删除重建,MySQL的数据也被删除了,可使用PV和PVC来解决这个问题。

创建PV(持久化卷)

Kubernetes 集群中创建一个持久化卷,它代表了集群中的一块存储资源,可以是本地磁盘、网络存储等。以下是一个使用本地磁盘路径创建 PV 的示例,假设你想将数据存储在主机的/root/datatest/mysql目录下(可以根据实际情况修改这个路径):

创建PV的yaml文件

[root@k8s-master01 db8]# vi mysql-pv.yaml

内容如下

apiVersion: v1
kind: PersistentVolume
metadata:name: mysql-pv
spec:capacity:storage: 10Gi  # 根据需求设置存储容量,这里设置为10GBaccessModes:- ReadWriteOncehostPath:path: /root/datatest/mysql

创建 PV

[root@k8s-master01 db8]# kubectl apply -f mysql-pv.yaml
persistentvolume/mysql-pv created

创建一个PVC(持久化卷声明)

接下来,创建一个持久化卷声明,它用于向 Kubernetes 集群请求所需的存储资源。PVC 会与合适的 PV 进行绑定,以获取实际的存储。

[root@k8s-master01 db8]# vi mysql-pvc.yaml

内容如下

apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: mysql-pvc
spec:accessModes:- ReadWriteOnceresources:requests:storage: 8Gi  # 根据实际需求设置请求的存储容量,这里设置为8GB,应小于等于PV的容量

创建 PVC

[root@k8s-master01 db8]# kubectl apply -f mysql-pvc.yaml
persistentvolumeclaim/mysql-pvc created

部署添加PVC

修改wordpress-mysql.yaml的MySQL Deployment,在spec.template.spec.containers下的mysql8容器部分),添加以下内容:

 volumeMounts:- name: mysql-datamountPath: /var/lib/mysql
volumes:
- name: mysql-datapersistentVolumeClaim:claimName: mysql-pvc

修改后的 完整yaml文件内容如下:

apiVersion: apps/v1
kind: Deployment
metadata:name: wordpress-mysql8labels:app: wordpress-mysql8
spec:replicas: 1selector:matchLabels:app: wordpress-mysql8template:metadata:labels:app: wordpress-mysql8spec:containers:- name: mysql8image: registry.cn-hangzhou.aliyuncs.com/my-common-images/mysql:8.4.3env:- name: MYSQL_ROOT_PASSWORDvalue: "your_mysql_root_password"- name: MYSQL_DATABASEvalue: "wordpress"- name: MYSQL_USERvalue: "wordpress_user"- name: MYSQL_PASSWORDvalue: "your_wordpress_user_password"ports:- containerPort: 3306volumeMounts:- name: mysql-datamountPath: /var/lib/mysqlvolumes:- name: mysql-datapersistentVolumeClaim:claimName: mysql-pvc
---
apiVersion: v1
kind: Service
metadata:name: wordpress-mysql8-servicelabels:app: wordpress-mysql8
spec:type: ClusterIPports:- port: 3306targetPort: 3306selector:app: wordpress-mysql8
---
apiVersion: apps/v1
kind: Deployment
metadata:name: wordpresslabels:app: wordpress
spec:replicas: 1selector:matchLabels:app: wordpresstemplate:metadata:labels:app: wordpressspec:containers:- name: wordpressimage: registry.cn-hangzhou.aliyuncs.com/my-common-images/wordpress:latestenv:- name: WORDPRESS_DB_HOSTvalue: wordpress-mysql8-service- name: WORDPRESS_DB_USERvalue: "wordpress_user"- name: WORDPRESS_DB_PASSWORDvalue: "your_wordpress_user_password"- name: WORDPRESS_DB_NAMEvalue: "wordpress"ports:- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:name: wordpress-servicelabels:app: wordpress
spec:type: NodePortports:- port: 80targetPort: 80selector:app: wordpress

完成上述修改后,再次执行apply命令来更新 MySQL 的部署,使其使用映射到主机的持久化存储。

[root@k8s-master01 db8]# kubectl apply -f wordpress-mysql.yaml
deployment.apps/wordpress-mysql8 configured
service/wordpress-mysql8-service unchanged
deployment.apps/wordpress unchanged
service/wordpress-service unchanged

重新访问浏览器

节点ip:32201

重新根据提示设置WordPress,进入WordPress主页,能正常访问。

查看PV对应的主机存储

查看pod在哪台主机运行

[root@k8s-master01 db8]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
wordpress-6b69d95596-jgbnw 1/1 Running 0 53m 10.244.85.225 k8s-node01
wordpress-mysql8-64c987b8cd-vxqtk 1/1 Running 0 6m59s 10.244.85.230 k8s-node01

看到pod在k8s-node01机器运行,到对应的k8s-node01机器查看pv对应的存储目录

# 在运行pod的机器执行
[root@k8s-node01 ~]# ls /root/datatest/mysql/
‘#ib_16384_0.dblwr’ auto.cnf ca-key.pem ib_buffer_pool mysql.ibd private_key.pem sys
‘#ib_16384_1.dblwr’ binlog.000001 ca.pem ibdata1 mysql.sock public_key.pem undo_001
‘#innodb_redo’ binlog.000002 client-cert.pem ibtmp1 mysql_upgrade_history server-cert.pem undo_002
‘#innodb_temp’ binlog.index client-key.pem mysql performance_schema server-key.pem wordpress

查看到相应的MySQL卷挂载到主机的数据。

删除资源

查看资源

[root@k8s-master01 db8]# kubectl get deploy
NAME READY UP-TO-DATE AVAILABLE AGE
wordpress 1/1 1 1 81m
wordpress-mysql8 1/1 1 1 81m

[root@k8s-master01 db8]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.0.0.1 443/TCP 78d
wordpress-mysql8-service ClusterIP 10.15.203.40 3306/TCP 82m
wordpress-service NodePort 10.10.170.192 80:32201/TCP 82m

[root@k8s-master01 db8]# kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS VOLUMEATTRIBUTESCLASS REASON AGE
mysql-pv 10Gi RWO Retain Bound default/mysql-pvc 62m
mysql-pv-volume 20Gi RWO Retain Bound default/mysql-pv-claim manual 39d

[root@k8s-master01 db8]# kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS VOLUMEATTRIBUTESCLASS AGE
mysql-pv-claim Bound mysql-pv-volume 20Gi RWO manual 39d
mysql-pvc Bound mysql-pv 10Gi RWO 57m

删除deployment和service

[root@k8s-master01 db8]# kubectl delete deploy wordpress wordpress-mysql8
deployment.apps “wordpress” deleted
deployment.apps “wordpress-mysql8” deleted

[root@k8s-master01 db8]# kubectl delete svc wordpress-mysql8-service wordpress-service
service “wordpress-mysql8-service” deleted
service “wordpress-service” deleted

查看主机数据

查看PV对应的主机目录,发现数据还在

[root@k8s-node01 ~]# ls /root/datatest/mysql/
‘#ib_16384_0.dblwr’ auto.cnf ca-key.pem ib_buffer_pool mysql.sock public_key.pem undo_001
‘#ib_16384_1.dblwr’ binlog.000001 ca.pem ibdata1 mysql_upgrade_history server-cert.pem undo_002
‘#innodb_redo’ binlog.000002 client-cert.pem mysql performance_schema server-key.pem wordpress
‘#innodb_temp’ binlog.index client-key.pem mysql.ibd private_key.pem sys

删除PVC和PV

[root@k8s-master01 db8]# kubectl delete pvc mysql-pvc
persistentvolumeclaim “mysql-pvc” deleted

[root@k8s-master01 db8]# kubectl delete pv mysql-pv
persistentvolume “mysql-pv” deleted

[root@k8s-master01 db8]# kubectl get pvc
No resources found in default namespace.
[root@k8s-master01 db8]# kubectl get pv
No resources found

查看PV对应的主机目录,数据依然存在

[root@k8s-node01 ~]# ls /root/datatest/mysql/
‘#ib_16384_0.dblwr’ auto.cnf ca-key.pem ib_buffer_pool mysql.sock public_key.pem undo_001
‘#ib_16384_1.dblwr’ binlog.000001 ca.pem ibdata1 mysql_upgrade_history server-cert.pem undo_002
‘#innodb_redo’ binlog.000002 client-cert.pem mysql performance_schema server-key.pem wordpress
‘#innodb_temp’ binlog.index client-key.pem mysql.ibd private_key.pem sys

删除PV主要是从 Kubernetes 的资源管理角度进行操作,它不会自动删除主机上对应的目录。这是因为PV只是对存储资源的一种抽象和管理方式,它与主机文件系统是松耦合的。

删除主机数据

如果需要删除数据并且确认这些数据是可以删除数据,则需要手动删除卷挂载的主机数据。

[root@k8s-node01 ~]# rm -rf /root/datatest/mysql

完成!enjoy it!

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词