首页 > 数据库 >K8s之MySQL实现数据持久化

K8s之MySQL实现数据持久化

时间:2023-03-10 13:11:40浏览次数:50  
标签:持久 MySQL lv yaml master mysql pod K8s root

转载自:https://blog.51cto.com/u_14154700/2450932

===============

 

这个是一个只写配置及验证的博文。。。。。。

博文大纲:
1、搭建nfs存储
2、创建PV
3、创建PVC
4、确认pv及pvc的状态
5、创建pod+svc(service)
6、进入MySQL数据库,添加测试数据
7、手动删除节点上的容器,验证数据库内的数据是否还存在
8、模拟MySQL容器所在的节点宕机,验证数据是否会丢失
9、client端访问MySQL数据库

 

k8s集群环境如下:

master节点IP:192.168.20.6
node01节点IP:192.168.20.7
node02节点IP:192.168.20.8

 

k8s集群的搭建可以参考博文: K8s(Kubernetes)简介及安装部署。

1、搭建nfs存储

为了方便操作,我直接在master上搭建nfs存储。

[root@master ~]# yum -y install nfs-utils
[root@master ~]# systemctl enable rpcbind
[root@master lv]# mkdir -p /nfsdata/mysql
[root@master ~]# vim /etc/exports
/nfsdata *(rw,sync,no_root_squash)
[root@master ~]# systemctl start nfs-server
[root@master ~]# systemctl enable nfs-server
[root@master ~]# showmount -e
Export list for master:
/nfsdata *

 

2、创建PV

[root@master lv]# vim mysql-pv.yaml #编写pv的yaml文件
kind: PersistentVolume
apiVersion: v1
metadata:
name: mysql-pv
spec:
accessModes:
- ReadWriteOnce #访问模式定义为只能以读写的方式挂载到单个节点
capacity:
storage: 1Gi
persistentVolumeReclaimPolicy: Retain
storageClassName: nfs
nfs:
path: /nfsdata/mysql
server: 192.168.20.6
[root@master lv]# kubectl apply -f mysql-pv.yaml #执行yaml文件

 

3、创建PVC

[root@master lv]# vim mysql-pvc.yaml #编写pvc的yaml文件
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: mysql-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
storageClassName: nfs #这里指定关联的PV名称
[root@master lv]# kubectl apply -f mysql-pvc.yaml #执行yaml文件

 

4、确认pv及pvc的状态

至此,PV和PVC的状态类应该都是Bound。

[root@master lv]# kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
mysql-pv 1Gi RWO Retain Bound default/mysql-pvc nfs 5m8s
[root@master lv]# kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
mysql-pvc Bound mysql-pv 1Gi RWO nfs 60s

 

5、创建pod+svc(service)

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

这里我将pod和svc的yaml文件写在同一个文件中。

[root@master lv]# vim mysql-pod.yaml #编写pod的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的名称

--- #以下是创建svc的yaml文件
apiVersion: v1
kind: Service
metadata:
name: mysql
spec:
type: NodePort
ports:
- port: 3306
targetPort: 3306
nodePort: 31111
selector:
app: mysql
selector:
app: mysql
[root@master lv]# kubectl apply -f mysql-pod.yaml #执行yaml文件
[root@master lv]# kubectl get pod #确定pod运行正常
NAME READY STATUS RESTARTS AGE
mysql-6d898f8bcb-lhqxb 1/1 Running 0 51s

 

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

[root@master lv]# kubectl exec -it mysql-6d898f8bcb-lhqxb -- mysql -uroot -p123.com
mysql> create database test;
mysql> use test;
mysql> create table my_id(id int(4));
mysql> insert my_id values(9527);
mysql> select * from my_id; #确认有数据存在

 

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

[root@master lv]# kubectl get pod -o wide #查看pod运行在哪个节点
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE
mysql-6d898f8bcb-cz8gr 1/1 Running 0 10m 10.244.1.3 node01
#我这是运行在node01节点,现在去node01节点手动将其容器删除
[root@node01 ~]# docker ps #查看MySQL容器的ID
[root@node01 ~]# docker rm -f 1a524e001732 #将MySQL的容器删除
#由于Deployment的保护策略,当删除容器后,它会根据pod的yaml文件生成一个新的容器,但新容器的ID号就变了
#回到master节点,登录到数据库,查看数据是否还存在
[root@master lv]# kubectl exec -it mysql-6d898f8bcb-cz8gr -- mysql -uroot -p123.com
mysql> select * from test.my_id; #数据还在,OK
+------+
| id |
+------+
| 1996 |
+------+
1 row in set (0.01 sec)

 

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

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

[root@master lv]# kubectl get pod -o wide #查看容器所在节点,我这里还是在node01
#然后我这里将node01关机,然后动态查看pod的状态
[root@master lv]# kubectl get pod -o wide -w #动态查看pod的状态
#大概node01关机五分钟左右,可以看到pod就被转移到node02上运行了。
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
mysql-6d898f8bcb-cz8gr 1/1 Running 0 20m 10.244.1.3 node01 <none> <none>


mysql-6d898f8bcb-cz8gr 1/1 Running 0 20m 10.244.1.3 node01 <none> <none>
mysql-6d898f8bcb-cz8gr 1/1 Terminating 0 25m 10.244.1.3 node01 <none> <none>
mysql-6d898f8bcb-gp4t5 0/1 Pending 0 0s <none> <none> <none> <none>
mysql-6d898f8bcb-gp4t5 0/1 Pending 0 0s <none> node02 <none> <none>
mysql-6d898f8bcb-gp4t5 0/1 ContainerCreating 0 0s <none> node02 <none> <none>
mysql-6d898f8bcb-gp4t5 1/1 Running 0 1s 10.244.2.4 node02 <none> <none>

 

9、client端访问MySQL数据库

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

[root@master lv]# mysql -uroot -p123.com -h 192.168.20.8 -P 31111
MySQL [(none)]> select * from test.my_id; #查看数据
+------+
| id |
+------+
| 1996 |
+------+
1 row in set (0.01 sec)

———————— 本文至此结束,感谢阅读 ————————

 

标签:持久,MySQL,lv,yaml,master,mysql,pod,K8s,root
From: https://www.cnblogs.com/hd92/p/17203014.html

相关文章

  • mysql 查看无主键的表
    --mysql查看无主键的表SELECT*FROMinformation_schema.`TABLES`tLEFTJOINinformation_schema.STATISTICSsONt.TABLE_SCHEMA=s.TABLE_SCHEMAANDt.t......
  • ubuntu下mysql8安装
    一、下载MySQLATPRepository网址:https://dev.mysql.com/downloads/repo/apt/dpkg-IXXX.deb二、更新sudoaptupdatesudoaptupgrade三、安装sudoaptinstal......
  • 6.prometheus监控mysql多实例
    一、背景介绍公司采用prometheus作为监控平台,经过资料查找,mysqld_exporter和mysql是[1:1],既每个mysql实例都需要起一个exporter进程来采集mysql监控数据,不过最近看github......
  • MySQL之根据经纬度计算距离
     可以在MySQL层面使用自定义计算函数来使用CREATEDEFINER=`xxx`@`%`FUNCTION`get_distance`(lat1float,lon1float,lat2float,lon2float)RETURNSfloatSQ......
  • K8S 性能优化 - K8S APIServer 调优
    前言K8S性能优化系列文章,本文为第二篇:KubernetesAPIServer性能优化参数最佳实践。系列文章:《K8S性能优化-OSsysctl调优》参数一览kube-apiserver推荐优化......
  • mysql8.0.x-mgr组复制
    概述在mysql8.x搭建组复制,发现优化5.7.x的不展示节点类型的bug.丢弃了部分参数关于mysql停机后重启是否可以自动拉起,待研究开干envcentos7.x2c4gx3mysql-8.0.x......
  • springboot-整合mysql多数据源配置
    一、springboot+mybatis使用分包方式整合1、application.yml配置文件server:port:8080#启动端口spring:datasource:db1:#数据源1jdbc-url:j......
  • 当k8s做集群高可用的时候,需要将另一个master加入到当前master failure loading certif
      解决办法:[root@k8s-master2~]#mkdir-pv/etc/kubernetes/pkimkdir:createddirectory‘/etc/kubernetes/pki’[root@k8s-master2~]#mkdir-pv/etc/kuberne......
  • 【MYSQL】字符串操作函数(拼接、截取、替换、查找位置)
    字符串类型的函数函数用法ASCIl(S)返回字符串S中的第一个字符的ASCII码值CHAR_LENGTH(s)返回字符串s的字符数。作用与CHARACTER_LENGTH(s)相同LENGTH(s)......
  • MySQL
    目录1、初识MySQL1.1、为什么需要学数据库1.2、什么是数据库1.3、数据库分类1.4、MySQL简介1.5、安装MySQL1.6、安装SQLyog1.7、连接数据库2、操作数据库2.1、操作数据库2......