关于 k8s 集群环境的搭建可以参考我的另一篇博客
k8s 集群之使用 kubeadm 在 Centos8 上部署 kubernetes 1.20
关于 nfs 网络存储如何搭建和使用可以参考我的另一篇博客
k8s 集群之使用 nfs 网络存储挂载外部目录和文件
本文是基于已有 k8s 环境下,介绍在 k8s 环境中部署 mysql 主从集群,集群的数据持久化采用 nfs 网络存储方式。
搭建 mysql 主从复制集群主要分为两步,首先构建 mysql 主库和从库的镜像,然后创建 mysql master主库 和 slave从库的yaml文件,使用 k8s 部署 mysql 主从库。
mysql 版本:5.7.32
构建 mysql 主从库的镜像
mysql 官方 Docker 镜像文件地址:https://github.com/docker-library/mysql/tree/master/5.7
本人修改之后的 Docker 镜像文件地址:https://github.com/sanchar01/mysql/tree/master/5.7.32
(区分 master 和 slave,后续使用的都是修改过的的镜像文件,有兴趣可以对比一下官方镜像文件)
—> 构建 mysql-master 镜像
将修改之后的 Docker 镜像文件下载到本地,cd 进入 master 文件夹,执行如下构建命令
docker build -t mysql/mysql-master:1.0 .
docker tag mysql/mysql-master:1.0 registry.cn-hangzhou.aliyuncs.com/sanchar/mysql-master:5.7.32.1
docker login --username=用户名 --password=密码 registry.cn-hangzhou.aliyuncs.com
docker push registry.cn-hangzhou.aliyuncs.com/sanchar/mysql-master:5.7.32.1
至此 mysql-master 镜像已经推送到远程仓库,镜像地址直接使用 registry.cn-hangzhou.aliyuncs.com/sanchar/mysql-master:5.7.32.1 (公开的镜像,可以直接使用)
—> 构建 mysql-slave 镜像
docker build -t mysql/mysql-slave:1.0 .
docker tag mysql/mysql-slave:1.0 registry.cn-hangzhou.aliyuncs.com/sanchar/mysql-slave:5.7.32.1
docker login --username=用户名 --password=密码 registry.cn-hangzhou.aliyuncs.com
docker push registry.cn-hangzhou.aliyuncs.com/sanchar/mysql-slave:5.7.32.1
至此 mysql-slave 镜像已经推送到远程仓库,镜像地址直接使用 registry.cn-hangzhou.aliyuncs.com/sanchar/mysql-slave:5.7.32.1 (公开的镜像,可以直接使用)
k8s 部署 mysql-master 和 mysql-slave
先下载 yaml 文件,下载地址 https://github.com/sanchar01/mysql/tree/master/k8s_yaml
修改 mysql-master-pv.yaml、mysql-slave-pv.yaml 文件,如下替换对应的 nfs 服务器地址和 nfs 存储目录
nfs:
path: /nfs/data/mysql/master # 注意该路径需要 nfs 服务器上存在
server: 192.168.1.28
修改 mysql-master.yaml、mysql-slave.yaml 文件,如下可替换所使用的镜像,初始化 root 账号的密码和对外端口等
spec:
containers:
- name: mysql-master
image: registry.cn-hangzhou.aliyuncs.com/sanchar/mysql-master:5.7.32.1
······
env:
- name: MYSQL_ROOT_PASSWORD
value: "root"
- name: MYSQL_REPLICATION_USER
value: "repl"
- name: MYSQL_REPLICATION_PASSWORD
value: "repl"
······
spec:
type: NodePort
ports:
- port: 3306
targetPort: 3306
name: http
nodePort: 30006 #外部通过该端口访问
修改完之后,先部署 mysql-master
kubectl create mysql-master-pv.yaml -n storage
kubectl create mysql-master.yaml -n storage
mysql-master 启动完成之后,部署 mysql-slave
kubectl create mysql-slave-pv.yaml -n storage
kubectl create mysql-slave.yaml -n storage
至此 mysql 主从库部署完成