Kubernetes(K8S)使用PV和PVC做存储安装mysql

Kubernetes使用PV和PVC做存储安装mysql

  • 环境准备
  • 什么是PV和PVC
  • 环境准备
  • 配置nfs
    • 安装nfs
    • 配置nfs服务端
  • 创建命名空间
  • 配置pv和pvc
    • pv的yaml文件
    • pvc的yaml文件
  • 部署mysql
    • 创建mysql的root密码的secret
    • 创建mysql部署的yaml
    • 部署mysql
    • 链接mysql
      • 外部链接
      • 内部链接

环境准备

首先你需要一个k8s环境,可以参考我写的文章:https://blog.csdn.net/m0_51510236/article/details/130842122

什么是PV和PVC

我们可以简单看一下官网的描述:https://kubernetes.io/zh-cn/docs/concepts/storage/persistent-volumes/#introduction

持久卷(PersistentVolume,PV) 是集群中的一块存储,可以由管理员事先制备, 或者使用存储类(Storage Class)来动态制备。 持久卷是集群资源,就像节点也是集群资源一样。PV 持久卷和普通的 Volume 一样, 也是使用卷插件来实现的,只是它们拥有独立于任何使用 PV 的 Pod 的生命周期。 此 API 对象中记述了存储的实现细节,无论其背后是 NFS、iSCSI 还是特定于云平台的存储系统。

持久卷申领(PersistentVolumeClaim,PVC) 表达的是用户对存储的请求。概念上与 Pod 类似。 Pod 会耗用节点资源,而 PVC 申领会耗用 PV 资源。Pod 可以请求特定数量的资源(CPU 和内存);同样 PVC 申领也可以请求特定的大小和访问模式 (例如,可以要求 PV 卷能够以 ReadWriteOnce、ReadOnlyMany 或 ReadWriteMany 模式之一来挂载,参见访问模式)。

本篇文章就用上面提到的nfs来搭建pv和pvc并部署mysql

环境准备

首先我们需要搭建一个k8s集群,并且准备一台nfs服务器,为了方便我就使用k8s的主节点作为nfs服务器,服务器列表如下表:

IP地址服务器用途
192.168.1.160k8s-master,k8s的主节点和nfs服务器
192.168.1.161k8s-node01,k8s的第一个工作节点
192.168.1.162k8s-node02,k8s的第二个工作节点

配置nfs

安装nfs

首先我们需要在三台服务器单中都需要安装nfs软件包,使用如下命令进行安装:

yum install -y nfs-utils

如图三台服务器都需要安装:
在这里插入图片描述

配置nfs服务端

然后我们需要在nfs的主服务器暴露一个 /data/nfs/mysql 目录,我们需要修改 /etc/exports 配置文件,需要将这一行加在里面:

/data/nfs/mysql *(rw,sync,no_root_squash)

可以直接执行这行命令,第一行为创建这个目录,第二行为修改文件

mkdir -p /data/nfs/mysql
cat >> /etc/exports << EOF
/data/nfs/mysql *(rw,sync,no_root_squash)
EOF

然后我们需要启动nfs服务,只需要在nfs服务器上执行:

systemctl enable --now nfs-server

然后我们执行这行命令,看目录是否暴露:

showmount -e nfs服务器地址

可以看到目录暴露成功:
在这里插入图片描述

创建命名空间

我们需要创建一个命名空间,当然也可以越过这一步,这里创建命名空间的目的只是为了更接近生产环境,创建命名空间的yaml文件:

apiVersion: v1
kind: Namespace
metadata:name: deploy-test
spec: {}
status: {}

上面的yaml文件创建了一个名为 deploy-test 的命名空间,可以查看创建结果:
在这里插入图片描述

配置pv和pvc

pv的yaml文件

注意按照提示修改内容:

apiVersion: v1
kind: PersistentVolume
metadata:name: deploy-mysql-nfs-pv # pv的名字namespace: deploy-test # 这里为命名空间的名字
spec:capacity:storage: 1Gi # 申请的硬盘大小为1GB,可修改accessModes:- ReadWriteMany # 权限为多节点读写nfs:# 注意修改nfs服务器地址server: 192.168.1.160# 注意修改目录的地址path: /data/nfs/mysqlstorageClassName: "nfs" # 存储类型选择nfs

pvc的yaml文件

apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: deploy-mysql-nfs-pvc # 为pvc取一个好听的名字namespace: deploy-test # 命名空间名字
spec:accessModes:- ReadWriteMany # 权限为多节点读写storageClassName: "nfs" # 存储类型为nfsresources:requests:storage: 1Gi # 申请大小容量为1GBvolumeName: deploy-mysql-nfs-pv # 绑定的pv名字

执行后我们可以查看创建的状态:
在这里插入图片描述

部署mysql

创建mysql的root密码的secret

前面准备工作都做好了,接下来我们就可以开始部署mysql了,但是之前我们还需要创建一个secret,执行命令获取yaml文件内容:

# 命令说明
kubectl create secret generic mysql-password --from-literal=mysql_root_password=mysql的root密码 -n 命名空间 --dry-run=client -o=yaml# 命令示例
kubectl create secret generic mysql-password --from-literal=mysql_root_password=root -n deploy-test --dry-run=client -o=yaml

生成如图所示:
在这里插入图片描述

创建mysql部署的yaml

apiVersion: v1
kind: Service
metadata:name: deploy-mysql-svc # mysql暴露服务的名字namespace: deploy-test # 命名空间labels:app: mysql
spec:ports:- port: 3306 # 暴露给外部3306端口name: mysqltargetPort: 3306 # 内部目标3306端口nodePort: 30306 # 外部访问集群nodeport的30306端口selector:app: mysqltype: NodePortsessionAffinity: ClientIP---apiVersion: apps/v1
kind: StatefulSet # 创建一个StatefulSet有状态的控制器
metadata:name: deploy-mysql # 部署的名字namespace: deploy-test # 命名空间
spec:selector:matchLabels:app: mysqlserviceName: "deploy-mysql-svc" # 注意指定上面的那个服务名称replicas: 1template:metadata:labels:app: mysqlspec:terminationGracePeriodSeconds: 10containers:- args: # 新增一些启动参数- --character-set-server=utf8mb4- --collation-server=utf8mb4_unicode_ci- --lower_case_table_names=1- --default-time_zone=+8:00name: mysql# image: docker.io/library/mysql:5.7.43image: registry.cn-shenzhen.aliyuncs.com/xiaohh-docker/mysql:5.7.43 # 因为dockerhub上镜像经常拉取失败,所以使用此镜像ports:- containerPort: 3306 # 容器内部暴露3306端口name: mysqlvolumeMounts:- name: mysql-data # 引用pvc挂载的名字mountPath: /var/lib/mysql # 这个是容器内部存放数据的文件夹目录,需要挂在到pvc当中env:- name: MYSQL_ROOT_PASSWORDvalueFrom: # mysql的密码引用上面创建的secretsecretKeyRef:key: mysql_root_passwordname: mysql-passwordvolumes:- name: mysql-data # pvc的挂载名称persistentVolumeClaim:claimName: deploy-mysql-nfs-pvc # 指定使用那个pvc

部署mysql

整体的yaml文件内容为:

apiVersion: v1
kind: Namespace
metadata:name: deploy-test
spec: {}
status: {}---apiVersion: v1
kind: PersistentVolume
metadata:name: deploy-mysql-nfs-pvnamespace: deploy-test
spec:capacity:storage: 1GiaccessModes:- ReadWriteManynfs:server: 192.168.1.160path: /data/nfs/mysqlstorageClassName: "nfs"---apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: deploy-mysql-nfs-pvcnamespace: deploy-test
spec:accessModes:- ReadWriteManystorageClassName: "nfs"resources:requests:storage: 1GivolumeName: deploy-mysql-nfs-pv---apiVersion: v1
data:mysql_root_password: cm9vdA==
kind: Secret
metadata:name: mysql-passwordnamespace: deploy-test---apiVersion: v1
kind: Service
metadata:name: deploy-mysql-svcnamespace: deploy-testlabels:app: mysql
spec:ports:- port: 3306name: mysqltargetPort: 3306nodePort: 30306selector:app: mysqltype: NodePortsessionAffinity: ClientIP---apiVersion: apps/v1
kind: StatefulSet
metadata:name: deploy-mysqlnamespace: deploy-test
spec:selector:matchLabels:app: mysqlserviceName: "deploy-mysql-svc"replicas: 1template:metadata:labels:app: mysqlspec:terminationGracePeriodSeconds: 10containers:- args:- --character-set-server=utf8mb4- --collation-server=utf8mb4_unicode_ci- --lower_case_table_names=1- --default-time_zone=+8:00name: mysql# image: docker.io/library/mysql:5.7.43image: registry.cn-shenzhen.aliyuncs.com/xiaohh-docker/mysql:5.7.43ports:- containerPort: 3306name: mysqlvolumeMounts:- name: mysql-datamountPath: /var/lib/mysqlenv:- name: MYSQL_ROOT_PASSWORDvalueFrom:secretKeyRef:key: mysql_root_passwordname: mysql-passwordvolumes:- name: mysql-datapersistentVolumeClaim:claimName: deploy-mysql-nfs-pvc

执行以下命令部署:

kubectl apply -f deploy-mysql.yaml

创建结果:
在这里插入图片描述

执行下面这行命令监控部署:

watch kubectl get all -o wide -n deploy-test

看到下面这个代表创建成功:
在这里插入图片描述

当我们查看nfs当中挂在出来的mysql目录的时候:

ll /data/nfs/mysql/

文件夹内容:
在这里插入图片描述

链接mysql

外部链接

在我们创建mysql的时候我们就规定了一个NodePort端口,如图:
在这里插入图片描述

我们直接使用集群当中任意一个节点的30306端口即可链接这个数据库:

mysql -uroot -h192.168.1.160 -p -P30306

查看结果:
在这里插入图片描述

内部链接

在集群里面访问我们可以通过主机名,主机名格式如下:

<pod名称>.<service名称>.<命名空间名称>.svc.cluster.local

执行命令查看:

kubectl get all -o wide -n deploy-test

各类名称如图所示:
在这里插入图片描述

所以我们此次访问mysql的主机名如下:

deploy-mysql-0.deploy-mysql-svc.deploy-test.svc.cluster.local

我们此次就不建立其他的pod来验证是否能够安装上了,我们直接检查集群内的dns解析是否正常就知道这个域名是否正常了,使用以下命令查看k8s集群当中的dns服务的地址:

kubectl get svc -o wide -n kube-system | grep dns

查看dns服务地址:
在这里插入图片描述

直接通过 nslookup 尝试解析查看是否解析到正确的IP地址上:

# 安装nslookup命令所在的软件包
yum install -y bind-utils
# 解析域名
nslookup deploy-mysql-0.deploy-mysql-svc.deploy-test.svc.cluster.local 10.96.0.10

发现域名解析是正常的:
在这里插入图片描述

好了,k8s上部署mysql完成了,下课

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

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

相关文章

redux中间件理解,常见的中间件,实现原理。

文章目录 一、Redux中间件介绍1、什么是Redux中间件2、使用redux中间件 一、Redux中间件介绍 1、什么是Redux中间件 redux 提供了类似后端 Express 的中间件概念&#xff0c;本质的目的是提供第三方插件的模式&#xff0c;自定义拦截 action -> reducer 的过程。变为 actio…

Python 爬虫网页图片下载到本地

您可以使用Python的requests库来获取网页的源码&#xff0c;使用BeautifulSoup库来解析HTML&#xff0c;并使用urllib库来下载图片到本地。下面是一个示例代码&#xff1a; import requests from bs4 import BeautifulSoup import urllib # 获取网页源码 url https://examp…

前端面试:【前端工程化】构建工具Webpack、Parcel和Rollup

嗨&#xff0c;亲爱的前端开发者&#xff01;在现代Web开发中&#xff0c;前端工程化变得愈发重要。构建工具如Webpack、Parcel和Rollup帮助我们自动化任务、管理依赖、优化性能等。本文将深入探讨这三个前端构建工具&#xff0c;帮助你了解它们的优点和用途。 1. Webpack&…

【JavaEE基础学习打卡06】JDBC之进阶学习PreparedStatement

目录 前言一、PreparedStatement是什么二、重点理解预编译三、PreparedStatement基本使用四、Statement和PreparedStatement比较1.PreparedStatement效率高2.PreparedStatement无需拼接参数3.PreparedStatement防止SQL注入 总结 前言 &#x1f4dc; 本系列教程适用于JavaWeb初学…

SpringMVC探秘: 实现MVC模式的Web应用

文章目录 1. SpringMVC概述1.1. 什么是SpringMVC&#xff1f;1.1.1. MVC与SpringMVC 1.2. SpringMVC项目的优势 2. SpringMVC项目的创建与使用2.1. 创建SpringMVC项目2.2. 设置路由2.3. 获取参数2.3.1. 获取一个参数2.3.2. 获取多个参数2.3.3. 获取日期参数2.3.4. 参数重命名Re…

通过SSH协议连接远程服务器(Linux)

能够连接远程服务器的软件有很多&#xff0c;例如MobaXterm、Xshell、PuTTY、SecureCRT等。 以下是在Windows系统上通过SSH协议来连接Linux系统的操作过程&#xff1a; 在Linux系统上打开终端&#xff0c;输入ifconfig命令查看主机名&#xff1b;如果无法执行该命令&#xff…

mac地址、ip地址、子网掩码、端口

1. mac地址 又称为网络适配器或者网络接口卡NIC&#xff0c;但是现在更多人原因使用更简单的名称"网卡"&#xff0c;通过网卡能够是不同的计算机之间相互连接&#xff0c;从而完成数据通信的功能 每一个网卡在出厂的时候 都会给分配到一个编号&#xff0c;类似与身份…

【算法】字符匹配算法详解与代码实现

在计算机科学中&#xff0c;字符匹配算法是一种在给定文本中查找特定模式的技术。这些算法在各种应用中都发挥着重要作用&#xff0c;包括文本编辑器、搜索引擎、网络安全和生物信息学等。本文将详细介绍两种常用的字符匹配算法&#xff1a;朴素方法和KMP算法。我们还将提供Pyt…

CSS中的vertical-align属性

vertical-align 1.CSS属性 - vertical-align 2.深入理解vertical-align – line boxes This property affects the vertical positioning inside a line box of the boxes generated by an inline-levelelement. 官方文档的翻译&#xff1a;vertical-align会影响 行内块级元素…

Android | 关于 OOM 的那些事儿

作者&#xff1a;345丶 前言 Android 系统对每个app都会有一个最大的内存限制&#xff0c;如果超出这个限制&#xff0c;就会抛出 OOM&#xff0c;也就是Out Of Memory 。本质上是抛出的一个异常&#xff0c;一般是在内存超出限制之后抛出的。最为常见的 OOM 就是内存泄露(大量…

Prompt-“设计提示模板:用更少数据实现预训练模型的卓越表现,助力Few-Shot和Zero-Shot任务”

Prompt任务&#xff08;Prompt Tasks&#xff09; 通过设计提示&#xff08;prompt&#xff09;模板&#xff0c;实现使用更少量的数据在预训练模型&#xff08;Pretrained Model&#xff09;上得到更好的效果&#xff0c;多用于&#xff1a;Few-Shot&#xff0c;Zero-Shot 等…

vue中实现将页面或者div内容导出为pdf格式

将Vue单页面转成pdf并下载 步骤1&#xff1a;下载对应的库 npm install html2canvas;npm install jspdf --save 步骤2&#xff1a;创建一个htmlToPdf.js的js文件, 然后在main.js中全局引用一下&#xff0c;编写如下代码&#xff1a; // htmlToPdf.js // 导出页面为PDF格式 …

Spring Boot(Vue3+ElementPlus+Axios+MyBatisPlus+Spring Boot 前后端分离)【二】

&#x1f600;前言 本篇博文是关于Spring Boot(Vue3ElementPlusAxiosMyBatisPlusSpring Boot 前后端分离)【二】的&#xff0c;希望你能够喜欢 &#x1f3e0;个人主页&#xff1a;晨犀主页 &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是晨犀&#xff0c;希望我的文…

adb shell setprop 、开发者选项

App性能调试详解 Android App性能监控工具 更多系统属性参考 一、开启 GPU Render 的profiling bar&#xff1a; Gpu渲染速度 adb shell setprop debug.hwui.profile true adb shell setprop debug.hwui.profile visual_bars adb shell setprop debug.hwui.profile visual…

基于5G边缘网关的储能在线监测方案

近年以来&#xff0c;光伏、风力、水力发电等产业发展迅速&#xff0c;新能源在电力市场的占比持续增加&#xff0c;已经成为电力系统的重要组成部分。但由于光伏、风力、水力等发电方式存在天然的波动性&#xff0c;因此也需要配套储能、蓄能系统&#xff0c;保障新能源运行和…

股票预测和使用LSTM(长期-短期-记忆)的预测

一、说明 准确预测股市走势长期以来一直是投资者和交易员难以实现的目标。虽然多年来出现了无数的策略和模型&#xff0c;但有一种方法最近因其能够捕获历史数据中的复杂模式和依赖关系而获得了显着的关注&#xff1a;长短期记忆&#xff08;LSTM&#xff09;。利用深度学习的力…

UE4/5Niagara粒子特效之Niagara_Particles官方案例:2.4->3.2

之前的案例 UE4/5Niagara粒子特效之Niagara_Particles官方案例&#xff1a;1.1-&#xff1e;1.4_多方通行8的博客-CSDN博客 UE4/5Niagara粒子特效之Niagara_Particles官方案例&#xff1a;1.5-&#xff1e;2.3_多方通行8的博客-CSDN博客 2.4 Location Events 这次的项目和之…

VUE3封装EL-ELEMENT-PLUS input组件

VUE3封装EL-ELEMENT-PLUS input组件 完整代码 <template><div><div><div class"lable_top" v-if"label"><label :class"lable_sty">{{ label }}</label></div><el-inputv-model"inputValue&…

自动化测试之Selenium

自动化测试Selenium介绍环境搭建如何操作浏览器定位元素css类选择器定位元素xpath定位元素css选择语法xpath选择语法 常用操作添加等待打印信息浏览器更多操作键盘事件鼠标事件特殊场景只选复选框iframe标签下拉框处理弹窗显示上传文件 关闭浏览器切换窗口截图 自动化测试 自动…

JavaSE 认识String类

目录 1 创建字符串2 字符串比较相等3 字符串常量池4 理解字符串不可变5 字符、字节与字符串5.1 字符与字符串5.2 字节与字符串5.3 小结 6 字符串常见操作6.1 字符串比较6.2 字符串查找6.3 字符串替换6.4 字符串拆分6.5 字符串截取6.6 其他操作方法 7 StringBuffer 和 StringBui…