前言
上文【从入门到放弃-Kubernetes】Kubernetes入门-有状态应用扩缩容中,介绍了如何部署有状态应用。有状态应用中,MySQL是我们最常见也是最常用的。本文我们就实战部署一个一主多从的MySQL集群。
配置准备
configMap
1 | #application/mysql/mysql-configmap.yaml |
configMap可以将配置文件和镜像解耦开。
上面的配置意思是,创建一个master.cnf文件配置内容为:log-bin,即开启bin-log日志,供主节点使用。
创建一个slave.cnf文件配置内容为:super-read-only,设为该节点只读,供备用节点使用。
service
1 | # application/mysql/mysql-services.yaml |
创建一个服务名为mysql的headless类型的service。
创建一个服务名为mysql-read的service
StatefulSet
1 | #application/mysql/mysql-statefulset.yaml |
主从节点的配置和启动都在上面的yaml文件中定义好了,接下来需要逐个创建即可。
创建所需资源
1 | //创建configMap |

执行完毕后可以使用以下命令监测创建情况。
1 | kubectl get pods --watch |

测试主库
进入pod进行操作
进入到pod mysql-0中,进行测试
1 | kubectl exec -it mysql-0 bash |
用mysql-client链接mysql-0
1 | mysql -h mysql-0 |
创建库、表
1 | //创建数据库test |
插入数据
1 | //插入 |

测试备库
连接mysql-1
1 | mysql -h mysql-1.mysql |
查看库、表结构
1 | //查看数据库列表 |
读取数据
1 | //查看 |
写入数据
1 | insert into message values("hello world"); |
此时会报错 ERROR 1290 (HY000): The MySQL server is running with the –super-read-only option so it cannot execute this statement
这是因为mysql-1是一个只读备库,无法进行写操作。

测试mysql-read服务
1 | kubectl run mysql-client-loop --image=mysql:5.7 -i -t --rm --restart=Never --\ |
每秒查询一次数据库,可以观察到,调度到不同的server-id,即pod节点

扩缩容
1 | //扩容至5副本 |
清理
1 | kubectl delete statefulset mysql |
总结
上面就是通过k8s部署一个一主多从mysql集群的过程,其中有几个重要知识点:
- 通过configMap可以将配置和镜像解耦
- 通过initContainers在pod启动前,做一些初始化工作
- 通过requests设置pod所需的cpu和memory
- 通过livenessProbe进行pod节点探活
- 通过readnessProbe进行pod可用性检测
下文,我们来学习如何通过k8s部署一个可读写数据库的SpringBoot应用。
本文中用到的yaml文件见我的GitHub仓库AloofJr