【K8s】:在 Kubernetes 集群中部署 MySQL8.0 高可用集群(1主2从)
- 一、准备工作
- 二、搭建nfs服务器
-
- [2.1 安装 NFS 服务器软件包(所有节点执行)](#2.1 安装 NFS 服务器软件包(所有节点执行))
- [2.2 设置共享目录](#2.2 设置共享目录)
- [2.3 启动 NFS 服务器](#2.3 启动 NFS 服务器)
- [2.4 设置防火墙规则(可选)](#2.4 设置防火墙规则(可选))
- [2.5 验证 NFS 服务器](#2.5 验证 NFS 服务器)
- 三、搭建部署mysql主节点
-
- [3.1 创建命名空间](#3.1 创建命名空间)
- [3.2 创建一个名为 mysql-password 的 Secret](#3.2 创建一个名为 mysql-password 的 Secret)
- [3.3 创建持久卷(PV)和持久卷声明(PVC)](#3.3 创建持久卷(PV)和持久卷声明(PVC))
- [3.4 创建主节点的mysql配置文件](#3.4 创建主节点的mysql配置文件)
- [3.5 生成 master 节点的mysql ConfigMap 的 YAML 资源描述文件](#3.5 生成 master 节点的mysql ConfigMap 的 YAML 资源描述文件)
- [3.6 应用 YAML 文件到 Kubernetes 集群](#3.6 应用 YAML 文件到 Kubernetes 集群)
- [3.7 获取在指定命名空间(deploy-mysql)中所有资源的详细信息](#3.7 获取在指定命名空间(deploy-mysql)中所有资源的详细信息)
- [3.8 查看NFS 挂载的目录路径](#3.8 查看NFS 挂载的目录路径)
- [3.9 连接数据库测试](#3.9 连接数据库测试)
- 四、搭建部署第1个Slave
-
- [4.1 创建持久卷(PV)和持久卷声明(PVC)](#4.1 创建持久卷(PV)和持久卷声明(PVC))
- [4.2 创建slave01从节点配置文件](#4.2 创建slave01从节点配置文件)
- [4.3 生成 slave01 节点的mysql ConfigMap 的 YAML 资源描述文件](#4.3 生成 slave01 节点的mysql ConfigMap 的 YAML 资源描述文件)
- [4.4 应用 YAML 文件到 Kubernetes 集群](#4.4 应用 YAML 文件到 Kubernetes 集群)
- [4.5 获取在指定命名空间(deploy-mysql)中所有资源的详细信息](#4.5 获取在指定命名空间(deploy-mysql)中所有资源的详细信息)
- 五、搭建部署第2个Slave
-
- [5.1 创建持久卷(PV)和持久卷声明(PVC)](#5.1 创建持久卷(PV)和持久卷声明(PVC))
- [5.2 创建slave02从节点配置文件](#5.2 创建slave02从节点配置文件)
- [5.3 生成 slave02 节点的mysql ConfigMap 的 YAML 资源描述文件](#5.3 生成 slave02 节点的mysql ConfigMap 的 YAML 资源描述文件)
- [5.4 应用 YAML 文件到 Kubernetes 集群](#5.4 应用 YAML 文件到 Kubernetes 集群)
- [5.5 获取在指定命名空间(deploy-mysql)中所有资源的详细信息](#5.5 获取在指定命名空间(deploy-mysql)中所有资源的详细信息)
- 六、将三台服务器组成一个集群
-
- [6.1 连接到deploy-mysql-master-0 的 Pod](#6.1 连接到deploy-mysql-master-0 的 Pod)
- [6.2 配置从节点(Slave)连接到主节点(Master)](#6.2 配置从节点(Slave)连接到主节点(Master))
- [6.3 Slave01 加入master](#6.3 Slave01 加入master)
- [6.4 Slave02 加入master](#6.4 Slave02 加入master)
- 七、测试主从集群复制
- [7.1 在主节点的 MySQL Pod中创建数据库并插入测试数据](#7.1 在主节点的 MySQL Pod中创建数据库并插入测试数据)
- [7.2 Slave01 、Slave02验证复制情况](#7.2 Slave01 、Slave02验证复制情况)
|-----------------------------|
| 💖The Begin💖点点关注,收藏不迷路💖 |
Kubernetes 是一个强大的容器编排平台,可以帮助我们管理和部署容器化应用。MySQL 是一个流行的关系型数据库,在生产环境中通常需要高可用性和数据持久性。
本文将介绍如何在 Kubernetes 中部署 MySQL 集群,以确保数据的高可用性和持久性。
一、准备工作
1、你已经安装并配置好了 Kubernetes 集群环境。
2、这里采用master作为 NFS 服务器,如果在生产环境,最好单独使用一台服务器部署 NFS 。
3、创建三个文件夹,存放操作和部署文件
sql
mkdir mysql-master
mkdir mysql-slave01
mkdir mysql-slave02
二、搭建nfs服务器
搭建 NFS 服务器是在网络上共享文件的一种常见方式,它可以让多台计算机访问共享的文件系统。
以下是在 Linux 环境中搭建 NFS 服务器的基本步骤:
2.1 安装 NFS 服务器软件包(所有节点执行)
使用 yum 安装 NFS 服务器软件包。在 CentOS 中,NFS 服务器软件包通常称为 nfs-utils。
sql
yum install nfs-utils
2.2 设置共享目录
在 NFS 服务器(例如 k8s-master)上创建用于 MySQL 主从节点的数据目录。这些目录将用于存储 MySQL 实例的数据。然后,你将这些目录导出给 Kubernetes 集群中的 Pod 使用。
1、在 NFS 服务器上创建数据目录:
sql
mkdir -p /data/nfs/{mysql-master,mysql-slaver-01,mysql-slaver-02}
这将创建三个目录,分别用于 MySQL 主节点和两个从节点。
2、配置导出:
将这些数据目录导出给 Kubernetes 集群中的 Pod 使用。编辑 /etc/exports 文件,并添加以下行:
sql
cat >> /etc/exports << EOF
/data/nfs/mysql-master *(rw,sync,no_root_squash)
/data/nfs/mysql-slaver-01 *(rw,sync,no_root_squash)
/data/nfs/mysql-slaver-02 *(rw,sync,no_root_squash)
EOF
这将允许所有客户端访问这些目录,并授予读写权限,同时启用同步模式和允许 root 用户访问。
2.3 启动 NFS 服务器
在编辑完 /etc/exports 文件后,主节点重新启动 NFS 服务以使更改生效。
sql
sudo systemctl start nfs-server
sudo systemctl enable nfs-server
sudo systemctl status nfs-server
2.4 设置防火墙规则(可选)
如果你的服务器启用了防火墙,确保允许 NFS 流量通过防火墙。例如,使用 firewalld 来添加防火墙规则:
sql
sudo firewall-cmd --permanent --add-service=nfs
sudo firewall-cmd --reload
2.5 验证 NFS 服务器
最后,使用 showmount 命令验证 NFS 服务器是否正确工作。运行以下命令:
sql
showmount -e 192.168.234.20
如果一切设置正确,你应该会看到列出了共享的目录 /data/nfs/。
至此,你已经成功安装并配置了 NFS 服务器,使其他计算机能够通过网络访问共享的文件。
三、搭建部署mysql主节点
3.1 创建命名空间
使用 kubectl create namespace deploy-mysql 命令来创建 deploy-mysql 命名空间。这将为部署 MySQL 集群提供一个隔离的环境。
sql
kubectl create namespace deploy-mysql
3.2 创建一个名为 mysql-password 的 Secret
创建一个名为 mysql-password 的 Secret,其中包含了 MySQL root 用户的密码,并且指定了命名空间为 deploy-test 的 Kubernetes YAML 配置:
sql
kubectl create secret generic mysql-password --namespace=deploy-mysql --from-literal=mysql_root_password=root --dry-run=client -o=yaml
将上述 YAML 配置保存为 mysql-secret.yaml 文件,然后使用 kubectl apply -f mysql-secret.yaml 命令来创建 Secret。
sql
apiVersion: v1
data:
mysql_root_password: cm9vdA==
kind: Secret
metadata:
creationTimestamp: null
name: mysql-password
namespace: deploy-mysql
列出命名空间 deploy-mysql 中的所有 Secrets。
sql
[root@k8s-master ~]# kubectl get secret -n deploy-mysql
3.3 创建持久卷(PV)和持久卷声明(PVC)
现在我将创建一个 PV 和 PVC 的清单文件,以便使用 NFS 存储。
sql
vim mysql-pv-pvc.yaml
sql
apiVersion: v1
kind: PersistentVolume
metadata:
name: deploy-mysql-master-nfs-pv # PV 的名称
namespace: deploy-mysql # PV 所属的命名空间
spec:
capacity:
storage: 5Gi # PV 的存储容量为 5GB(根据实际调整)
accessModes:
- ReadWriteMany # 允许多个 Pod 同时对 PV 进行读写访问
nfs:
server: 192.168.234.20 # NFS 服务器的 IP 地址
path: /data/nfs/mysql-master # NFS 服务器上暴露的目录路径
storageClassName: "nfs" # PV 使用的存储类名称为 "nfs"
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: deploy-mysql-master-nfs-pvc # PVC 的名称
namespace: deploy-mysql # PVC 所属的命名空间
spec:
accessModes:
- ReadWriteMany # PVC 的访问模式为 ReadWriteMany
storageClassName: "nfs" # PVC 使用的存储类名称为 "nfs"
resources:
requests:
storage: 5Gi # 请求 5GB 的存储空间
volumeName: deploy-mysql-master-nfs-pv # 将 PVC 绑定到 PV 的名称为 "deploy-mysql-master-nfs-pv"
现在,使用以下命令来创建 PV 和 PVC:
sql
kubectl apply -f mysql-master-pv-pvc.yaml
sql
kubectl get pv,pvc -n deploy-mysql
3.4 创建主节点的mysql配置文件
sql
vi my.cnf
sql
[mysqld]
skip-host-cache # 不使用主机缓存
skip-name-resolve # 不解析主机名
datadir = /var/lib/mysql # 数据文件存放目录
socket = /var/run/mysqld/mysqld.sock # MySQL服务器套接字文件路径
secure-file-priv = /var/lib/mysql-files # 指定安全文件的位置
pid-file = /var/run/mysqld/mysqld.pid # PID文件路径
user = mysql # MySQL服务运行的用户
secure-file-priv = NULL # 禁用安全文件访问限制
server-id = 1 # 服务器唯一标识符
log-bin = master-bin # 启用二进制日志,并指定日志文件名
log_bin_index = master-bin.index # 二进制日志索引文件路径
binlog_do_db = db_k8s # 仅记录指定数据库的操作到二进制日志
binlog_ignore_db = information_schema # 忽略记录指定数据库的操作到二进制日志
binlog_ignore_db = mysql # 忽略记录指定数据库的操作到二进制日志
binlog_ignore_db = performance_schema # 忽略记录指定数据库的操作到二进制日志
binlog_ignore_db = sys # 忽略记录指定数据库的操作到二进制日志
binlog-format = ROW # 设置二进制日志格式为行格式
[client]
socket = /var/run/mysqld/mysqld.sock # 客户端连接MySQL服务器时使用的套接字文件路径
!includedir /etc/mysql/conf.d/ # 包含额外的配置文件目录
3.5 生成 master 节点的mysql ConfigMap 的 YAML 资源描述文件
使用 kubectl create configmap 命令来生成 ConfigMap 的 YAML 资源描述文件,这个 ConfigMap 指定mysql 配置文件 my.cnf。
sql
kubectl create configmap mysql-master-configmap -n deploy-mysql --from-file=my.cnf=my.cnf --dry-run=client -o yaml
这里的命令包括几个部分:
mysql-master-configmap 是 ConfigMap 的名称。
-n deploy-mysql 指定了 ConfigMap 应该创建在 deploy-mysql 这个命名空间。
- -from-file=my.cnf=my.cnf 指定了要包括的文件。左边的 my.cnf= 指定在 ConfigMap 中的键,右边的 my.cnf 是本地文件名。
- -dry-run=client 表示这个命令将不会真正执行,而是只预览将要创建的对象。
-o yaml 指定输出格式为 YAML。
复制保存生成后的内容为文件 mysql-master-configmap.yaml,添加svc、StatefulSet的配置:
sql
vi mysql-master-configmap.yaml ,添加下面内容
sql
apiVersion: v1
data:
my.cnf: |+
[mysqld]
skip-host-cache # 不使用主机缓存
skip-name-resolve # 不解析主机名
datadir = /var/lib/mysql # 数据文件存放目录
socket = /var/run/mysqld/mysqld.sock # MySQL服务器套接字文件路径
secure-file-priv = /var/lib/mysql-files # 指定安全文件的位置
pid-file = /var/run/mysqld/mysqld.pid # PID文件路径
user = mysql # MySQL服务运行的用户
secure-file-priv = NULL # 禁用安全文件访问限制
server-id = 1 # 服务器唯一标识符
log-bin = master-bin # 启用二进制日志,并指定日志文件名
binlog_do_db = db_k8s # 仅记录指定数据库的操作到二进制日志
log_bin_index = master-bin.index # 二进制日志索引文件路径
binlog_ignore_db = information_schema # 忽略记录指定数据库的操作到二进制日志
binlog_ignore_db = mysql # 忽略记录指定数据库的操作到二进制日志
binlog_ignore_db = performance_schema # 忽略记录指定数据库的操作到二进制日志
binlog_ignore_db = sys # 忽略记录指定数据库的操作到二进制日志
binlog-format = ROW # 设置二进制日志格式为行格式
[client]
socket = /var/run/mysqld/mysqld.sock # 客户端连接MySQL服务器时使用的套接字文件路径
kind: ConfigMap
metadata:
creationTimestamp: null
name: mysql-master-configmap
namespace: deploy-mysql
---
apiVersion: v1
kind: Service
metadata:
name: deploy-mysql-master-svc # 定义服务的名称
namespace: deploy-mysql # 定义服务所属的命名空间
labels:
app: mysql-master
spec:
ports:
- port: 3306 # 服务暴露的端口号
name: mysql
targetPort: 3306
nodePort: 30306 # NodePort 类型服务的端口
selector:
app: mysql-master # 选择器,选择哪些 Pod 作为后端
type: NodePort # 服务类型为 NodePort
sessionAffinity: ClientIP # 会话亲和性设置为 ClientIP
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: deploy-mysql-master # StatefulSet 的名称
namespace: deploy-mysql # StatefulSet 所属的命名空间
spec:
selector:
matchLabels:
app: mysql-master # 选择器,用于选择管理的 Pod
serviceName: "deploy-mysql-master-svc" # 关联的 Service 的名称
replicas: 1 # 副本数
template:
metadata:
labels:
app: mysql-master # Pod 模板的标签
spec:
terminationGracePeriodSeconds: 10 # 终止优雅期的秒数
containers:
- args:
- --character-set-server=utf8mb4 # MySQL 参数设置
- --collation-server=utf8mb4_unicode_ci
- --lower_case_table_names=1
- --default-time_zone=+8:00
name: mysql # 容器的名称
image: mysql:8.0.34 # 容器镜像
ports:
- containerPort: 3306 # 容器监听的端口号
name: mysql
volumeMounts:
- name: mysql-data # 挂载的持久化卷
mountPath: /var/lib/mysql
- name: mysql-conf # 挂载的 ConfigMap
mountPath: /etc/my.cnf
readOnly: true
subPath: my.cnf
env: # 容器的环境变量
- name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
key: mysql_root_password
name: mysql-password # 引用的 Secret 的名称
volumes:
- name: mysql-data # 持久化卷的名称
persistentVolumeClaim:
claimName: deploy-mysql-master-nfs-pvc # 持久化卷声明的名称
- name: mysql-conf # ConfigMap 的名称
configMap:
name: mysql-master-configmap # ConfigMap 的名称
items:
- key: my.cnf # ConfigMap 中的键值对
mode: 0644 # 文件权限
path: my.cnf # 挂载路径
StatefulSet 是 Kubernetes 中用来部署有状态应用程序的资源对象。与 Deployment 不同,StatefulSet 管理的 Pod 具有固定的标识符和稳定的网络标识符。
这使得 StatefulSet 适用于需要持久化存储、有序部署和唯一网络标识符的应用程序,比如数据库。
3.6 应用 YAML 文件到 Kubernetes 集群
sql
kubectl apply -f mysql-master-configmap.yaml
3.7 获取在指定命名空间(deploy-mysql)中所有资源的详细信息
sql
kubectl get all -o wide -n deploy-mysql
MySQL已经成功运行。
查看 Pod 的日志:使用 kubectl logs 命令查看 Pod 的日志,以了解容器为何崩溃。例如:
sql
kubectl logs deploy-mysql-master-0 -n deploy-mysql
3.8 查看NFS 挂载的目录路径
检查其中的文件并确认是否存在 log-bin 文件。
sql
ls -l /data/nfs/mysql-master/
/data/nfs/mysql-master/ 目录下已生成 MySQL 主节点的二进制日志文件(如 master-bin.000001)。
3.9 连接数据库测试
连接到 deploy-mysql-master-0 的 Pod 中的 MySQL 数据库,并使用 root 用户身份登录。
sql
[root@k8s-master ~]# kubectl exec -itn deploy-mysql pod/deploy-mysql-master-0 -- mysql -uroot -p
四、搭建部署第1个Slave
4.1 创建持久卷(PV)和持久卷声明(PVC)
sql
vi mysql-slave01-pv-pvc.yaml
sql
apiVersion: v1
kind: PersistentVolume
metadata:
name: deploy-mysql-slave-01-nfs-pv # 持久卷的名称
namespace: deploy-mysql # 所属命名空间
spec:
capacity:
storage: 5Gi # 容量为5Gi
accessModes:
- ReadWriteMany # 可读可写,多节点访问
nfs:
server: 192.168.234.20 # NFS 服务器地址
path: /data/nfs/mysql-slaver-01 # NFS 路径
storageClassName: "nfs" # 存储类名称为 "nfs"
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: deploy-mysql-slave-01-nfs-pvc # 持久卷声明的名称
namespace: deploy-mysql # 所属命名空间
spec:
accessModes:
- ReadWriteMany # 可读可写,多节点访问
storageClassName: "nfs" # 存储类名称为 "nfs"
resources:
requests:
storage: 5Gi # 请求5Gi的存储容量
volumeName: deploy-mysql-slave-01-nfs-pv # 关联的持久卷名称
现在,使用以下命令来创建slave 01 的 PV 和 PVC:
sql
kubectl apply -f mysql-slave01-pv-pvc.yaml
获取命名空间"deploy-mysql"中的所有持久卷(PV)和持久卷声明(PVC):
sql
kubectl get pv,pvc -n deploy-mysql
4.2 创建slave01从节点配置文件
sql
vi my.cnf
sql
[mysqld]
skip-host-cache # 不使用主机缓存
skip-name-resolve # 不进行主机名解析
datadir = /var/lib/mysql # MySQL 数据目录
socket = /var/run/mysqld/mysqld.sock # MySQL Socket 文件路径
secure-file-priv = /var/lib/mysql-files # 安全文件目录
pid-file = /var/run/mysqld/mysqld.pid # MySQL 进程 ID 文件路径
user = mysql # MySQL 运行用户
secure-file-priv = NULL # 安全文件权限设置
server-id = 2 # 从节点服务器 ID
log-bin = slave-bin # 二进制日志文件名
relay-log = slave-relay-bin # 中继日志文件名
relay-log-index = slave-relay-bin.index # 中继日志索引文件名
[client]
socket = /var/run/mysqld/mysqld.sock # MySQL 客户端 Socket 文件路径
4.3 生成 slave01 节点的mysql ConfigMap 的 YAML 资源描述文件
sql
kubectl create configmap mysql-slave-01-configmap -n deploy-mysql --from-file=my.cnf --dry-run=client -o yaml
复制保存生成后的内容为文件 mysql-slave01-configmap.yaml,添加svc、StatefulSet的配置:
sql
vi mysql-slave01-configmap.yaml ,添加下面内容
sql
apiVersion: v1
data:
my.cnf: |+
[mysqld]
skip-host-cache # 不使用主机缓存
skip-name-resolve # 不进行主机名解析
datadir = /var/lib/mysql # MySQL 数据目录
socket = /var/run/mysqld/mysqld.sock # MySQL Socket 文件路径
secure-file-priv = /var/lib/mysql-files # 安全文件目录
pid-file = /var/run/mysqld/mysqld.pid # MySQL 进程 ID 文件路径
user = mysql # MySQL 运行用户
secure-file-priv = NULL # 安全文件权限设置
server-id = 2 # 从节点服务器 ID
log-bin = slave-bin # 二进制日志文件名
relay-log = slave-relay-bin # 中继日志文件名
relay-log-index = slave-relay-bin.index # 中继日志索引文件名
[client]
socket = /var/run/mysqld/mysqld.sock # MySQL 客户端 Socket 文件路径
kind: ConfigMap
metadata:
creationTimestamp: null
name: mysql-slave-01-configmap
namespace: deploy-mysql
---
apiVersion: v1
kind: Service
metadata:
name: deploy-mysql-slave-svc # MySQL从节点服务名称
namespace: deploy-mysql # 部署的命名空间
labels:
app: mysql-slave
spec:
ports:
- port: 3306
name: mysql
targetPort: 3306
nodePort: 30308 # 暴露的节点端口
selector:
app: mysql-slave
type: NodePort
sessionAffinity: ClientIP
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: deploy-mysql-slave-01 # MySQL从节点StatefulSet名称
namespace: deploy-mysql # 部署的命名空间
spec:
selector:
matchLabels:
app: mysql-slave
serviceName: "deploy-mysql-slave-svc" # 关联的Service名称
replicas: 1
template:
metadata:
labels:
app: mysql-slave
spec:
terminationGracePeriodSeconds: 10
containers:
- args:
- --character-set-server=utf8mb4
- --collation-server=utf8mb4_unicode_ci
- --lower_case_table_names=1
- --default-time_zone=+8:00
name: mysql
# image: docker.io/library/mysql:8.0.34
image: mysql:8.0.34 # MySQL镜像地址
ports:
- containerPort: 3306
name: mysql
volumeMounts:
- name: mysql-data
mountPath: /var/lib/mysql
- name: mysql-conf
mountPath: /etc/my.cnf
readOnly: true
subPath: my.cnf
env:
- name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
key: mysql_root_password
name: mysql-password
volumes:
- name: mysql-data
persistentVolumeClaim:
claimName: deploy-mysql-slave-01-nfs-pvc # 持久卷声明名称
- name: mysql-conf
configMap:
name: mysql-slave-01-configmap # ConfigMap名称
items:
- key: my.cnf
mode: 0644
path: my.cnf
4.4 应用 YAML 文件到 Kubernetes 集群
sql
kubectl apply -f mysql-slave01-configmap.yaml
4.5 获取在指定命名空间(deploy-mysql)中所有资源的详细信息
sql
kubectl get all -o wide -n deploy-mysql
日志查看:
sql
kubectl logs deploy-mysql-slave-01-0 -n deploy-mysql
MySQL已经成功运行。
五、搭建部署第2个Slave
5.1 创建持久卷(PV)和持久卷声明(PVC)
sql
vi mysql-slave02-pv-pvc.yaml
sql
apiVersion: v1
kind: PersistentVolume
metadata:
name: deploy-mysql-slave-02-nfs-pv # 持久卷的名称
namespace: deploy-mysql # 所属命名空间
spec:
capacity:
storage: 5Gi # 容量为5Gi
accessModes:
- ReadWriteMany # 可读可写,多节点访问
nfs:
server: 192.168.234.20 # NFS 服务器地址
path: /data/nfs/mysql-slaver-02 # NFS 路径
storageClassName: "nfs" # 存储类名称为 "nfs"
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: deploy-mysql-slave-02-nfs-pvc # 持久卷声明的名称
namespace: deploy-mysql # 所属命名空间
spec:
accessModes:
- ReadWriteMany # 可读可写,多节点访问
storageClassName: "nfs" # 存储类名称为 "nfs"
resources:
requests:
storage: 5Gi # 请求5Gi的存储容量
volumeName: deploy-mysql-slave-02-nfs-pv # 关联的持久卷名称
现在,使用以下命令来创建slave 02 的 PV 和 PVC:
sql
kubectl apply -f mysql-slave02-pv-pvc.yaml
获取命名空间"deploy-mysql"中的所有持久卷(PV)和持久卷声明(PVC):
sql
kubectl get pv,pvc -n deploy-mysql
5.2 创建slave02从节点配置文件
sql
vi my.cnf
sql
[mysqld]
skip-host-cache # 不使用主机缓存
skip-name-resolve # 不进行主机名解析
datadir = /var/lib/mysql # MySQL 数据目录
socket = /var/run/mysqld/mysqld.sock # MySQL Socket 文件路径
secure-file-priv = /var/lib/mysql-files # 安全文件目录
pid-file = /var/run/mysqld/mysqld.pid # MySQL 进程 ID 文件路径
user = mysql # MySQL 运行用户
secure-file-priv = NULL # 安全文件权限设置
server-id = 3 # 从节点服务器 ID
log-bin = slave-bin # 二进制日志文件名
relay-log = slave-relay-bin # 中继日志文件名
relay-log-index = slave-relay-bin.index # 中继日志索引文件名
[client]
socket = /var/run/mysqld/mysqld.sock # MySQL 客户端 Socket 文件路径
5.3 生成 slave02 节点的mysql ConfigMap 的 YAML 资源描述文件
sql
kubectl create configmap mysql-slave-02-configmap -n deploy-mysql --from-file=my.cnf --dry-run=client -o yaml
复制保存生成后的内容为文件 mysql-slave02-configmap.yaml,添加svc、StatefulSet的配置:
sql
vi mysql-slave02-configmap.yaml ,添加下面内容
sql
apiVersion: v1
data:
my.cnf: |
[mysqld]
skip-host-cache # 不使用主机缓存
skip-name-resolve # 不进行主机名解析
datadir = /var/lib/mysql # MySQL 数据目录
socket = /var/run/mysqld/mysqld.sock # MySQL Socket 文件路径
secure-file-priv = /var/lib/mysql-files # 安全文件目录
pid-file = /var/run/mysqld/mysqld.pid # MySQL 进程 ID 文件路径
user = mysql # MySQL 运行用户
secure-file-priv = NULL # 安全文件权限设置
server-id = 3 # 从节点服务器 ID
log-bin = slave-bin # 二进制日志文件名
relay-log = slave-relay-bin # 中继日志文件名
relay-log-index = slave-relay-bin.index # 中继日志索引文件名
[client]
socket = /var/run/mysqld/mysqld.sock # MySQL 客户端 Socket 文件路径
kind: ConfigMap
metadata:
creationTimestamp: null
name: mysql-slave-02-configmap
namespace: deploy-mysql
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: deploy-mysql-slave-02
namespace: deploy-mysql
spec:
selector:
matchLabels:
app: mysql-slave-02
serviceName: "deploy-mysql-slave-svc" ## 共用之前定义的 Service
replicas: 1
template:
metadata:
labels:
app: mysql-slave-02
spec:
spec:
nodeSelector:
kubernetes.io/hostname: k8s-node02 ## 指定调度到 k8s-node02
terminationGracePeriodSeconds: 10
containers:
- args:
- --character-set-server=utf8mb4
- --collation-server=utf8mb4_unicode_ci
- --lower_case_table_names=1
- --default-time_zone=+8:00
name: mysql
# image: docker.io/library/mysql:8.0.34
image: mysql:8.0.34
ports:
- containerPort: 3306
name: mysql
volumeMounts:
- name: mysql-data
mountPath: /var/lib/mysql
- name: mysql-conf
mountPath: /etc/my.cnf
readOnly: true
subPath: my.cnf
env:
- name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
key: mysql_root_password
name: mysql-password
volumes:
- name: mysql-data
persistentVolumeClaim:
claimName: deploy-mysql-slave-02-nfs-pvc
- name: mysql-conf
configMap:
name: mysql-slave-02-configmap
items:
- key: my.cnf
mode: 0644
path: my.cnf
5.4 应用 YAML 文件到 Kubernetes 集群
sql
kubectl apply -f mysql-slave02-configmap.yaml
5.5 获取在指定命名空间(deploy-mysql)中所有资源的详细信息
sql
kubectl get all -o wide -n deploy-mysql
注意:可在yaml文件中添加配置,指定pod调度到服务器
sql
spec:
nodeSelector:
kubernetes.io/hostname: k8s-node02
六、将三台服务器组成一个集群
6.1 连接到deploy-mysql-master-0 的 Pod
sql
## 启动一个交互式会话,连接到名为 deploy-mysql-master-0 的 Pod
kubectl exec -it -n deploy-mysql deploy-mysql-master-0 -- mysql -uroot -p
## 查看主节点的状态:
show master status;
6.2 配置从节点(Slave)连接到主节点(Master)
在 MySQL 中执行 CHANGE MASTER TO 命令用于配置从节点(Slave)连接到主节点(Master)的参数。在你的情况下,你想在两个从节点中执行这个命令,以便它们连接到主节点。
假设你已经连接到两个从节点的 MySQL Pod 中,你可以分别执行以下命令来配置它们连接到主节点:
sql
CHANGE MASTER TO
MASTER_HOST='deploy-mysql-master-0.deploy-mysql-master-svc.deploy-mysql.svc.cluster.local',
MASTER_PORT=3306,
MASTER_USER='root',
MASTER_PASSWORD='root',
MASTER_LOG_FILE='master-bin.000003',
MASTER_LOG_POS=157,
MASTER_CONNECT_RETRY=30,
GET_MASTER_PUBLIC_KEY=1;
需要注意下面的几个参数:
sql
master_host: 这个参数是master的地址,kubernetes提供的解析规则是 pod名称.service名称.命名空间.svc.cluster.local ,所以我们master的mysql地址是 deploy-mysql-master-0.deploy-mysql-master-svc.deploy-mysql.svc.cluster.local
master_port: 主节点的mysql端口,我们没改默认是3306
master_user: 登录到主节点的mysql用户
master_password: 登录到主节点要用到的密码
master_log_file: 我们之前查看mysql主节点状态时候的 File 字段
master_log_pos: 我们之前查看mysql主节点状态时候的 Position 字段
master_connect_retry: 主节点重连时间
get_master_public_key: 连接主mysql的公钥获取方式
根据上面参数,按照自己的环境进行修改。
6.3 Slave01 加入master
1、进 入deploy-mysql-slave-01-0 的 Pod。
sql
kubectl exec -itn deploy-mysql pod/deploy-mysql-slave-01-0 -- mysql -uroot -p
2、配置从节点(Slave)连接到主节点(Master)的参数:
执行以下命令来配置它们连接到主节点:
sql
CHANGE MASTER TO
MASTER_HOST='deploy-mysql-master-0.deploy-mysql-master-svc.deploy-mysql.svc.cluster.local',
MASTER_PORT=3306,
MASTER_USER='root',
MASTER_PASSWORD='root',
MASTER_LOG_FILE='master-bin.000003',
MASTER_LOG_POS=157,
MASTER_CONNECT_RETRY=30,
GET_MASTER_PUBLIC_KEY=1;
3、启动从节点的复制进程
sql
START SLAVE;
4、查看从节点的复制状态
sql
SHOW SLAVE STATUS\G;
第一个从节点已经成功加入并开始复制主节点的数据。
6.4 Slave02 加入master
1、进 入deploy-mysql-slave-02-0 的 Pod。
sql
kubectl exec -itn deploy-mysql pod/deploy-mysql-slave-02-0 -- mysql -uroot -p
2、配置从节点(Slave)连接到主节点(Master)的参数:
执行以下命令来配置它们连接到主节点:
sql
CHANGE MASTER TO
MASTER_HOST='deploy-mysql-master-0.deploy-mysql-master-svc.deploy-mysql.svc.cluster.local',
MASTER_PORT=3306,
MASTER_USER='root',
MASTER_PASSWORD='root',
MASTER_LOG_FILE='master-bin.000003',
MASTER_LOG_POS=157,
MASTER_CONNECT_RETRY=30,
GET_MASTER_PUBLIC_KEY=1;
3、启动从节点的复制进程
sql
START SLAVE;
4、查看从节点的复制状态
sql
SHOW SLAVE STATUS\G;
第二个从节点已经成功加入并开始复制主节点的数据。
七、测试主从集群复制
7.1 在主节点的 MySQL Pod中创建数据库并插入测试数据
sql
-- 创建数据库
CREATE DATABASE IF NOT EXISTS db_k8s;
-- 切换到 testdb 数据库
USE db_k8s;
-- 创建数据表 t_user
CREATE TABLE IF NOT EXISTS t_user (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(50)
);
-- 向 t_user 表中插入数据
INSERT INTO t_user (name) VALUES ('John'), ('Doe'), ('Jane');
7.2 Slave01 、Slave02验证复制情况
sql
mysql> USE db_k8s;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> select * from t_user;
+----+------+
| id | name |
+----+------+
| 1 | John |
| 2 | Doe |
| 3 | Jane |
+----+------+
3 rows in set (0.00 sec)
mysql>
|---------------------------|
| 💖The End💖点点关注,收藏不迷路💖 |