血与泪的感慨
我的天空星星都亮了,一扫之前的阴霾,喜上眉梢,多日的折磨成了幻影,程序员就是这样,痛并快乐着。接下来,开始我们伟大的分享之路,分享如何在kubernetes中搭建mysql主从集群,不踩坑的快速搭建master主从集群,让你们早点回家,多陪陪女友,愿码友们不终日与十姊妹为伍。
千里之行始于足下
1.集群版本信息
[root@kube03 ~]# kubectl version
Client Version: version.Info{Major:"1", Minor:"9", GitVersion:"v1.9.6", BuildDate:"2018-03-21T15:21:50Z", GoVersion:"go1.9.3", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"9", GitVersion:"v1.9.6", BuildDate:"2018-03-21T15:13:31Z", GoVersion:"go1.9.3", Compiler:"gc", Platform:"linux/amd64"}
1.需要ceph的相关配置:key,rbdImage名字(需要找ceph管理员)
2.需要基础镜像
镜像仓库: docker.io/yulibaozi
master: yulibaozi/mysql-master:201807261706 sha256:65ec774cd3a5e71bae1864dffbb1b37b34a2832cce1b8eb6c87f5b1e24b54267
slave: yulibaozi/mysql-slave:201807261706 sha256:712359cbe130bf282876ea7df85fb7f67d8843ab64e54f96a73fee72cef67d87
3. 需要定义k8s相关的资源(svc,sts,secret)
相关资源的解释
为什么需要secret?secret是来存储ceph的配置信息中的key的,一定要记得在存入secret之前进行base64编码。如果管理员提供给你了一个key,2个rbdImage,那么只需要一个secret,如果给了你两个key,那么需要两个secret
为什么需要 StatefulSet(sts)?sts和deployment类似,只不过deployment用于无状态的应用而sts应用于有状态的应用,master和slave各一个statefulSet
为什么需要Service?Service是为外部提供服务的,master一个service,slave一个service。
千里之行
创建secret
1.假设管理员给你的ceph信息如下:
key = AQAqfzNaofxHLBAAS7qY64uE/ddqWLOMVDhkAA==
rbdImagename = k8s_image01
user = admin(假设默认是admin,如果不是就问ceph管理员要)
2. 执行命令把ceph的Key使用base64编码
[root@kube03 yuli]# echo "AQAqfzNaofxHLBAAS7qY64uE/ddqWLOMVDhkAA==" | base64
QVFBcWZ6TmFvZnhITEJBQVM3cVk2NHVFL2RkcVdMT01WRGhrQUE9PQo=
3. 创建secret文件
[root@kube03 sts]# cat 1ceph-secret.json
{
"apiVersion": "v1",
"data": {
"key": "QVFBcWZ6TmFvZnhITEJBQVM3cVk2NHVFL2RkcVdMT01WRGhrQUE9PQo="
},
"kind": "Secret",
"metadata": {
"name": "ceph-secret",
"namespace": "yulibaozi"
},
"type": "Opaque"
}
(可选)如果没有namespace,需要创建,创建namespace的命令如下:
kubectl create namespace yulibaozi
执行命令创建secret
kubectl create -f 1ceph-secret.json
secret 创建完毕了
创建master的sts
master的sts如下:
上图可以点击放大查看代码,代码的GitHub地址在下方:
https://github.com/caas-one/k8s-demo/blob/master/mysql/sts.md
确认了4点后向下看
创建master-sts:
kubectl create -f 2master-sts.json
查看状态:
[root@kube03 sts]# kubectl get pod -n yulibaozi
NAME READY STATUS RESTARTS AGE
mysql-master-0 1/1 Running 0 2h
如果状态一直是CreateContaining,等10分钟左右还不是Running说明有问题,愿上天眷顾你。如果的确有问题,那么查问题。
master的sts创建完毕。
创建slave的sts
slave的sts配置如下:
上图可以点击放大查看代码,代码的GitHub地址在下方:
https://github.com/caas-one/k8s-demo/blob/master/mysql/sts.md
上述确认完毕后
执行命令创建slave的sts:
kubectl create -f 3slave-sts.json
查看sts的pod状态:
[root@kube03 sts]# kubectl get pod -n yulibaozi
NAME READY STATUS RESTARTS AGE
mysql-master-0 1/1 Running 0 2h
mysql-slave-0 1/1 Running 0 1h
如果等待15分钟不是Running,可能有问题,你可以选择耐心等待下,你可以选择采用和master一样的解决办法。
创建master的svc:
master的svc配置如下:
[root@kube03 sts]# cat 4master-svc.json
{
"apiVersion": "v1",
"kind": "Service",
"metadata": {
"labels": {
"app": "mysql-master"
},
"name": "mysql-master",
"namespace": "yulibaozi"
},
"spec": {
"ports": [
{
"nodePort": 31000,
"port": 3306,
"protocol": "TCP",
"targetPort": 3306
}
],
"selector": {
"app": "mysql-master"
},
"sessionAffinity": "None",
"type": "NodePort"
},
"status": {
"loadBalancer": {}
}
}
如上,我们暴露的NodePort是31000端口(如果此端口占用会创建失败,可以修改其他端口,端口范围:30000-32767)
修改service的命令:kubectl edit svc mysql-master -n yulibaozi
假设我们的宿主机IP:192.168.0.198
执行命令创建master的svc:
kubectl create -f 4master-svc.json
访问master数据库验证是否可以连接:
1.telnet的方式查看是否能连接
telnet 192.168.0.198 31000
2. 进入mysql
mysql -h 192.168.0.198 -P 31000 -uroot -proot
如果能够进入mysql的master节点,执行:
mysql> show master status;
+------------+----------+--------------+------------------+-------------------------------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------+----------+--------------+------------------+-------------------------------------------+
| bin.000005 | 194 | | | 1f14ce9c-b1a8-11e8-becd-02420aa83b04:1-12 |
+------------+----------+--------------+------------------+-------------------------------------------+
1 row in set (0.00 sec)
一定记住其中的
File
Position
能走到此处,至少说明master可用。
创建mysql的slave节点
mysql的slave节点配置如下:
[root@kube03 sts]# cat 5slave-svc.json
{
"apiVersion": "v1",
"kind": "Service",
"metadata": {
"labels": {
"name": "mysql-slave"
},
"name": "mysql-slave",
"namespace": "yuli"
},
"spec": {
"ports": [
{
"nodePort":32000,
"port": 3306,
"protocol": "TCP",
"targetPort": 3306
}
],
"selector": {
"name": "mysql-slave"
},
"sessionAffinity": "None",
"type": "NodePort"
},
"status": {
"loadBalancer": {}
}
}
如果此端口占用会创建失败,可以修改其他端口,nodePort端口范围:30000-32767)
修改service的命令:kubectl edit svc mysql-master -n yulibaozi
执行命令创建slave的svc:
kubectl create -f 5slave-svc.json
验证是否可用的方式和master节点一样
slave配置步骤:
执行命令:
mysql -h 192.168.0.198 -P 32000 -uroot -proot
在slave的数据库中配置master:
mysql> change master to master_host='192.168.0.198', master_user='root', master_password='root', master_port=32000, master_log_file='bin.000005', master_log_pos=194, master_connect_retry=30;
Query OK, 0 rows affected, 2 warnings (0.19 sec)
可能你需要修改的是:
master_host
master_user
master_password
master_port
master_log_file 上面让你记住的File
master_log_pos 上面让你记住的Position
查看slave的复制状态:
mysql> show slave status \G;
*************************** 1. row ***************************
Slave_IO_State:
Master_Host: 10.151.30.141
Master_User: root
Master_Port: 33306
Connect_Retry: 30
Master_Log_File: bin.000005
Read_Master_Log_Pos: 194
Relay_Log_File: rrelay.000001
Relay_Log_Pos: 4
Relay_Master_Log_File: bin.000005
Slave_IO_Running: No
Slave_SQL_Running: No
.
.
.
1 row in set (0.00 sec)
以下两个字段一定要注意,关键操作:
Slave_IO_Running: No
Slave_SQL_Running: No
这两个结果一定得是YES,如果不是,先不管,向下执行
执行命令开始主从复制:
mysql> start slave;
ERROR 1872 (HY000): Slave failed to initialize relay log info structure from the repository
报错了,问题出在mysql的配置文件mysqld.cnf中
执行命令进入slave容器:
kubectl exec -it mysql-slave-0 -n yulibaozi /bin/bash
进入以下路径修改配置文件:
路径在: /etc/mysql/mysql.conf.d
修改配置:
relay_log=rrelay.log => relay_log=relay.log
(注:这种修改方式的弊端在于:Pod重启后,配置会恢复,需要重新修改)
修改完毕后,执行:
mysql> reset slave;
Query OK, 0 rows affected (0.23 sec)
再次查看主从状态:
mysql> show slave status \G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 10.151.30.141
Master_User: root
Master_Port: 33306
Connect_Retry: 30
Master_Log_File: bin.000005
Read_Master_Log_Pos: 194
Relay_Log_File: rrelay.000002
Relay_Log_Pos: 314
Relay_Master_Log_File: bin.000005
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
.
.
.
1 row in set (0.00 sec)
黎明已到
然后创建数据库,创建表,写入数据,验证主从是否可用,同时删除pod,在启动判断数据是否持久化。基于ceph的mysql主从搭建完毕,bug以死,还我以生。
编辑:Ghoul
来源:容器时代(ID:CaaSOne)