首页 > 数据库 >k8s练习--通过NFS+PV+PVC+POD,部署一个MySQL服务,并将MySQL的数据进行持久化存储

k8s练习--通过NFS+PV+PVC+POD,部署一个MySQL服务,并将MySQL的数据进行持久化存储

时间:2024-05-27 10:28:57浏览次数:33  
标签:PV name -- MySQL master mysql Pod root

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录


前言

Kubernetes(常简称为 K8s):
是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用程序。它提供了一个强大的工具集,可以简化容器化应用程序的部署、维护和扩展,从而使开发人员和运维团队更加轻松地管理复杂的容器化工作负载。

NFS (Network File System):
NFS 是一种网络文件系统协议,允许远程计算机通过网络访问共享文件。在 Kubernetes 中,可以将 NFS 服务器挂载到集群中的多个 Pod 上,以提供持久化存储。

PV (PersistentVolume):
PV 是 Kubernetes 中的一种资源,它表示一块持久化存储的卷。PV 独立于 Pod 存在,可以被多个 Pod 使用。管理员需要先创建 PV,然后才能被 Pod 使用。

PVC (PersistentVolumeClaim):
PVC 是对 PV 的请求,用于向 Kubernetes 集群请求持久化存储资源。Pod 通过 PVC 来申请 PV,并且只有在 PVC 和 PV 匹配成功时,Pod 才能成功绑定 PV。

Pod:
Pod 是 Kubernetes 中最小的部署单元,可以包含一个或多个容器。Pod 可以使用 PVC 来请求持久化存储,并且可以将 NFS 挂载到其中的容器中,以便存储和访问数据。

MySQL:
MySQL 是一个流行的开源关系型数据库管理系统,可以在容器中运行。通过将 MySQL Pod 与 PVC 绑定,可以实现 MySQL 数据的持久化存储,即使 Pod 被删除或重启,数据仍然可以被保留。

一、实验环境

三台主机均centos7.9

Ip主机名cpu内存硬盘
192.168.10.11master1cpu双核2G40G
192.168.10.12node011cpu双核2G40G
192.168.10.13node021cpu双核2G40g

k8s集群已配置
版本 1.18.0
nfs配置在master上

结尾有所有yaml文件的详细解释

二、具体步骤

1.准备存储设备:这里使用的是NFS

所有节点都安装nfs-utils工具包和rpc-bind服务。

yum -y install nfs-utils rpcbind -y 

这里准备将NFS服务部署在master节点上,需要在master节点上提前规划好共享的目录

[root@master ~]#  vim /etc/exports 
输入 /nfsdata *(rw,sync,no_root_squash) 
:wq 保存退出

[root@master ~]#  systemctl start rpcbind 
[root@master ~]#  systemctl enable rpcbind 
[root@master ~]#  systemctl start nfs-server 
[root@master ~]#  systemctl enable nfs-server 
[root@master ~]#  showmount -e 

nfs成功部署
在这里插入图片描述

2.现在部署一个MySQL服务,并且将MySQL的数据进行持久化存储。

(1)创建PV,PVC

编写pv的yaml文件
[root@master ~]# vim mysql-pv.yaml

kind: PersistentVolume 
apiVersion: v1 
metadata: 
  name: mysql-pv 
spec: 
  accessModes: 
    - ReadWriteOnce 
  capacity: 
    storage: 1Gi 
  persistentVolumeReclaimPolicy: Retain 
  storageClassName: nfs 
  nfs:
    path: /nfsdata/mysql-pv 
    server: 192.168.10.11 

编写pvc的yaml文件
[root@master ~]# vim mysql-pvc.yaml

kind: PersistentVolumeClaim 
apiVersion: v1 
metadata: 
  name: mysql-pvc 
spec: 
  accessModes: 
    - ReadWriteOnce
  storageClassName: nfs 
  resources: 
    requests: 
      storage: 1Gi 

[root@master ~]# mkdir /nfsdata/mysql-pv
[root@master ~]# kubectl apply -f mysql-pv.yaml
创建pv

[root@master ~]# kubectl apply -f mysql-pvc.yaml
创建pvc

[root@master ~]# kubectl get pv,pvc
获得pv和pvc的信息
在这里插入图片描述

(2)部署MySQL

编写关于mysql的deployment与service的yaml文件
[root@master ~]# vim mysql.yaml

kind: Deployment
apiVersion: apps/v1
metadata:
  name: mysql
spec:
  selector:
    matchLabels:
      app: mysql
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
      - name: mysql
        image: mysql:5.7
        imagePullPolicy: IfNotPresent
        env:
        - name: MYSQL_ROOT_PASSWORD
          value: 123.com
        volumeMounts:
        - name: mysql-storage
          mountPath: /var/lib/mysql
      volumes:
      - name: mysql-storage
        persistentVolumeClaim:
          claimName: mysql-pvc 

--- 
kind: Service 
apiVersion: v1 
metadata: 
  name: mysql 
spec: 
  type: NodePort
  selector: 
    app: mysql 
  ports: 
    - port: 3306 
      targetPort: 3306 
      nodePort: 31306 

(3)在MySQL数据库中添加数据

获得pod的资源信息
[root@master ~]# kubectl get pod
在这里插入图片描述
根据获得的name登录mysql
[root@master ~]# kubectl exec -it mysql-5d86c64fc9-2294l – mysql -uroot -p123.com

mysql> SHOW DATABASES; 					//查看当前的库。
mysql> CREATE DATABASE auth;		 		//创建auth库。
mysql> USE auth; 							//选择使用auth库。 
mysql> CREATE TABLE users(user_name char(10),user_passwd char(40)); 		//创建my_id表
mysql> INSERT users values ('zhangsan','123');					 //往my_id表中,插入数据。
mysql> SELECT * FROM users; 								//查看my_id表中所有数据 

在这里插入图片描述

(4)模拟MySQ服务器节点故障

获取 Kubernetes 集群中所有 Pod 的信息,并显示更多的详细信息
[root@master ~]# kubectl get pod -o wide

在这里插入图片描述
删除pod,k8s集群会产生一个新的Pod,验证这个Pod内是否有之前数据。

[root@master ~]# kubectl delete pod mysql-5d86c64fc9-2294l 
[root@master ~]# kubectl get pod -o wide

在这里插入图片描述
根据新pod名称登录mysql查看

[root@master ~]# kubectl exec -it mysql-5d86c64fc9-vqkh7 -- mysql -u root -p123.com
mysql> show databases; 
mysql> use auth; 
mysql> show tables; 
mysql> select * from users;

可以发现数据依然存在
在这里插入图片描述

查看nfs
[root@master ~]# ls /nfsdata/mysql-pv/
在这里插入图片描述
有数据
实验完成

总结

三个yaml文件的详细解释

pv

kind: PersistentVolume:这一行指定了资源对象的类型为持久卷。
apiVersion: v1:指定了Kubernetes API的版本。
metadata: name: mysql-pv:在元数据部分定义了持久卷的名称为mysql-pv。
spec: :这个部分包含了持久卷的规格说明。
accessModes: - ReadWriteOnce:指定了持久卷的访问模式,这里是ReadWriteOnce,表示可以被单个节点挂载为读写模式访问。
capacity: storage: 1Gi:定义了持久卷的存储容量为1GB。
persistentVolumeReclaimPolicy: Retain:指定了当持久卷上的所有声明被删除后,保留持久卷的数据,需要手动处理。
storageClassName: nfs:指定了存储类型的类名为nfs,这将与存储类(StorageClass)相关联,用于动态分配持久卷。
nfs: path: /nfsdata/mysql-pv:这里指定了NFS存储的路径为/nfsdata/mysql-pv。
server: 192.168.10.11:指定了NFS服务器的地址为192.168.10.11,这是提供NFS存储的服务器地址。

pvc

kind: PersistentVolumeClaim:这一行指定了资源对象的类型为持久卷声明。
apiVersion: v1:指定了Kubernetes API的版本。
metadata: name: mysql-pvc:在元数据部分定义了持久卷声明的名称为mysql-pvc。
spec: :这个部分包含了持久卷声明的规格说明。
accessModes: - ReadWriteOnce:指定了持久卷声明的访问模式,这里是ReadWriteOnce,表示需要一个节点挂载为读写模式访问。
storageClassName: nfs:指定了存储类型的类名为nfs,这将与存储类(StorageClass)相关联,用于动态分配持久卷。
resources: requests: storage: 1Gi:定义了持久卷声明需要的存储资源,这里请求了1GB的存储容量。

mysql

Deployment部分:

kind: Deployment:指定了资源对象的类型为部署。
apiVersion: apps/v1:指定了Kubernetes API的版本。
metadata: name: mysql:在元数据部分定义了部署的名称为mysql。
spec: :这个部分包含了部署的规格说明。
selector: matchLabels: app: mysql:指定了用于选择Pod的标签。
template: metadata: labels: app: mysql:定义了Pod的模板,设置了Pod的标签。
spec: containers: - name: mysql:指定了容器的名称为mysql。
image: mysql:5.7:使用的MySQL镜像的版本。
imagePullPolicy: IfNotPresent:设置容器拉取镜像的策略为如果本地不存在才拉取。
env: - name: MYSQL_ROOT_PASSWORD value: 123.com:设置了MySQL根密码的环境变量。
volumeMounts: - name: mysql-storage mountPath: /var/lib/mysql:指定了挂载持久卷的路径。
volumes: - name: mysql-storage persistentVolumeClaim: claimName: mysql-pvc:定义了用于挂载的持久卷声明名称。

Service部分:
kind: Service:指定了资源对象的类型为服务。
apiVersion: v1:指定了Kubernetes API的版本。
metadata: name: mysql:在元数据部分定义了服务的名称为mysql。
spec: type: NodePort:定义了服务的类型为NodePort。
selector: app: mysql:指定了用于选择后端Pod的标签。
ports: - port: 3306 targetPort: 3306 nodePort: 31306:定义了服务暴露的端口以及节点端口。

以上就是今天学习的内容,通过NFS+PV+PVC+POD,部署一个MySQL服务,并将MySQL的数据进行持久化存储,希望对各位有所帮助
若有错误,请指出,见立改

标签:PV,name,--,MySQL,master,mysql,Pod,root
From: https://blog.csdn.net/lwxvgdv/article/details/139221235

相关文章

  • 单链表
    单链表是内存地址不连续排列的线性表。单链表每个结点都有两个地址,第一个位置存储数据,第二个位置存储下个结点的内存地址。classNode(object):"""单链表结点"""def__init__(self,val):#_item存储数据self.val=val#_next是下一个......
  • 修改服务器连接端口号
    一时间忘记了怎么修改我xshell连接阿里云服务器的默认端口号了,特意找了下客服,简单记录如下 您好,修改Linux云服务器ECS的远程连接端口,通常涉及SSH服务。您可以按照以下步骤操作:1.远程登录Linux实例。2.备份sshd_config文件:cp/etc/ssh/sshd_config/etc/ssh/sshd_config_bak3.......
  • 近期一次护网蓝队面试记录分享
    近期一次护网蓝队面试记录分享前言以下为近期的一次蓝队面试记录,答案为本人回答仅作参考,错误之处,多多包涵面试过程及回答自我介绍如实回答学校经历,是否参与项目,尽量简短把你参与的项目和成功说出来就行使用过哪些设备,出现误报怎么办(在校生未使用,网上搜的,背诵就行)天眼,EDR,全......
  • 响应式UI组件DevExtreme中文教程 - 工具栏的自适应模式
    DevExtreme拥有高性能的HTML5/JavaScript小部件集合,使您可以利用现代Web开发堆栈(包括React,Angular,ASP.NETCore,jQuery,Knockout等)构建交互式的Web应用程序。从Angular和Reac,到ASP.NETCore或Vue,DevExtreme包含全面的高性能和响应式UI小部件集合,可在传统Web和下一代移动应用程序中......
  • 记录一次WhatTheFuck经历
    起因很早之前就一直在维护一个git仓库,平时调研什么组件就会在里面新建一个springboot的工程用来编写示例代码。最一开始使用的是SpringInitializr,后来网站更新之后,只能生成JDK17+的工程,WhatTheFuck?近期刚从8切换到11.于是弃用并改用StartAliyun。今天调研ClickHouse,生成的......
  • MySQL8.0针对某个IP添加访问权限
    #先进入mysqlmysql-uroot-p#输入对应的密码后进入#切换数据库为mysqlusemysql;#查看现有用户信息;selectuser,hostfromuser;#如果Host有对应的IP,可以通过以下语句查询授权信息,username和host为上面对应的user,host,如果要对所有IP放开限制将host写成%即可show......
  • html解决浏览器记住密码输入框的问题
    浏览器通常会记住用户在表单中输入的信息,包括密码字段。这是通过表单的autocomplete属性来控制的。如果你希望浏览器不要记住密码字段的输入,可以设置autocomplete属性为off或new-password。以下是一个HTML表单示例,展示如何禁止浏览器记住密码字段: <!DOCTYPEhtml><htmllang......
  • 离散加工ERP做什么的
     万达宝仪表工厂ERP系不仅仅是一款软件,更是企业运营的得力助手,让我们一起来看看它如何助力您的企业。易上手的操作体验万达宝ERP系统以其高延展性和易操作性著称。我们的系统设计简洁直观,即便是初次接触ERP系统的用户也能快速上手。我们的目标是让每一位用户都能轻松管理......
  • VS Code中使用PlantUML
     安装VSCode:如果你还没有安装VSCode,请访问VSCode官网下载并安装。安装PlantUML插件:打开VSCode后,点击左侧的扩展按钮(或使用快捷键Ctrl+Shift+X)打开扩展面板。在搜索框中输入“PlantUML”,从搜索结果中找到并安装适合你需求的PlantUML插件。通常,“PlantUML”或“PlantU......
  • 怎么解决大文件跨国传输面临的问题?
    许多企业可能会涉及到大文件跨国传输场景,在进行超过1G的文件传输时,会面临一些挑战,那么哪些行业会存在这样的场景呢?以下行业或情景中比较普遍:1、跨国企业集团:跨国企业集团通常在全球范围内分布有多个分支机构或办事处,它们可能需要在不同国家之间传输大量的文件和数据,如公司财务......