k8s mysql 持久化_K8s——MySQL实现数据持久化

news/2025/2/26 4:58:33

1、搭建nfs存储

[root@docker-k8s01 ~]# yum -y install nfs-utils

[root@docker-k8s01 ~]# mkdir /nfsdata/mysql -p

[root@docker-k8s01 ~]# cat /etc/exports

/nfsdata *(rw,sync,no_root_squash)

[root@docker-k8s01 ~]# systemctl restart nfs-server

[root@docker-k8s01 ~]# systemctl enable rpcbind

[root@docker-k8s01 ~]# systemctl enable nfs-server

[root@docker-k8s01 ~]# showmount -e

Export list for docker-k8s01:

/nfsdata *

2、创建PV

//编写pv的yaml文件

kind: PersistenVolume

apiVersion: v1

metadata:

name: mysql-pv

spec:

accessModes:

- ReadWriteOnce

capacity:

storage: 1Gi

persistentVolumeReclaimPolicy: Retain

storageClassName: nfs

nfs:

path: /nfsdata/mysql

server: 192.168.171.151

//执行yaml文件

[root@docker-k8s01 mysql]# kubectl apply -f mysql-pv.yaml

3、创建PVC

//编写PVC的yaml文件

kind: PersistentVolumeClaim

apiVersion: v1

metadata:

name: mysql-pvc

spec:

accessModes:

- ReadWriteOnce //访问模式定义为只能以读写的方式挂载到单个节点

resources:

requests:

storage: 1Gi

storageClassName: nfs //这里指定关联的PV名称

[root@docker-k8s01 mysql]# kubectl apply -f mysql-pvc.yaml

4、确认pv及pvc的状态

//可以看到pv及pvc的状态都是Bound

[root@docker-k8s01 mysql]# kubectl get pv

NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE

mysql-pv 1Gi RWO Retain Bound default/mysql-pvc nfs 6m21s

[root@docker-k8s01 mysql]# kubectl get pvc

NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE

mysql-pvc Bound mysql-pv 1Gi RWO nfs 2m4s

5、创建pod+svc(service)

这个pod是提供的MySQL服务,并将其映射到宿主机,可以做和client端通信

//编写deployment及service的yaml文件

---

apiVersion: extensions/v1beta1

kind: Deployment

metadata:

name: mysql

spec:

selector:

matchLabels:

app: mysql

template:

metadata:

labels:

app: mysql

spec:

containers:

- name: mysql

image: mysql:5.7

env: //配置变量,设置mysql的密码

- name: MYSQL_ROOT_PASSWORD

value: 123.com

ports:

- containerPort: 3306

volumeMounts:

- name: mysql-persistent-storage

mountPath: /var/lib/mysql //MySQL容器的数据都是存在这个目录的,要对这个目录做数据持久化

volumes:

- name: mysql-persistent-storage

persistentVolumeClaim:

claimName: mysql-pvc //指定pvc名称

---

apiVersion: v1

kind: Service

metadata:

name: mysql

spec:

type: NodePort

ports:

- port: 3306

targetPort: 31111

selector:

app: mysql

[root@docker-k8s01 mysql]# kubectl apply -f mysql-pod.yaml

//确定pod运行正常

[root@docker-k8s01 mysql]# kubectl get pod -w

NAME READY STATUS RESTARTS AGE

mysql-6d898f8bcb-fc7bb 1/1 Running 0 60s

6、进入MySQL数据库,添加测试数据

mysql> create database test;

mysql> use test

mysql> create table my_id(id int(11));

mysql> insert my_id values(1234);

mysql> select * from test.my_id; //确定数据添加成功

+------+

| id |

+------+

| 1234 |

+------+

7、手动删除节点上的容器,验证数据库内的数据是否还存在

//查看Pod运行在哪个节点

[root@docker-k8s01 mysql]# kubectl get pod -o wide

NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES

mysql-6d898f8bcb-fc7bb 1/1 Running 0 7m6s 10.244.1.2 docker-k8s02

[root@docker-k8s02 ~]# docker ps // 查看mysql容器的id

//删除mysql容器

[root@docker-k8s02 ~]# docker rm -f 7ba3f9d9ad35

//由于Deployment的保护策略,当删除容器后,它会根据pod的yaml文件生成一个新的容器,但新容器的ID号就变了

//回到master节点,登录到数据库,查看数据是否还存在

[root@docker-k8s01 mysql]# kubectl exec -it mysql-6d898f8bcb-fc7bb -- mysql -uroot -p123.com

mysql> select * from test.my_id;

+------+

| id |

+------+

| 1234 |

+------+

1 row in set (0.01 sec)

证明:当使用PV来做数据持久化的话,容器的新陈代谢并不会造成丢失数据的。

8、模拟MySQL容器所在的节点宕机,验证数据是否会丢失

//查看容器所在节点

[root@docker-k8s01 mysql]# kubectl get pod -o wide

NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES

mysql-6d898f8bcb-fc7bb 1/1 Running 0 13m 10.244.1.2 docker-k8s02

//将docker-k8s02节点宕机,动态查看Pod的状态

//大概node01关机五分钟左右,可以看到pod就被转移到node02上运行了

[root@docker-k8s01 ~]# kubectl get pod -w

NAME READY STATUS RESTARTS AGE

mysql-6d898f8bcb-fc7bb 1/1 Running 0 22m

mysql-6d898f8bcb-fc7bb 1/1 Running 0 22m

mysql-6d898f8bcb-fc7bb 1/1 Terminating 0 27m

mysql-6d898f8bcb-2h47v 0/1 Pending 0 0s

mysql-6d898f8bcb-2h47v 0/1 Pending 0 0s

mysql-6d898f8bcb-2h47v 0/1 ContainerCreating 0 0s

mysql-6d898f8bcb-2h47v 1/1 Running 0 33s

9、client端访问MySQL数据库

因为我们在创建pod的yaml文件中,将其svc的端口映射类型是nodeport,所以,我们是可以通过访问群集内的任意主机的31111端口(yaml文件中自定义的端口)来登录到数据库的。

[root@docker-k8s01 ~]# mysql -uroot -p123.com -h 192.168.171.151 -P 31111

MySQL [(none)]> select * from test.my_id; #查看数据

+------+

| id |

+------+

| 1234 |

+------+

1 row in set (0.01 sec)


http://www.niftyadmin.cn/n/4390351.html

相关文章

java导出csv文件_【干货分享】DM数据库使用UTL_FILE读写文件方法

UTL_FILE包可以用来读写操作系统上的文件,提供了在客户端操作服务器端文件的功能。它提供一套严格的使用标准操作系统文件I/O方式:OPEN、 PUT、 GET和 CLOSE操作;其中,GET方法用于读文件,PUT方法用于写文件。当用户读取…

第一章:Xamarin.Forms如何适应?(5)

安装在编写Xamarin.Forms的应用程序之前,您需要在Mac,PC或两者上安装Xamarin平台(如果您正在使用该设置)。 请参阅Xamarin网站上的文章:https://developer.xamarin.com/guides/cross-platform/getting_started/install…

linux qt界面开发_前沿资讯!使用Qt和Simulink开发基于模型的人机界面

“在传统的设计过程中,设计信息的传递和处理通常是以文本文档的形式进行的,这些文档很难理解,容易产生解释偏差。工程师从基于文本文档中手动创建嵌入式代码和数据,这导致了一个耗时且容易出错的过程。也几乎没有范围来确保更改是…

单个java类及在多个java类中对于类的成员使用的区别_干货 | 名企高频考点之谈谈你所理解的 Java 反射...

点击蓝字关注我哦以下是本期干货视频视频后还附有文字版本哦▼《名企高频考点-谈谈你所理解的 Java 反射》▼ps:请在WiFi环境下打开,如果有钱任性请随意概述Java的反射(reflection)机制是在运行状态中,对于任意一个类,都能够知道这…

mysql group by 替代_mysql中group by和order by同时使用无效的替代方案

前言最近一年由于工作需要大部分使用的都是NoSql数据库,对关系型数据库感觉越来越陌生,一个由group by和order by 引发的血案由此而生。在此做个记录,以备不时之需。需求首先,看一下整体的表结构。现在查找每个barCode中最新的数据…

c语言编译没问题 但运行之后没反应,这段代码编译联接都成功,可是运行时没反应...

这段代码编译连接都成功,可是运行时没反应啊用C语言编程实现单链表的基本操作。有必要的类型说明,并完成下述函数功能:(1)CreateList( ):逆序建立一个(带有头结点的)单链表,在键盘上按顺序输入26个大写英文字母A……Z&…

left函数未定义_关于子过程或函数未定义的问题 求大神帮忙看看

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼1、FJ?是什么啊2、find在vba里是查找,并不是像工作表函数那样。可以改成application.find或着instr(FJ,"-")3、像文本转换为数字最好就是用val函数来转换 if val(TextBox1.Text ) > val(Left(Fj, instr(F…

python循环语句选择题_python学习-7 条件语句 while循环 + 练习题

PythonPython开发Python语言python学习-7 条件语句 while循环 练习题1.死循环while 1 1:print(ok)结果是一直循环2.循环count 0while count < 10:print(count)count count 1print(error)3.练习题~ 使用while循环输出1 2 3 4 5 6 8 9 10count 1while count < 10 : #或…