一、mysql master
replication controller 和 service 的 yaml 文件如下,文件名分别为 mysql-master-rc.yaml 和 mysql-master-service.yaml 。
# vim mysql-master-rc.yaml
# cat mysql-master-rc.yaml
apiVersion: v1
kind: ReplicationController
metadata:
name: mysql5-7-master
labels:
name: mysql5-7-master
spec:
replicas: 1
selector:
name: mysql5-7-master
template:
metadata:
labels:
name: mysql5-7-master
spec:
containers:
- name: master
image: tigerfive/mysql5.7-master:2.1
ports:
- containerPort: 3306
env:
- name: MYSQL_ROOT_PASSWORD
value: "1234567"
- name: MYSQL_REPLICATION_USER
value: "repl"
- name: MYSQL_REPLICATION_PASSWORD
value: "1234567"
可以看到在env中添加了mysql需要的环境变量。
# vim mysql-master-service.yaml
# cat mysql-master-service.yaml
cat mysql-master-service.yaml
apiVersion: v1
kind: Service
metadata:
name: mysql-master
labels:
name: mysql-master
spec:
ports:
- port: 3306
targetPort: 3306
selector:
name: mysql5-7-master
部署mysql master服务
# kubectl create -f mysql-master-rc.yaml
# kubectl create -f mysql-master-service.yaml
二、mysql slave
replication controller 和 service 的 yaml 文件如下,文件名分别为 mysql-slave-rc.yaml 和 mysql-slave-service.yaml 。
# vim mysql-slave-rc.yaml
# cat mysql-slave-rc.yaml
apiVersion: v1
kind: ReplicationController
metadata:
name: mysql5-7-slave
labels:
name: mysql5-7-slave
spec:
replicas: 1
selector:
name: mysql5-7-slave
template:
metadata:
labels:
name: mysql5-7-slave
spec:
containers:
- name: slave
image: tigerfive/mysql5.7-slave2:2.3
ports:
- containerPort: 3306
env:
- name: MYSQL_ROOT_PASSWORD
value: "1234567"
- name: MYSQL_REPLICATION_USER
value: "repl"
- name: MYSQL_REPLICATION_PASSWORD
value: "1234567"
# vim mysql-slave-service.yaml
# cat mysql-slave-service.yaml
apiVersion: v1
kind: Service
metadata:
name: mysql5-7-slave
labels:
name: mysql5-7-slave
spec:
ports:
- port: 3306
targetPort: 3306
selector:
name: mysql5-7-slave
部署mysql slave服务
kubectl create -f mysql-slave-rc.yaml
kubectl create -f mysql-slave-service.yaml
三、测试mysql的主从复制
到目前为止,mysql的一主一从均运行在k8s的pod中。由于上面service创建并没有使用type: NodePort方式,所以service只能在kubernetes的pods中引用,外界是无法使用的。
1. 查看运行状态
执行命令,查看k8s各资源的运行情况: kubectl get pods,service,rc
2. mysql master上的操作
通过如下命令连接到pods中的容器,其中mysql-master-pe18a为pod名称。
# kubectl exec -it mysql-master-pe18a /bin/bash
此处无法如果连接
可以通过kubectl get no -o wide|grep mysql5-7 查找到对应node ip
然后再对应node上,找到container_id,
然后docker exec -it container_id bash 进入容器
接着连接本地mysql master服务器:
# mysql -uroot -p
至此进入到mysql命令模式。 执行命令show master status;查看状态。 执行下面的命令创建数据库以及表,以测试数据同步:
create database tiger_test_sync_db;
use tiger_test_sync_db;
create table test_tb(id int(3),name char(10)); insert into test_tb values(001,'ok');
3. mysql slave上的操作
按照上面相同的方式进入到mysql slave的命令行,执行以下命令:
show slave status\G;
通过该命令可以查看主从同步的情况,通常利用该命令来检查主从配置是否有问题。
执行以下命令,可以看到刚才在master上创建的库表已经同步过来了:
show databases; use paul_test_sync_db; select * from test_tb;
四、集群伸缩
上面仅仅是一主一从,那接下来看看如何利用k8s对从服务器进行扩展。
此处将原先的1台从服务器扩展为3台,执行命令:
# kubectl scale rc mysql-slave --replicas=3
上面命令的意思是将名称为mysql-slave的rc控制的pod副本数量变更为3。
执行命令可以看到扩展后的结果。
# kubectl get pods
五、总结
本文基于你已经对kubernetes有一定了解,因此并没有对一些命令、文件进行解释。 本文搭建的mysql一主多从集群环境,并没有考虑外部卷的挂载,因此当集群服务重启后,在mysql中创建的数据库、添加的数据会全部丢失。