使用Kubernetes部署MySQL+WordPress

news2025/2/7 12:35:02

目录

前提条件

部署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-mysql8
  labels:
    app: wordpress-mysql8
spec:
  replicas: 1
  selector:
    matchLabels:
      app: wordpress-mysql8
  template:
    metadata:
      labels:
        app: wordpress-mysql8
    spec:
      containers:
      - name: mysql8
        image: registry.cn-hangzhou.aliyuncs.com/my-common-images/mysql:8.4.3
        env:
        - name: MYSQL_ROOT_PASSWORD
          value: "your_mysql_root_password"
        - name: MYSQL_DATABASE
          value: "wordpress"
        - name: MYSQL_USER
          value: "wordpress_user"
        - name: MYSQL_PASSWORD
          value: "your_wordpress_user_password"
        ports:
        - containerPort: 3306
---
apiVersion: v1
kind: Service
metadata:
  name: wordpress-mysql8-service
  labels:
    app: wordpress-mysql8
spec:
  type: ClusterIP
  ports:
  - port: 3306
    targetPort: 3306
  selector:
    app: wordpress-mysql8
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: wordpress
  labels:
    app: wordpress
spec:
  replicas: 1
  selector:
    matchLabels:
      app: wordpress
  template:
    metadata:
      labels:
        app: wordpress
    spec:
      containers:
      - name: wordpress
        image: registry.cn-hangzhou.aliyuncs.com/my-common-images/wordpress:latest
        env:
        - name: WORDPRESS_DB_HOST
          value: wordpress-mysql8-service
        - name: WORDPRESS_DB_USER
          value: "wordpress_user"
        - name: WORDPRESS_DB_PASSWORD
          value: "your_wordpress_user_password"
        - name: WORDPRESS_DB_NAME
          value: "wordpress"
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: wordpress-service
  labels:
    app: wordpress
spec:
  type: NodePort
  ports:
  - port: 80
    targetPort: 80
  selector:
    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  # 根据需求设置存储容量,这里设置为10GB
  accessModes:
    - ReadWriteOnce
  hostPath:
    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:
    - ReadWriteOnce
  resources:
    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-data
   mountPath: /var/lib/mysql
volumes:
- name: mysql-data
 persistentVolumeClaim:
  claimName: mysql-pvc

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

apiVersion: apps/v1
kind: Deployment
metadata:
  name: wordpress-mysql8
  labels:
    app: wordpress-mysql8
spec:
  replicas: 1
  selector:
    matchLabels:
      app: wordpress-mysql8
  template:
    metadata:
      labels:
        app: wordpress-mysql8
    spec:
      containers:
      - name: mysql8
        image: registry.cn-hangzhou.aliyuncs.com/my-common-images/mysql:8.4.3
        env:
        - name: MYSQL_ROOT_PASSWORD
          value: "your_mysql_root_password"
        - name: MYSQL_DATABASE
          value: "wordpress"
        - name: MYSQL_USER
          value: "wordpress_user"
        - name: MYSQL_PASSWORD
          value: "your_wordpress_user_password"
        ports:
        - containerPort: 3306
        volumeMounts:
          - name: mysql-data
            mountPath: /var/lib/mysql
      volumes:
      - name: mysql-data
        persistentVolumeClaim:
          claimName: mysql-pvc
---
apiVersion: v1
kind: Service
metadata:
  name: wordpress-mysql8-service
  labels:
    app: wordpress-mysql8
spec:
  type: ClusterIP
  ports:
  - port: 3306
    targetPort: 3306
  selector:
    app: wordpress-mysql8
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: wordpress
  labels:
    app: wordpress
spec:
  replicas: 1
  selector:
    matchLabels:
      app: wordpress
  template:
    metadata:
      labels:
        app: wordpress
    spec:
      containers:
      - name: wordpress
        image: registry.cn-hangzhou.aliyuncs.com/my-common-images/wordpress:latest
        env:
        - name: WORDPRESS_DB_HOST
          value: wordpress-mysql8-service
        - name: WORDPRESS_DB_USER
          value: "wordpress_user"
        - name: WORDPRESS_DB_PASSWORD
          value: "your_wordpress_user_password"
        - name: WORDPRESS_DB_NAME
          value: "wordpress"
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: wordpress-service
  labels:
    app: wordpress
spec:
  type: NodePort
  ports:
  - port: 80
    targetPort: 80
  selector:
    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!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2267339.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

RabbitMQ中的异步Confirm模式:提升消息可靠性的利器

在现代分布式系统中,消息队列(Message Queue)扮演着至关重要的角色,它能够解耦系统组件、提高系统的可扩展性和可靠性。RabbitMQ作为一款广泛使用的消息队列中间件,提供了多种机制来确保消息的可靠传递。其中&#xff…

sentinel限流+其他

quick-start | Sentinel sentinel 作用 限流 熔断降级 1,限制什么 QPS 并发线程数 2,限制什么 资源,什么资源 服务,方法,接口,或者一段代码 3,实现方式 配置规则 注解 其他 Java常见5种限流…

Ubuntu 中安装 RabbitMQ 教程

简介 RabbitMq作为一款消息队列产品,它由Erlang语言开发,实现AMQP(高级消息队列协议)的开源消息中间件。 应用场景 异步处理 场景说明:用户注册后,注册信息写入数据库,再发邮件、短信通知。 …

Spark生态圈

Spark 主要用于替代Hadoop中的 MapReduce 计算模型。存储依然可以使用 HDFS,但是中间结果可以存放在内存中;调度可以使用 Spark 内置的,也可以使用更成熟的调度系统 YARN 等。 Spark有完善的生态圈: Spark Core:实现了…

AT24C02学习笔记

看手册: AT24Cxx xx代表能写入xxK bit(xx K)/8 byte 内部写周期很关键,代表每一次页写或字节写结束后时间要大于5ms(延时5ms确保完成写周期),否则时序会出错。 页写:型不同号每一页可能写入不同大小的…

119.【C语言】数据结构之快速排序(调用库函数)

目录 1.C语言快速排序的库函数 1.使用qsort函数前先包含头文件 2.qsort的四个参数 3.qsort函数使用 对int类型的数据排序 运行结果 对char类型的数据排序 运行结果 对浮点型数据排序 运行结果 2.题外话:函数名的本质 1.C语言快速排序的库函数 cplusplus网的介绍 ht…

五模型对比!Transformer-GRU、Transformer、CNN-GRU、GRU、CNN五模型多变量时间序列预测

目录 预测效果基本介绍程序设计参考资料 预测效果 基本介绍 光伏功率预测!五模型对比!Transformer-GRU、Transformer、CNN-GRU、GRU、CNN五模型多变量时间序列预测(Matlab2023b 多输入单输出) 1.程序已经调试好,替换数据集后,仅运…

利用Dockerfile构建自定义镜像

当一个系统开发完成,需要将系统打包为一个镜像文件,让docker能够运行该镜像,成为一个可以被访问的容器。 上述操作可以通过自定义镜像的方式来实现,本文章基于VMware虚拟机中安装的Centos7操作系统来完成。前面的操作步骤&#x…

喜报 | 擎创科技入围上海市优秀信创解决方案

近日,由上海市经信委组织的“2024年上海市优秀信创解决方案”征集遴选活动圆满落幕,擎创科技凭借实践经验优秀的《擎创夏洛克智能预警与应急处置解决方案》成功入选“2024年上海市优秀信创解决方案”名单。 为激发创新活力,发挥标杆作用&…

基于aspose.words组件的word bytes转pdf bytes,去除水印和解决linux中文乱码问题

详情见 https://preferdoor.top/archives/ji-yu-aspose.wordszu-jian-de-word-byteszhuan-pdf-bytes

快速排序学习优化

首先&#xff0c;上图。 ‘’’ cpp int partSort(int *a ,int left,int right) {int keyi left; //做左侧基准while(left<right){while(left<right && a[right]>a[keyi]){right--;}while(left<right && a[left]<a[keyi]){left;}swap(a[left…

搭建vue项目

一、环境准备 1、安装node node官网&#xff1a;https://nodejs.org/zh-cn 1.1、打开官网&#xff0c;选择“下载”。 1.2、选择版本号&#xff0c;选择系统&#xff0c;根据需要自行选择&#xff0c;上面是命令安装方式&#xff0c;下载是下载安装包。 1.3、检查node安装…

华为管理变革之道:管理制度创新

目录 华为崛起两大因素&#xff1a;管理制度创新和组织文化。 管理是科学&#xff0c;150年来管理史上最伟大的创新是流程 为什么要变革&#xff1f; 向世界标杆学习&#xff0c;是变革第一方法论 体系之一&#xff1a;华为的DSTE战略管理体系&#xff08;解决&#xff1a…

ASP-CMS漏洞

打开aspcms靶场 账号&#xff1a;admin 密码&#xff1a;123456 去保存抓包 在slideTextStatus1后面写上%25><%25eval(request(chr(65)))%25><%25 我们在去访问这个文件config/AspCms_Config.asp再去蚁剑连接&#xff0c;连接成功

pyqt和pycharm环境搭建

安装 python安装&#xff1a; https://www.python.org/downloads/release/python-3913/ python3.9.13 64位(记得勾选Path环境变量) pycharm安装&#xff1a; https://www.jetbrains.com/pycharm/download/?sectionwindows community免费版 换源&#xff1a; pip config se…

微服务-1 认识微服务

目录​​​​​​​ 1 认识微服务 1.1 单体架构 1.2 微服务 1.3 SpringCloud 2 服务拆分原则 2.1 什么时候拆 2.2 怎么拆 2.3 服务调用 3. 服务注册与发现 3.1 注册中心原理 3.2 Nacos注册中心 3.3 服务注册 3.3.1 添加依赖 3.3.2 配置Nacos 3.3.3 启动服务实例 …

《HelloGitHub》第 105 期

兴趣是最好的老师&#xff0c;HelloGitHub 让你对编程感兴趣&#xff01; 简介 HelloGitHub 分享 GitHub 上有趣、入门级的开源项目。 github.com/521xueweihan/HelloGitHub 这里有实战项目、入门教程、黑科技、开源书籍、大厂开源项目等&#xff0c;涵盖多种编程语言 Python、…

再生核希尔伯特空间(RKHS)上的分位回归

1. 基本定义和理论基础 1.1 再生核希尔伯特空间(RKHS) 给定一个非空集合 X \mathcal{X} X&#xff0c;一个希尔伯特空间 H \mathcal{H} H 称为再生核希尔伯特空间&#xff0c;如果存在一个函数 K : X X → R K: \mathcal{X} \times \mathcal{X} \rightarrow \mathbb{R} K…

基于单片机的血氧心率检测与报警系统研制(论文+源码)

1. 系统设计 本次课题为基于单片机的血氧心率检测与报警系统研制&#xff0c;在此设计了如图2.1所示的系统结构框图&#xff0c;整个系统包括了MAX30102心率血氧检测模块&#xff0c;DS18B20体温检测模块&#xff0c;液晶显示模块&#xff0c;按键以及主控制器stm32f103单片机…

如何在 Ubuntu 22.04 上安装并开始使用 RabbitMQ

简介 消息代理是中间应用程序&#xff0c;在不同服务之间提供可靠和稳定的通信方面发挥着关键作用。它们可以将传入的请求存储在队列中&#xff0c;并逐个提供给接收服务。通过以这种方式解耦服务&#xff0c;你可以使其更具可扩展性和性能。 RabbitMQ 是一种流行的开源消息代…