本篇内容是在Kubernetes部署MySQL主从同步并读写分离。
由于笔者在Kubernetes上是新手,刚刚入门,所以参考了网上其它人写的文章来完成这一过程。
参考教程链接
主要参考的是第一个链接,Service部分参考第二个链接改了改。
教程中的配置文件都是很详实的,需要根据自己的实情情况做点改动就能跑起来。
配置修改
- 第一步中的配置
local:
path: /data/svr/projects/mysql
要改为自己机器上的路径。
- 同样是第一步中的配置,三个文件都要改
nodeAffinity: required: nodeSelectorTerms: - matchExpressions: - key: kubernetes.io/hostname operator: In values: - 172.31.170.51
最后的IP要改为自己的Node名称,我因为使用的是Docker Desktop for Mac,所以本地的节点是docker-desktop
。
- 第4步中的MySQL配置要改下,加上UTF8编码的配置,不然中文输出会乱码。
apiVersion: v1
kind: ConfigMap
metadata:
name: mysql
namespace: mysql
labels:
app: mysql
data:
master.cnf: |
# Master配置
[mysqld]
log-bin=mysqllog
skip-name-resolve
character-set-server=utf8
[client]
default-character-set=utf8
slave.cnf: |
# Slave配置
[mysqld]
super-read-only
skip-name-resolve
log-bin=mysql-bin
replicate-ignore-db=mysql
character-set-server=utf8
[client]
default-character-set=utf8
- 第6步Service配置改写下,增加一个读写服务的Service,方便别的Namespace访问。
apiVersion: v1
kind: Service
metadata:
name: mysql
namespace: mysql
labels:
app: mysql
spec:
ports:
- name: mysql
port: 3306
clusterIP: None
selector:
app: mysql
---
apiVersion: v1
kind: Service
metadata:
name: mysql-read
namespace: mysql
labels:
app: mysql
spec:
ports:
- name: mysql
port: 3306
targetPort: 3306
nodePort: 30036
type: NodePort
selector:
app: mysql
---
apiVersion: v1
kind: Service
metadata:
name: mysql-readwrite
namespace: mysql
labels:
app: mysql
spec:
ports:
- name: mysql
port: 3306
targetPort: 3306
nodePort: 30006
selector:
statefulset.kubernetes.io/pod-name: mysql-0
type: NodePort
另外,文章最后验证主从同步的几条命令,存在SQL语句及命令行上的错误,多半是输入法的锅,复制的时候要小做修改。
部署
自己整理了个启动脚本
kubectl apply -f 01-persistentVolume-1.yaml
kubectl apply -f 01-persistentVolume-2.yaml
kubectl apply -f 01-persistentVolume-3.yaml
kubectl apply -f 02-storageclass.yaml
kubectl apply -f 03-mysql-namespace.yaml
kubectl apply -f 04-mysql-configmap.yaml
kubectl apply -f 05-mysql-secret.yaml
kubectl apply -f 06-mysql-services.yaml
kubectl get svc -n mysql
kubectl apply -f 07-mysql-statefulset.yaml
kubectl get pod -n mysql
验证部署
几条验证命令
#验证主从
kubectl -n mysql exec mysql-1 -c mysql -- bash -c "mysql -uroot -p123456 -e 'show slave status \G'"
#主库写数据
kubectl -n mysql exec mysql-0 -c mysql -- bash -c "mysql -uroot -p123456 -e 'create database test'"
kubectl -n mysql exec mysql-0 -c mysql -- bash -c "mysql -uroot -p123456 -e 'use test;create table counter(c int);'"
kubectl -n mysql exec mysql-0 -c mysql -- bash -c "mysql -uroot -p123456 -e 'use test;insert into counter values(123)'"
#观察从库是否同步
kubectl -n mysql exec mysql-1 -c mysql -- bash -c "mysql -uroot -p123456 -e 'use test;select * from counter'"
#节点扩容
kubectl -n mysql scale statefulset mysql --replicas=3
#观察第二从库是否同步
kubectl -n mysql exec mysql-2 -c mysql -- bash -c "mysql -uroot -p123456 -e 'use test;select * from counter'"
由于只预配置了三个Persistent Volume,所以我们最多只能启动一主二从共计三个节点。
卸载
还有个卸载的脚本,按部署的顺序倒着来。
kubectl delete -f 07-mysql-statefulset.yaml
kubectl delete -f 06-mysql-services.yaml
kubectl delete -f 05-mysql-secret.yaml
kubectl delete -f 04-mysql-configmap.yaml
kubectl delete -f 03-mysql-namespace.yaml
kubectl delete -f 02-storageclass.yaml
kubectl delete -f 01-persistentVolume-3.yaml
kubectl delete -f 01-persistentVolume-2.yaml
kubectl delete -f 01-persistentVolume-1.yaml
连接MySQL
在Namaspace mysql内部,连接Cluster可通过地址
- mysql
- mysql.mysql
连接读写节点
- mysql-readwrite
- mysql-readwrite.mysql
连接可读节点
- mysql-read
- mysql-read.mysql
即带不带Namespace都行。
其它Namespace下的Pod如果要使用这个MySQL服务,只能通过带Namespace后缀的地址连接,如mysql.mysql
,不然会报错找不到Name or service not known