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

news2025/1/8 15:34:17

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/mysql
  storageClassName: "nfs" # 存储类型选择nfs

pvc的yaml文件

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: deploy-mysql-nfs-pvc # 为pvc取一个好听的名字
  namespace: deploy-test # 命名空间名字
spec:
  accessModes:
    - ReadWriteMany # 权限为多节点读写
  storageClassName: "nfs" # 存储类型为nfs
  resources:
    requests:
      storage: 1Gi # 申请大小容量为1GB
  volumeName: 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: mysql
    targetPort: 3306 # 内部目标3306端口
    nodePort: 30306 # 外部访问集群nodeport的30306端口
  selector:
    app: mysql
  type: NodePort
  sessionAffinity: ClientIP

---

apiVersion: apps/v1
kind: StatefulSet # 创建一个StatefulSet有状态的控制器
metadata:
  name: deploy-mysql # 部署的名字
  namespace: deploy-test # 命名空间
spec:
  selector:
    matchLabels:
      app: mysql
  serviceName: "deploy-mysql-svc" # 注意指定上面的那个服务名称
  replicas: 1
  template:
    metadata:
      labels:
        app: mysql
    spec:
      terminationGracePeriodSeconds: 10
      containers:
      - args: # 新增一些启动参数
        - --character-set-server=utf8mb4
        - --collation-server=utf8mb4_unicode_ci
        - --lower_case_table_names=1
        - --default-time_zone=+8:00
        name: mysql
        # image: docker.io/library/mysql:5.7.43
        image: registry.cn-shenzhen.aliyuncs.com/xiaohh-docker/mysql:5.7.43 # 因为dockerhub上镜像经常拉取失败,所以使用此镜像
        ports:
        - containerPort: 3306 # 容器内部暴露3306端口
          name: mysql
        volumeMounts:
        - name: mysql-data # 引用pvc挂载的名字
          mountPath: /var/lib/mysql # 这个是容器内部存放数据的文件夹目录,需要挂在到pvc当中
        env:
        - name: MYSQL_ROOT_PASSWORD
          valueFrom: # mysql的密码引用上面创建的secret
            secretKeyRef:
              key: mysql_root_password
              name: mysql-password
      volumes:
      - 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-pv
  namespace: deploy-test
spec:
  capacity:
    storage: 1Gi
  accessModes:
    - ReadWriteMany
  nfs:
    server: 192.168.1.160
    path: /data/nfs/mysql
  storageClassName: "nfs"

---

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: deploy-mysql-nfs-pvc
  namespace: deploy-test
spec:
  accessModes:
    - ReadWriteMany
  storageClassName: "nfs"
  resources:
    requests:
      storage: 1Gi
  volumeName: deploy-mysql-nfs-pv

---

apiVersion: v1
data:
  mysql_root_password: cm9vdA==
kind: Secret
metadata:
  name: mysql-password
  namespace: deploy-test

---

apiVersion: v1
kind: Service
metadata:
  name: deploy-mysql-svc
  namespace: deploy-test
  labels:
    app: mysql
spec:
  ports:
  - port: 3306
    name: mysql
    targetPort: 3306
    nodePort: 30306
  selector:
    app: mysql
  type: NodePort
  sessionAffinity: ClientIP

---

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: deploy-mysql
  namespace: deploy-test
spec:
  selector:
    matchLabels:
      app: mysql
  serviceName: "deploy-mysql-svc"
  replicas: 1
  template:
    metadata:
      labels:
        app: mysql
    spec:
      terminationGracePeriodSeconds: 10
      containers:
      - args:
        - --character-set-server=utf8mb4
        - --collation-server=utf8mb4_unicode_ci
        - --lower_case_table_names=1
        - --default-time_zone=+8:00
        name: mysql
        # image: docker.io/library/mysql:5.7.43
        image: registry.cn-shenzhen.aliyuncs.com/xiaohh-docker/mysql:5.7.43
        ports:
        - containerPort: 3306
          name: mysql
        volumeMounts:
        - name: mysql-data
          mountPath: /var/lib/mysql
        env:
        - name: MYSQL_ROOT_PASSWORD
          valueFrom:
            secretKeyRef:
              key: mysql_root_password
              name: mysql-password
      volumes:
      - name: mysql-data
        persistentVolumeClaim:
          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.coloradmin.cn/o/923588.html

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

相关文章

【路由器】小米 WR30U 解锁并刷机

文章目录 解锁 ssh环境准备解锁过程 刷入 mt798x uboot简介刷入流程 刷入 ImmortalWrt简介刷入流程 刷为原厂固件参考资料 本文主要记录个人对小米 WR30U 路由器的解锁和刷机过程&#xff0c;整体步骤与 一般安装流程 类似&#xff0c;但是由于 WR30U 的解锁 ssh 和刷机的过程中…

Docker打包JDK20镜像

文章目录 Docker 打包 JDK 20镜像步骤1.下载 jdk20 压缩包2.编写 dockerfile3.打包4.验证5.创建并启动容器6.检查 Docker 打包 JDK 20镜像 步骤 1.下载 jdk20 压缩包 https://www.oracle.com/java/technologies/downloads/ 2.编写 dockerfile #1.指定基础镜像&#xff0c;并…

MongoDB Long 类型 shell 查询

场景 1、某数据ID为Long类型&#xff0c;JAVA 定义实体类 Id Long id 2、查询数据库&#xff0c;此数据存在 3、使用 shell 查询&#xff0c;查不到数据 4、JAVA代码查询Query.query 不受任何影响 分析 尝试解决&#xff08;一&#xff09; long 在 mongo中为 int64 类型…

ARM-汇编指令

一&#xff0c;map.lds文件 链接脚本文件 作用&#xff1a;给编译器进行使用&#xff0c;告诉编译器各个段&#xff0c;如何进行分布 /*输出格式&#xff1a;32位可执行程序&#xff0c;小端对齐*/ OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm",…

ELFNet: Evidential Local-global Fusion for Stereo Matching

论文地址&#xff1a;https://arxiv.org/pdf/2308.00728.pdf 源码地址&#xff1a;https://github.com/jimmy19991222/ELFNet 概述 针对现有立体匹配模型面临可靠性和跨域泛化的问题&#xff0c;本文提出了Evidential Local-global Fusion&#xff08;ELF&#xff09;框架&…

十一、内部类(2)

本章概要 为什么需要内部类 闭包与回调内部类与控制框架 继承内部类内部类可以被重写么&#xff1f;局部内部类内部类标识符 为什么需要内部类 至此&#xff0c;我们已经看到了许多描述内部类的语法和语义&#xff0c;但是这并不能同答“为什么需要内部类”这个问题。那么&a…

几个nlp的小项目(文本分类)

几个nlp的小项目(文本分类) 导入加载数据类、评测类查看数据集精确展示数据测评方法设置参数tokenizer,token化的解释对数据集进行预处理加载预训练模型进行训练设置训练模型的参数一个根据任务名获取,测评方法的函数创建预训练模型开始训练本项目的工作完成了什么任务?导…

(AcWing) 任务安排(I,II,III)

任务安排I: 有 N 个任务排成一个序列在一台机器上等待执行&#xff0c;它们的顺序不得改变。 机器会把这 N 个任务分成若干批&#xff0c;每一批包含连续的若干个任务。 从时刻 0 开始&#xff0c;任务被分批加工&#xff0c;执行第 i 个任务所需的时间是 Ti。 另外&#x…

前端基础之滚动显示

marquee滚动标签 注&#xff1a;该标签已经过时&#xff0c;被w3c弃用!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 使用样例&#xff1a; <marquee>这是个默认的marquee标签</marquee> 多条数据上下滚动&#xff1a; 代码如下&#xff1a; <body><mar…

MySQL每日一练--销售管理系统

一&#xff0c;创建数据库SaleSys 二&#xff0c;在数据库SaleSys中创建3张表 品牌信息表&#xff08;brand&#xff09; BrandId --品牌编号&#xff0c;整型&#xff0c;自动增长&#xff0c;主键BrandName --品牌名称&#xff0c;字符型&#xff0c; 唯一约束 商品表…

DBi Tech Studio Controls for .NET Crack

DBi Tech Studio Controls for .NET Crack Studio Controls for.NET为企业开发人员提供了一套全面的Windows布局和信息表示软件元素&#xff0c;面向搜索业务分析商业调度和UI表示控制器的程序员。Studio Controls for.NET包含17个免版税的.NET Windows窗体控件&#xff0c;用于…

【谷粒商城】开发篇:微服务架构搭建

项目架构搭建 创建代码仓库 步骤一&#xff1a;在gitee中创建代码仓库 步骤二&#xff1a;在IDEA中 clone 项目 clone 结果展示 项目微服务创建 商品服务、仓储服务、订单服务、优惠券服务、用户服务 商品微服务创建 商品微服务创建 使用 Spring Initializr 创建微服务 通过…

Linux:ansible自动化运维工具

环境介绍 当前所有执行权限我是在root下执行的&#xff0c;如果提示权限之类的&#xff0c;可以在每句命令前 加上 sudo ansible主服务器 192.168.0.194 另外两个客户端分别为 192.168.0.193 192.168.0.192 软件只需要在主服务器上安装&#xff0c;客户端不需…

重注微电子产业,“三大齿轮”能否带起香港经济的“第三轮”

文 | 智能相对论 作者 | 佘凯文 众所周知&#xff0c;微电子产业早已成为现代科技领域的关键钥匙&#xff0c;谁能掌握微电子产业&#xff0c;谁就能拥有全球科技领域的话语权。 从上世纪开始&#xff0c;微电子产业曾经历过几次重大转移&#xff0c;如70年代从美国转向日本…

键入网址到网页显示,期间发生了什么?

目录 1.DNS2.可靠传输 —— TCP3.远程定位 —— IP4.两点传输 —— MAC5.出口 —— 网卡6.送别者 —— 交换机&#xff08;可省略&#xff09;7.出境大门 —— 路由器8.数据包抵达服务器后9.响应过程&#xff1a;带有MAC、IP、TCP头部的完整HTTP报文&#xff1a; 1.DNS 客户端…

阿里云故障洞察提效50%,全栈可观测建设有哪些技术要点?

一分钟精华速览 全栈可观测是一种更全面、更综合和更深入的观测能力&#xff0c;能协助全面了解和监测系统的各个层面和组件&#xff0c;它不仅仅是一个技术上的概念&#xff0c;更多地是技术与业务的结合。在“以业务为导向”的大前提下&#xff0c;全栈可观测正在成为趋势。…

【项目 计网6】 4.17 TCP三次握手 4.18滑动窗口 4.19TCP四次挥手

文章目录 4.17 TCP三次握手4.18滑动窗口4.19TCP四次挥手 4.17 TCP三次握手 TCP 是一种面向连接的单播协议&#xff0c;在发送数据前&#xff0c;通信双方必须在彼此间建立一条连接。所谓的“连接”&#xff0c;其实是客户端和服务器的内存里保存的一份关于对方的信息&#xff…

数据结构入门 — 链表详解_单链表

前言 数据结构入门 — 单链表详解* 博客主页链接&#xff1a;https://blog.csdn.net/m0_74014525 关注博主&#xff0c;后期持续更新系列文章 文章末尾有源码 *****感谢观看&#xff0c;希望对你有所帮助***** 系列文章 第一篇&#xff1a;数据结构入门 — 链表详解_单链表 第…

OS 用户级线程

这个程序执行到D&#xff0c;Yield&#xff08;&#xff09;跳到204&#xff0c;然后出栈404出错

2023 ccpc 网络赛 L 题解

Problem L. Partially Free Meal 题面 官方题解 官方题解解读 w(k,x)计算部分 主席树常规做法&#xff0c;在一般主席树中多维护一个这个区间的总和就ok了 根据单调性分治求解部分 接下来我们来推导一下单调性&#xff0c;也就是题解中的 f ( 1 ) < f ( 2 ) < f ( …