Mysql 集群服务描述: 1. 搭建一个主从复制的Mysql集群 2. 一个主节点“Master” 多个从节点“Slave” 3. 所有的写操作,只能在主节点上执行; 4. 读操作可以在所有节点上执行 5. 从节点需要能水平扩展; (注:本文的存储券pv采用的nfs服务,如果想对节点进行拓展需要添加PV券。) 所需服务资源
1. 配置数据持久化(PersistentVolume采用的是nfs)
2. 配置Master和Slave节点所需的不同配置信息(ConfigMap)
3. 创建Mysql对外服务(Service)
4. 定义Mysql容器(StatefulSet)
1 、配置数据持久化
. 我使用的是NFS服务进行资源存储。直接将NFS服务器装在了Master主节点上,如果有条件的也可以专门制作一台NFS服务器或者搭建一套ceph服务器。由于搭建的是Mysql服务集群,所以就涉及到了 数据持久化。那么这里准备了三个持久化硬盘提供给一个Master和两个Slave节点使用
1.1 配置NFS服务器
server ip: 192.168.137.101
[root@master ~]# yum install nfs-utils rpcbind -y
[root@master ~]# systemctl start nfs
[root@master ~]# systemctl start rpcbind
[root@ master ~]# systemctl enable nfs
[root@master ~]# systemctl enable rpcbind
[root@master ~]# mkdir -p /data/nfs/
[root@master ~]# chmod 777 /data/nfs/
[root@master ~]# cat /etc/exports
/data/nfs/ 192.168.137.0/24(rw,sync,no_root_squash,no_all_squash)
[root@ master ~]# exportfs -arv
exporting 192.168.137.0/24:/data/nfs
[root@ master ~]# showmount -e localhost
Export list for localhost:
/data/nfs 192.168.137.0/24
参数:
sync:将数据同步写入内存缓冲区与磁盘中,效率低,但可以保证数据的一致性
async:将数据先保存在内存缓冲区中,必要时才写入磁盘
所有node节点安装 nfs-utils rpcbind
yum install nfs-utils rpcbind -y
systemctl start nfs
systemctl start rpcbind
systemctl enable nfs
systemctl enable rpcbind
1.2 创建动态卷提供者
# wget https://raw.githubusercontent.com/kubernetes-incubator/external-storage/master/nfs-client/deploy/rbac.yaml
# kubectl apply -f rbac.yaml
1.3 创建 Storageclass
# cat class.yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: managed-nfs-storage
provisioner: fuseim.pri/ifs # or choose another name, must match deployment's env PROVISIONER_NAME'
parameters:
archiveOnDelete: "false"
1.4 创建nfs-client-provisioner自动配置程序,以便自动创建持久卷(PV)
# cat deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nfs-client-provisioner
labels:
app: nfs-client-provisioner
# replace with namespace where provisioner is deployed
namespace: default
spec:
replicas: 1
strategy:
type: Recreate
selector:
matchLabels:
app: nfs-client-provisioner
template:
metadata:
labels:
app: nfs-client-provisioner
spec:
serviceAccountName: nfs-client-provisioner
containers:
- name: nfs-client-provisioner
image: quay.io/external_storage/nfs-client-provisioner:latest
volumeMounts:
- name: nfs-client-root
mountPath: /persistentvolumes
env:
- name: PROVISIONER_NAME
value: fuseim.pri/ifs
- name: NFS_SERVER
value: 192.168.137.101
- name: NFS_PATH
value: /data/nfs
volumes:
- name: nfs-client-root
nfs:
server: 192.168.137.101
path: /data/nfs
2 、配置Master和Slave节点所需的不同配置信息
2.1 创建configMap配置字典(以为有主从复制和读写分离的区分,所以在配置信息上也有所不同)---
kubectl apply -f https://k8s.io/examples/application/mysql/mysql-configmap.yaml 没有做修改 3 、创建Mysql对外服务(Service)
3.1 负责统一管理所有的Mysql服务Pod
apiVersion: v1
kind: Service
metadata:
name: mysql-headless
namespace: kerry
labels:
app: mysql
spec:
ports:
- name: mysql
port: 3306
clusterIP: None
selector:
app: mysql
3.2 负责统一管理拥有读写权限的Pod,也就是Master节点pod
# Headless service for stable DNS entries of StatefulSet members.
apiVersion: v1
kind: Service
metadata:
name: mysql-write
labels:
app: mysql
app.kubernetes.io/name: mysql
spec:
type: NodePort
ports:
- port: 3306
protocol: TCP
targetPort: 3306
name: http
nodePort: 30307
selector:
app: mysql
---
3.3 负责统一管理拥有读权限的Pod
apiVersion: v1
kind: Service
metadata:
name: mysql-read
labels:
app: mysql
app.kubernetes.io/name: mysql
readonly: "true"
spec:
type: NodePort
ports:
- port: 3306
protocol: TCP
targetPort: 3306
name: http
nodePort: 30308
selector:
app: mysql
4 、 定义Mysql容器(配置StatefulSet) 使用的
Wget https://k8s.io/examples/application/mysql/mysql-statefulset.yaml 修改如下: 4.1 image: gcr.io/google-samples/xtrabackup:1.0 《==这个镜像是来自国外仓库,如果访问不到的话用上面1模块进行拉取所需镜像 修改为 - name: xtrabackup image: registry.cn-hangzhou.aliyuncs.com/hxpdocker/xtrabackup:1.0 4.2 修改存储类型使用创建的 NFS 动态存储卷
volumeClaimTemplates:
- metadata:
name: data
annotations:
volume.beta.kubernetes.io/storage-class: managed-nfs-storage
spec:
accessModes: ["ReadWriteOnce"]
resources:
requests:
storage: 1Gi
验证: [root@master mysql]# kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 76d my-mysql ClusterIP 10.100.34.86 192.168.137.101 3306/TCP 7h53m mysql ClusterIP None <none> 3306/TCP 2d1h mysql-nosvc NodePort 10.110.0.99 <none> 3306:30306/TCP 134m mysql-read NodePort 10.100.43.3 <none> 3306:30308/TCP 2d1h mysql1 NodePort 10.104.186.112 <none> 3306:30307/TCP 88m [root@master mysql]# kubectl exec -it mysql-0 -- bash Defaulted container "mysql" out of: mysql, xtrabackup, init-mysql (init), clone-mysql (init) root@mysql-0:/# mysql Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 106150 Server version: 5.7.36-log MySQL Community Server (GPL) Copyright (c) 2000, 2021, Oracle and/or its affiliates. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> SHOW MASTER STATUS \G; *************************** 1. row *************************** File: mysql-0-bin.000005 Position: 728 Binlog_Do_DB: Binlog_Ignore_DB: Executed_Gtid_Set: 1 row in set (0.00 sec) ERROR: No query specified [root@master mysql]# kubectl exec -it mysql-1 -- bash Defaulted container "mysql" out of: mysql, xtrabackup, init-mysql (init), clone-mysql (init) root@mysql-1:/# mysql Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 105944 Server version: 5.7.36 MySQL Community Server (GPL) Copyright (c) 2000, 2021, Oracle and/or its affiliates. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> show slave status \G; *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: mysql-0.mysql Master_User: root Master_Port: 3306 Connect_Retry: 10 Master_Log_File: mysql-0-bin.000005 Read_Master_Log_Pos: 728 Relay_Log_File: mysql-1-relay-bin.000002 Relay_Log_Pos: 896 Relay_Master_Log_File: mysql-0-bin.000005 Slave_IO_Running: Yes Slave_SQL_Running: Yes Replicate_Do_DB: Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: Last_Errno: 0 Last_Error: Skip_Counter: 0 Exec_Master_Log_Pos: 728 Relay_Log_Space: 1105 Until_Condition: None Until_Log_File: Until_Log_Pos: 0 Master_SSL_Allowed: No Master_SSL_CA_File: Master_SSL_CA_Path: Master_SSL_Cert: Master_SSL_Cipher: Master_SSL_Key: Seconds_Behind_Master: 0 Master_SSL_Verify_Server_Cert: No Last_IO_Errno: 0 Last_IO_Error: Last_SQL_Errno: 0 Last_SQL_Error: Replicate_Ignore_Server_Ids: Master_Server_Id: 100 Master_UUID: 2f44c37a-755f-11ed-80b9-eaeff980c584 Master_Info_File: /var/lib/mysql/master.info SQL_Delay: 0 SQL_Remaining_Delay: NULL Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates Master_Retry_Count: 86400 Master_Bind: Last_IO_Error_Timestamp: Last_SQL_Error_Timestamp: Master_SSL_Crl: Master_SSL_Crlpath: Retrieved_Gtid_Set: Executed_Gtid_Set: Auto_Position: 0 Replicate_Rewrite_DB: Channel_Name: Master_TLS_Version: 1 row in set (0.00 sec) ERROR: No query specified 结束语
通过 K8S 搭建了 mysql 主从,将数据进行了持久化存储及提供对外访问的方式。
