文章目录
- 一、前言
- 二、实际操作
- 步骤1:编写namespace脚本
- 步骤2:编写configmap脚本
- 步骤3:编写secret脚本(用来存放mysql密码)
- 步骤4:编写initContainer脚本
- 步骤5:编写StorageClass相关脚本
- 1)权限设置:编写ServiceAccount、ClusterRole、ClusterRoleBinding、Role、RoleBinding脚本管理NFS
- 2)每个机器上安装NFS服务,存放目录的机器上新建好 /nfs/data 目录
- 3)编写StorageClass脚本
- 4)编写nfs-provisioner的Deployment脚本
- 步骤6、编写Service脚本
- 步骤7、编写StatefulSet脚本
- 步骤8:测试主从同步
- 三、尾声
一、前言
二、实际操作
问题(六个)
- 启动顺序有要求,master节点必须比slave节点先启动 (statefulset)
- 节点挂掉了,新的pod启动必须使用原先pod的资源(持久化保证数据不丢失)
- master与slave的配置不一样
- master启动之后需要设置主从授权账户,slave需要执行change master命令,以及加入主从的命令
- 希望客户账户名密码自己配置
- slave需要知道master节点的地址
解决方案(六个,按顺序对应问题)
- statefulset:使用statefulSet可以使得pod副本按照编号顺序进行启动,只需要把pod-0作为master就可以了
- 持久化保证数据不丢失:使用pv和pvc解决,通过pvc与pod的标签进行绑定,一个pod对应一个pvc就可以保证重启后的pod依旧使用原先的资源
- 初始化所需的配置信息:使用configmap可以在容器初始化的时候指定需要的配置信息,
- 初始化执行的脚步:使用initContainer可以在容器初始化的时候执行需要的脚本
- 密码存放:使用secret可以将密码保密
- 集群内访问直接podName.serviceName:使用headless service+dns可以让slave节点通过hostname访问master,hostname固定为podName.ServiceName,如:serviceName为mysql,则master的hostname为mysql-0.mysql
八个文件,按顺序来,每个都有分步测试
部署思路
- 编写namespace脚本,创建专门的namespace
- 编写configmap,将mysql的配置文件配置到里面
- 编写secret脚本,将需要的密码配置在里面
- 编写initContainer脚本(备用),根据hostname判断是master还是slave,进而执行对应的命令
- 编写pv和pvc脚本,申请磁盘资源(通过storageClass自动进行pv/pvc的创建)
- 编写headless service脚本,配置mysql之间的网络关系
- 编写StatefulSet脚本,初始化容器
本文所有的yaml文件:
步骤1:编写namespace脚本
01-mysql-namespace.yaml
测试:
步骤2:编写configmap脚本
02-mysql-configmap.yaml
相关命令测试
步骤3:编写secret脚本(用来存放mysql密码)
03-mysql-secret.yaml
现在有两个账号密码,等一下用来登录主库和从库
root/a123456!
copy/a123456!
相关命令测试
步骤4:编写initContainer脚本
ps:编写的脚本,最后会在创建StatefulSet中使用,这里只是为了展示的更清晰
1)将配置文件拷贝到对应的容器中
2)初始化mysql集群
步骤5:编写StorageClass相关脚本
采用StorageClass+NFS方式作为网络存储,使用这种方式会自动生成pvc和pv
所有的k8s节点上都要安装nfs,NFS搭建移步这里查看:nfs,信息如下
IP: 192.168.100.152
Export PATH: /nfs/data
1)权限设置:编写ServiceAccount、ClusterRole、ClusterRoleBinding、Role、RoleBinding脚本管理NFS
04-mysql-rbac.yaml
相关命令测试
2)每个机器上安装NFS服务,存放目录的机器上新建好 /nfs/data 目录
01 选择master节点作为nfs的server,所以在master节点上,执行以下命令
02 所有node上安装客户端 ps -ef|grep nfs
linux运维关于服务
service could not found 是没有安装服务,需要 yum -y install nfs-utils
inactive 是安装了服务,但是没有启动,需要 systemctl start nfs
3)编写StorageClass脚本
05-mysql-nfs-storageclass.yaml
相关命令测试
4)编写nfs-provisioner的Deployment脚本
所有的k8s节点上都要安装nfs,不然这段就会出问题无法运行
06-mysql-nfs-provisioner-deployment.yaml
相关命令测试
步骤6、编写Service脚本
07-mysql-service.yaml
相关命令测试
步骤7、编写StatefulSet脚本
08-mysql-statefulset.yaml
相关命令测试
如果使用kubectl get pvc -n mysql查看状态一直是Pending,大概率是使用了k8s1.20以上版本,需要修改 apiserver 的配置文件,重新启用 SelfLink 功能。
如果依旧不行,用命令查看nfs-client-provisioner有没有报错
如果看到类似 unable to create directory to provision new pv: mkdir /persistentvolumes/mysql-data-mysql-0-pvc-1bb47,就在nfs服务器端给挂载的那个文件夹开通权限
chmod -R 777 /nfs/data
步骤8:测试主从同步
主库操作如下:
从库操作如下:
另外注意,show slave status\G; 只在主库上执行,不能在从库上执行
三、尾声
小结四点:
mysql搭建主从结构的目的是为了应对高并发
只有主库能 insert/update/delete 操作,从库执行这个不会报错,但是引起从库与主库不一致,后面的 主库的东西都同步不到从库
只有从库能 show slave status\G 操作,查询主从同步当前进度offset,主库执行这个会报错
如果这里 statefulset replicas 是 2 ,mysql-0 是主,mysql-1 是从,如果 replicas 是 3,则mysql-0 是主,mysql-1 和 mysql-2 是从
Kubernetes部署_使用kubernetes部署Mysql主从结构(Kubernetes工作实践类)
完!