采用NFS存储卷的方式 持久化存储mysql数据目录
需求:
展示如何使用 StatefulSet 控制器运行一个有状态的应用程序。此例是多副本的 MySQL 数据库。 示例应用的拓扑结构有一个主服务器和多个副本,使用异步的基于行(Row-Based) 的数据复制。
基于K8S的StatefulSet部署MySQL集群
搭建一个“主从复制”(Maser-Slave Replication)的 MySQL 集群
存在一个主节点【master】,有多个从节点【slave】
从节点可以水平拓展
所有的写操作,只能在主节点上执行
读操作可以在所有节点上执行
一、部署NFS服务器
#服务器安装nfs服务,提供nfs存储功能
1、安装nfs-utils
yum install nfs-utils (centos)
或者 apt-get install nfs-kernel-server (ubuntu)
2、启动服务
systemctl enable nfs-server
systemctl start nfs-server
3、创建共享目录完成共享配置
mkdir /home/nfs #创建共享目录
4、编辑共享配置
vim /etc/exports
#语法格式: 共享文件路径 客户机地址(权限) #这里的客户机地址可以是IP,网段,域名,也可以是任意*
/home/nfs *(rw,async,no_root_squash)
#服务器安装nfs服务,提供nfs存储功能
1、安装nfs-utils
yum install nfs-utils (centos)
或者 apt-get install nfs-kernel-server (ubuntu)
2、启动服务
systemctl enable nfs-server
systemctl start nfs-server
3、创建共享目录完成共享配置
mkdir /home/nfs #创建共享目录
4、编辑共享配置
vim /etc/exports
#语法格式: 共享文件路径 客户机地址(权限) #这里的客户机地址可以是IP,网段,域名,也可以是任意*
/home/nfs *(rw,async,no_root_squash)
服务自检命令
exportfs -arv
5、重启服务
systemctl restart nfs-server
6、本机查看nfs 共享目录
#showmount -e 服务器IP地址 (如果提示命令不存在,则需要yum install showmount)
showmount -e 127.0.0.1
/home/nfs *
7、客户端模拟挂载[所有k8s的节点都需要安装客户端]
创建deployment.yaml 文件
官方默认的镜像地址,国内可能无法下载,可以使用 image:
"
部署
root@k8s-master1:pvc # kubectl apply -f .
#查看存储卷
root@k8s-master1:pvc # kubectl get sc
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
managed-nfs-storage fuseim.pri/ifs Delete Immediate false 25h
三、编写mysql 相关yaml文件
MySQL 示例部署包含一个 ConfigMap、两个 Service 与一个 StatefulSet。
说明:
在这里,我们定义了 master.cnf 和 slave.cnf 两个 MySQL 的配置文件
master.cnf 开启了log-bin,可以使用二进制日志文件的方式进行主从复制.
slave.cnf 开启了 super-read-only ,表示从节点只接受主节点的数据同步的所有写的操作,拒绝其他的写入操作,对于用户来说就是只读的
master.cnf 和 slave.cnf 已配置文件的形式挂载到容器的目录中
Service:
app: mysql
说明:
clusterIP: None,使用无头服务 Headless Service(相比普通Service只是将spec.clusterIP定义为None,也就是没有clusterIP,直接使用endport 来通信)来维护Pod网络身份,会为每个Pod分配一个数字编号并且按照编号顺序部署。还需要在StatefulSet添加serviceName: “mysql”字段指定StatefulSet控制器
另外statefulset控制器网络标识,体现在主机名和Pod A记录:
• 主机名:<statefulset名称>-<编号>
storage: 0.5Gi
说明:
使用xtrbackup 工具进行容器初始化数据的备份,https://www.toutiao.com/i6999565563710292484
使用linux 自带的ncat 工具进行容器初始化数据的拷贝[使用ncat指令,远程地从前一个节点拷贝数据到本地] https://www.cnblogs.com/chengd/p/7565280.html
使用mysql的binlog 主从复制 来保证主从之间的数据一致
利用pod的主机名的序号来判断当前节点为主节点还是从节点,再根据对于节点拷贝不同的配置文件到指定位置
使用mysqladmin的ping 作为数据库的健康检测方式
使用nfs存储的 PV 动态供给(StorageClass),持久化mysql的数据文件
四、部署并测试
#动态追踪查看Pod的状态:
root@k8s-master1:~/kubernetes/mysql# kubectl get pods -l app=mysql –watch
NAME READY STATUS RESTARTS AGE
mysql-0 2/2 Running 0 3h12m
mysql-1 2/2 Running 0 3h11m
mysql-2 2/2 Running 0 3h10m
可以看到,StatefulSet 启动成功后,将会有三个 Pod 运行。
接下来,我们可以尝试向这个 MySQL 集群发起请求,执行一些 SQL 操作来验证它是否正常:
OF
如上所示,我们通过启动一个容器,使用 MySQL client 执行了创建数据库和表、以及插入数据的操作。需要注意的是,我们连接的 MySQL 的地址必须是 mysql-0.mysql(即:Master 节点的 DNS A 记录, 因为POD 之间通过DNS A 记录互相通信)只有 Master 节点才能处理写操作。
而通过连接 mysql-read 这个 Service,我们就可以用 SQL 进行读操作,如下所示: