加入收藏 | 设为首页 | 会员中心 | 我要投稿 威海站长网 (https://www.0631zz.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

kubernetes mysql 持久化_K8s之MySQL实现数据持久化

发布时间:2022-10-17 17:31:12 所属栏目:MySql教程 来源:互联网
导读: 1、搭建nfs存储
为了方便操作,我直接在master上搭建nfs存储。
[root@master ~]# yum -y install nfs-utils
[root@master ~]# systemctl enable rpcbind
[root@master lv]# mkdir -p /nfsd

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: apps/v1

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

mysql-6d898f8bcb-cz8gr 1/1 Running 0 20m 10.244.1.3 node01

mysql-6d898f8bcb-cz8gr 1/1 Terminating 0 25m 10.244.1.3 node01

mysql-6d898f8bcb-gp4t5 0/1 Pending 0 0s

mysql-6d898f8bcb-gp4t5 0/1 Pending 0 0s node02

mysql-6d898f8bcb-gp4t5 0/1 ContainerCreating 0 0s node02

mysql-6d898f8bcb-gp4t5 1/1 Running 0 1s 10.244.2.4 node02

9、client端访问MySQL数据库

因为我们在创建pod的yaml文件中,将其svc的端口映射类型是nodeportmysql持久化,所以,我们是可以通过访问群集内的任意主机的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)

(编辑:威海站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!