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

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 本文档介绍了如何使用Kubernetes (K8s)、NFS、PersistentVolume (PV)、PersistentVolumeClaim (PVC)和Pod来部署并实现MySQL服务的数据持久化存储。Kubernetes是一个用于自动化部署、扩展和管理容器化应用的强大平台。NFS作为一种网络文件系统协议,能够使Kubernetes集群中的Pod跨节点访问共享文件。PV和PVC机制则提供了持久化的存储解决方案,确保数据即使在Pod生命周期结束后仍得以保留。

前言

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.11 | master | 1cpu双核 | 2G | 40G
192.168.10.12 | node01 | 1cpu双核 | 2G | 40G
192.168.10.13 | node02 | 1cpu双核 | 2G | 40g

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的数据进行持久化存储,希望对各位有所帮助
若有错误,请指出,见立改

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
8月前
|
关系型数据库 MySQL PHP
源码编译安装LAMP(HTTP服务,MYSQL ,PHP,以及bbs论坛)
通过以上步骤,你可以成功地在一台Linux服务器上从源码编译并安装LAMP环境,并配置一个BBS论坛(Discuz!)。这些步骤涵盖了从安装依赖、下载源代码、配置编译到安装完成的所有细节。每个命令的解释确保了过程的透明度,使即使是非专业人士也能够理解整个流程。
238 18
|
9月前
|
数据管理 关系型数据库 MySQL
数据管理服务DMS支持MySQL数据库的无锁结构变更
本文介绍了使用Sysbench准备2000万数据并进行全表字段更新的操作。通过DMS的无锁变更功能,可在不锁定表的情况下完成结构修改,避免了传统方法中可能产生的锁等待问题。具体步骤包括:准备数据、提交审批、执行变更及检查表结构,确保变更过程高效且不影响业务运行。
535 2
|
10月前
|
存储 Kubernetes 安全
k8s存储类型:emptyDir、hostPath、nfs、pvc及存储类storageclass的静态/动态创建pv
Kubernetes提供了多种存储类型,满足不同的应用需求。`emptyDir`和 `hostPath`适用于临时和宿主机存储需求,`nfs`适用于共享存储,`PersistentVolumeClaim`和 `StorageClass`实现了持久存储的灵活管理。通过理解和配置这些存储类型,可以有效提升Kubernetes集群的存储管理能力。
518 13
|
关系型数据库 MySQL Linux
Linux系统如何设置自启动服务在MySQL数据库启动后执行?
【10月更文挑战第25天】Linux系统如何设置自启动服务在MySQL数据库启动后执行?
691 3
|
关系型数据库 MySQL Linux
在 CentOS 7 中通过编译源码方式安装 MySQL 数据库的详细步骤,包括准备工作、下载源码、编译安装、配置 MySQL 服务、登录设置等。
本文介绍了在 CentOS 7 中通过编译源码方式安装 MySQL 数据库的详细步骤,包括准备工作、下载源码、编译安装、配置 MySQL 服务、登录设置等。同时,文章还对比了编译源码安装与使用 RPM 包安装的优缺点,帮助读者根据需求选择最合适的方法。通过具体案例,展示了编译源码安装的灵活性和定制性。
984 2
|
关系型数据库 MySQL 数据库
vertx 的http服务表单提交与mysql验证
本文介绍了如何使用Vert.x处理HTTP服务中的表单提交,并通过集成MySQL数据库进行验证,包括项目依赖配置、表单HTML代码和完整的Vert.x服务代码。
138 2
|
1月前
|
人工智能 算法 调度
阿里云ACK托管集群Pro版共享GPU调度操作指南
本文介绍在阿里云ACK托管集群Pro版中,如何通过共享GPU调度实现显存与算力的精细化分配,涵盖前提条件、使用限制、节点池配置及任务部署全流程,提升GPU资源利用率,适用于AI训练与推理场景。
246 1
|
1月前
|
弹性计算 监控 调度
ACK One 注册集群云端节点池升级:IDC 集群一键接入云端 GPU 算力,接入效率提升 80%
ACK One注册集群节点池实现“一键接入”,免去手动编写脚本与GPU驱动安装,支持自动扩缩容与多场景调度,大幅提升K8s集群管理效率。
228 89
|
6月前
|
资源调度 Kubernetes 调度
从单集群到多集群的快速无损转型:ACK One 多集群应用分发
ACK One 的多集群应用分发,可以最小成本地结合您已有的单集群 CD 系统,无需对原先应用资源 YAML 进行修改,即可快速构建成多集群的 CD 系统,并同时获得强大的多集群资源调度和分发的能力。
275 9
|
6月前
|
资源调度 Kubernetes 调度
从单集群到多集群的快速无损转型:ACK One 多集群应用分发
本文介绍如何利用阿里云的分布式云容器平台ACK One的多集群应用分发功能,结合云效CD能力,快速将单集群CD系统升级为多集群CD系统。通过增加分发策略(PropagationPolicy)和差异化策略(OverridePolicy),并修改单集群kubeconfig为舰队kubeconfig,可实现无损改造。该方案具备多地域多集群智能资源调度、重调度及故障迁移等能力,帮助用户提升业务效率与可靠性。

推荐镜像

更多