【K8s】:在 Kubernetes 集群中部署 MySQL8.0 高可用集群(1主2从)

这篇具有很好参考价值的文章主要介绍了【K8s】:在 Kubernetes 集群中部署 MySQL8.0 高可用集群(1主2从)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


💖The Begin💖点点关注,收藏不迷路💖

Kubernetes 是一个强大的容器编排平台,可以帮助我们管理和部署容器化应用。MySQL 是一个流行的关系型数据库,在生产环境中通常需要高可用性和数据持久性。

本文将介绍如何在 Kubernetes 中部署 MySQL 集群,以确保数据的高可用性和持久性。

一、准备工作

1、你已经安装并配置好了 Kubernetes 集群环境。
2、这里采用master作为 NFS 服务器,如果在生产环境,最好单独使用一台服务器部署 NFS 。

【K8s】:在 Kubernetes 集群中部署 MySQL8.0 高可用集群(1主2从),容器化与编排技术深度解析,# Kubernetes,kubernetes,容器,云原生,k8s部署 MySQL8.0,高可用集群(1主2从)
3、创建三个文件夹,存放操作和部署文件

mkdir mysql-master
mkdir mysql-slave01
mkdir mysql-slave02

二、搭建nfs服务器

搭建 NFS 服务器是在网络上共享文件的一种常见方式,它可以让多台计算机访问共享的文件系统。

以下是在 Linux 环境中搭建 NFS 服务器的基本步骤:

2.1 安装 NFS 服务器软件包(所有节点执行)

使用 yum 安装 NFS 服务器软件包。在 CentOS 中,NFS 服务器软件包通常称为 nfs-utils。

yum install nfs-utils

2.2 设置共享目录

在 NFS 服务器(例如 k8s-master)上创建用于 MySQL 主从节点的数据目录。这些目录将用于存储 MySQL 实例的数据。然后,你将这些目录导出给 Kubernetes 集群中的 Pod 使用。

1、在 NFS 服务器上创建数据目录:

mkdir -p /data/nfs/{mysql-master,mysql-slaver-01,mysql-slaver-02}

这将创建三个目录,分别用于 MySQL 主节点和两个从节点。

【K8s】:在 Kubernetes 集群中部署 MySQL8.0 高可用集群(1主2从),容器化与编排技术深度解析,# Kubernetes,kubernetes,容器,云原生,k8s部署 MySQL8.0,高可用集群(1主2从)

2、配置导出:

将这些数据目录导出给 Kubernetes 集群中的 Pod 使用。编辑 /etc/exports 文件,并添加以下行:

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 用户访问。

【K8s】:在 Kubernetes 集群中部署 MySQL8.0 高可用集群(1主2从),容器化与编排技术深度解析,# Kubernetes,kubernetes,容器,云原生,k8s部署 MySQL8.0,高可用集群(1主2从)

2.3 启动 NFS 服务器

在编辑完 /etc/exports 文件后,主节点重新启动 NFS 服务以使更改生效。

sudo systemctl start nfs-server
sudo systemctl enable nfs-server
sudo systemctl status nfs-server

【K8s】:在 Kubernetes 集群中部署 MySQL8.0 高可用集群(1主2从),容器化与编排技术深度解析,# Kubernetes,kubernetes,容器,云原生,k8s部署 MySQL8.0,高可用集群(1主2从)

2.4 设置防火墙规则(可选)

如果你的服务器启用了防火墙,确保允许 NFS 流量通过防火墙。例如,使用 firewalld 来添加防火墙规则:

sudo firewall-cmd --permanent --add-service=nfs
sudo firewall-cmd --reload

2.5 验证 NFS 服务器

最后,使用 showmount 命令验证 NFS 服务器是否正确工作。运行以下命令:

showmount -e 192.168.234.20

【K8s】:在 Kubernetes 集群中部署 MySQL8.0 高可用集群(1主2从),容器化与编排技术深度解析,# Kubernetes,kubernetes,容器,云原生,k8s部署 MySQL8.0,高可用集群(1主2从)

如果一切设置正确,你应该会看到列出了共享的目录 /data/nfs/。

至此,你已经成功安装并配置了 NFS 服务器,使其他计算机能够通过网络访问共享的文件。

三、搭建部署mysql主节点

3.1 创建命名空间

使用 kubectl create namespace deploy-mysql 命令来创建 deploy-mysql 命名空间。这将为部署 MySQL 集群提供一个隔离的环境。

kubectl create namespace deploy-mysql  


【K8s】:在 Kubernetes 集群中部署 MySQL8.0 高可用集群(1主2从),容器化与编排技术深度解析,# Kubernetes,kubernetes,容器,云原生,k8s部署 MySQL8.0,高可用集群(1主2从)

3.2 创建一个名为 mysql-password 的 Secret

创建一个名为 mysql-password 的 Secret,其中包含了 MySQL root 用户的密码,并且指定了命名空间为 deploy-test 的 Kubernetes YAML 配置:

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。

apiVersion: v1
data:
  mysql_root_password: cm9vdA==
kind: Secret
metadata:
  creationTimestamp: null
  name: mysql-password
  namespace: deploy-mysql

【K8s】:在 Kubernetes 集群中部署 MySQL8.0 高可用集群(1主2从),容器化与编排技术深度解析,# Kubernetes,kubernetes,容器,云原生,k8s部署 MySQL8.0,高可用集群(1主2从)

列出命名空间 deploy-mysql 中的所有 Secrets。

[root@k8s-master ~]# kubectl get secret -n  deploy-mysql

【K8s】:在 Kubernetes 集群中部署 MySQL8.0 高可用集群(1主2从),容器化与编排技术深度解析,# Kubernetes,kubernetes,容器,云原生,k8s部署 MySQL8.0,高可用集群(1主2从)

3.3 创建持久卷(PV)和持久卷声明(PVC)

现在我将创建一个 PV 和 PVC 的清单文件,以便使用 NFS 存储。

vim mysql-pv-pvc.yaml
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:

kubectl apply -f mysql-master-pv-pvc.yaml
kubectl get pv,pvc -n deploy-mysql

【K8s】:在 Kubernetes 集群中部署 MySQL8.0 高可用集群(1主2从),容器化与编排技术深度解析,# Kubernetes,kubernetes,容器,云原生,k8s部署 MySQL8.0,高可用集群(1主2从)

3.4 创建主节点的mysql配置文件

vi 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               # 启用二进制日志,并指定日志文件名
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。

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。

【K8s】:在 Kubernetes 集群中部署 MySQL8.0 高可用集群(1主2从),容器化与编排技术深度解析,# Kubernetes,kubernetes,容器,云原生,k8s部署 MySQL8.0,高可用集群(1主2从)

复制保存生成后的内容为文件 mysql-master-configmap.yaml,添加svc、StatefulSet的配置:

vi mysql-master-configmap.yaml  ,添加下面内容
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 集群

kubectl apply -f mysql-master-configmap.yaml

【K8s】:在 Kubernetes 集群中部署 MySQL8.0 高可用集群(1主2从),容器化与编排技术深度解析,# Kubernetes,kubernetes,容器,云原生,k8s部署 MySQL8.0,高可用集群(1主2从)

3.7 获取在指定命名空间(deploy-mysql)中所有资源的详细信息

kubectl get all -o wide -n deploy-mysql

【K8s】:在 Kubernetes 集群中部署 MySQL8.0 高可用集群(1主2从),容器化与编排技术深度解析,# Kubernetes,kubernetes,容器,云原生,k8s部署 MySQL8.0,高可用集群(1主2从)
MySQL已经成功运行。

查看 Pod 的日志:使用 kubectl logs 命令查看 Pod 的日志,以了解容器为何崩溃。例如:

kubectl logs deploy-mysql-master-0 -n deploy-mysql

【K8s】:在 Kubernetes 集群中部署 MySQL8.0 高可用集群(1主2从),容器化与编排技术深度解析,# Kubernetes,kubernetes,容器,云原生,k8s部署 MySQL8.0,高可用集群(1主2从)

3.8 查看NFS 挂载的目录路径

检查其中的文件并确认是否存在 log-bin 文件。

ls -l /data/nfs/mysql-master/

【K8s】:在 Kubernetes 集群中部署 MySQL8.0 高可用集群(1主2从),容器化与编排技术深度解析,# Kubernetes,kubernetes,容器,云原生,k8s部署 MySQL8.0,高可用集群(1主2从)

/data/nfs/mysql-master/ 目录下已生成 MySQL 主节点的二进制日志文件(如 master-bin.000001)。

3.9 连接数据库测试

连接到 deploy-mysql-master-0 的 Pod 中的 MySQL 数据库,并使用 root 用户身份登录。

[root@k8s-master ~]# kubectl exec -itn deploy-mysql pod/deploy-mysql-master-0 -- mysql -uroot -p

【K8s】:在 Kubernetes 集群中部署 MySQL8.0 高可用集群(1主2从),容器化与编排技术深度解析,# Kubernetes,kubernetes,容器,云原生,k8s部署 MySQL8.0,高可用集群(1主2从)

四、搭建部署第1个Slave

4.1 创建持久卷(PV)和持久卷声明(PVC)

vi mysql-slave01-pv-pvc.yaml
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:

kubectl apply -f mysql-slave01-pv-pvc.yaml

获取命名空间“deploy-mysql”中的所有持久卷(PV)和持久卷声明(PVC):

kubectl get pv,pvc -n deploy-mysql

【K8s】:在 Kubernetes 集群中部署 MySQL8.0 高可用集群(1主2从),容器化与编排技术深度解析,# Kubernetes,kubernetes,容器,云原生,k8s部署 MySQL8.0,高可用集群(1主2从)

4.2 创建slave01从节点配置文件

vi 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 文件路径

4.3 生成 slave01 节点的mysql ConfigMap 的 YAML 资源描述文件

kubectl create configmap mysql-slave-01-configmap -n deploy-mysql --from-file=my.cnf --dry-run=client -o yaml

【K8s】:在 Kubernetes 集群中部署 MySQL8.0 高可用集群(1主2从),容器化与编排技术深度解析,# Kubernetes,kubernetes,容器,云原生,k8s部署 MySQL8.0,高可用集群(1主2从)

复制保存生成后的内容为文件 mysql-slave01-configmap.yaml,添加svc、StatefulSet的配置:

vi mysql-slave01-configmap.yaml  ,添加下面内容
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 集群

kubectl apply -f mysql-slave01-configmap.yaml

4.5 获取在指定命名空间(deploy-mysql)中所有资源的详细信息

kubectl get all -o wide -n deploy-mysql

日志查看:

kubectl logs deploy-mysql-slave-01-0 -n deploy-mysql

【K8s】:在 Kubernetes 集群中部署 MySQL8.0 高可用集群(1主2从),容器化与编排技术深度解析,# Kubernetes,kubernetes,容器,云原生,k8s部署 MySQL8.0,高可用集群(1主2从)

MySQL已经成功运行。

五、搭建部署第2个Slave

5.1 创建持久卷(PV)和持久卷声明(PVC)

vi mysql-slave02-pv-pvc.yaml
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:

kubectl apply -f mysql-slave02-pv-pvc.yaml

获取命名空间“deploy-mysql”中的所有持久卷(PV)和持久卷声明(PVC):

kubectl get pv,pvc -n deploy-mysql

【K8s】:在 Kubernetes 集群中部署 MySQL8.0 高可用集群(1主2从),容器化与编排技术深度解析,# Kubernetes,kubernetes,容器,云原生,k8s部署 MySQL8.0,高可用集群(1主2从)

5.2 创建slave02从节点配置文件

vi 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 文件路径

5.3 生成 slave02 节点的mysql ConfigMap 的 YAML 资源描述文件

kubectl create configmap mysql-slave-02-configmap -n deploy-mysql --from-file=my.cnf --dry-run=client -o yaml

【K8s】:在 Kubernetes 集群中部署 MySQL8.0 高可用集群(1主2从),容器化与编排技术深度解析,# Kubernetes,kubernetes,容器,云原生,k8s部署 MySQL8.0,高可用集群(1主2从)

复制保存生成后的内容为文件 mysql-slave02-configmap.yaml,添加svc、StatefulSet的配置:

vi mysql-slave02-configmap.yaml  ,添加下面内容
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 集群

kubectl apply -f mysql-slave02-configmap.yaml

5.5 获取在指定命名空间(deploy-mysql)中所有资源的详细信息

kubectl get all -o wide -n deploy-mysql

【K8s】:在 Kubernetes 集群中部署 MySQL8.0 高可用集群(1主2从),容器化与编排技术深度解析,# Kubernetes,kubernetes,容器,云原生,k8s部署 MySQL8.0,高可用集群(1主2从)

注意:可在yaml文件中添加配置,指定pod调度到服务器

 spec:
      nodeSelector:
        kubernetes.io/hostname: k8s-node02

六、将三台服务器组成一个集群

6.1 连接到deploy-mysql-master-0 的 Pod

## 启动一个交互式会话,连接到名为 deploy-mysql-master-0 的 Pod
kubectl exec -it -n deploy-mysql deploy-mysql-master-0 -- mysql -uroot -p


## 查看主节点的状态:
show master status;

【K8s】:在 Kubernetes 集群中部署 MySQL8.0 高可用集群(1主2从),容器化与编排技术深度解析,# Kubernetes,kubernetes,容器,云原生,k8s部署 MySQL8.0,高可用集群(1主2从)

6.2 配置从节点(Slave)连接到主节点(Master)

在 MySQL 中执行 CHANGE MASTER TO 命令用于配置从节点(Slave)连接到主节点(Master)的参数。在你的情况下,你想在两个从节点中执行这个命令,以便它们连接到主节点。

假设你已经连接到两个从节点的 MySQL Pod 中,你可以分别执行以下命令来配置它们连接到主节点:

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;

需要注意下面的几个参数:

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。

kubectl exec -itn deploy-mysql pod/deploy-mysql-slave-01-0 -- mysql -uroot -p

2、配置从节点(Slave)连接到主节点(Master)的参数:

执行以下命令来配置它们连接到主节点:

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;

【K8s】:在 Kubernetes 集群中部署 MySQL8.0 高可用集群(1主2从),容器化与编排技术深度解析,# Kubernetes,kubernetes,容器,云原生,k8s部署 MySQL8.0,高可用集群(1主2从)

3、启动从节点的复制进程

START SLAVE;

【K8s】:在 Kubernetes 集群中部署 MySQL8.0 高可用集群(1主2从),容器化与编排技术深度解析,# Kubernetes,kubernetes,容器,云原生,k8s部署 MySQL8.0,高可用集群(1主2从)
4、查看从节点的复制状态

SHOW SLAVE STATUS\G;

【K8s】:在 Kubernetes 集群中部署 MySQL8.0 高可用集群(1主2从),容器化与编排技术深度解析,# Kubernetes,kubernetes,容器,云原生,k8s部署 MySQL8.0,高可用集群(1主2从)

第一个从节点已经成功加入并开始复制主节点的数据。



6.4 Slave02 加入master

1、进 入deploy-mysql-slave-02-0 的 Pod。

kubectl exec -itn deploy-mysql pod/deploy-mysql-slave-02-0 -- mysql -uroot -p

2、配置从节点(Slave)连接到主节点(Master)的参数:

执行以下命令来配置它们连接到主节点:

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;

【K8s】:在 Kubernetes 集群中部署 MySQL8.0 高可用集群(1主2从),容器化与编排技术深度解析,# Kubernetes,kubernetes,容器,云原生,k8s部署 MySQL8.0,高可用集群(1主2从)

3、启动从节点的复制进程

START SLAVE;

【K8s】:在 Kubernetes 集群中部署 MySQL8.0 高可用集群(1主2从),容器化与编排技术深度解析,# Kubernetes,kubernetes,容器,云原生,k8s部署 MySQL8.0,高可用集群(1主2从)

4、查看从节点的复制状态

SHOW SLAVE STATUS\G;

【K8s】:在 Kubernetes 集群中部署 MySQL8.0 高可用集群(1主2从),容器化与编排技术深度解析,# Kubernetes,kubernetes,容器,云原生,k8s部署 MySQL8.0,高可用集群(1主2从)

第二个从节点已经成功加入并开始复制主节点的数据。



七、测试主从集群复制

7.1 在主节点的 MySQL Pod中创建数据库并插入测试数据

-- 创建数据库
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');

【K8s】:在 Kubernetes 集群中部署 MySQL8.0 高可用集群(1主2从),容器化与编排技术深度解析,# Kubernetes,kubernetes,容器,云原生,k8s部署 MySQL8.0,高可用集群(1主2从)

7.2 Slave01 、Slave02验证复制情况

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> 

【K8s】:在 Kubernetes 集群中部署 MySQL8.0 高可用集群(1主2从),容器化与编排技术深度解析,# Kubernetes,kubernetes,容器,云原生,k8s部署 MySQL8.0,高可用集群(1主2从)

【K8s】:在 Kubernetes 集群中部署 MySQL8.0 高可用集群(1主2从),容器化与编排技术深度解析,# Kubernetes,kubernetes,容器,云原生,k8s部署 MySQL8.0,高可用集群(1主2从)文章来源地址https://www.toymoban.com/news/detail-854153.html


💖The End💖点点关注,收藏不迷路💖

到了这里,关于【K8s】:在 Kubernetes 集群中部署 MySQL8.0 高可用集群(1主2从)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 一、kubeadm部署Kubernetes(k8s) 1.23.0多主高可用集群

    Kubernetes介绍 kubernetes(k8s)是2015年由Google公司基于Go语言编写的一款开源的容器集群编排系统,用于自动化容器的部署、扩缩容和管理; kubernetes(k8s)是基于Google内部的Borg系统的特征开发的一个版本,集成了Borg系统大部分优势; 官方地址:https://Kubernetes.io 代码托管平台:

    2024年03月25日
    浏览(49)
  • 阿里云k8s容器部署consul集群的高可用方案

    原本consul集群是由三个server节点搭建的,购买的是三个ecs服务器, java服务在注册到consul的时候,随便选择其中一个节点。 从上图可以看出, consul-01有28个服务注册,而consul-02有94个服务,consul-03则是29个。 有一次发生consul集群故障,某个conusl节点挂了,导致整个的服务发现

    2024年04月14日
    浏览(85)
  • 浅谈sealos及使用sealos4.0部署Kubernetes(K8s)高可用集群

    sealos 是以kubernetes为内核的云操作系统发行版 早期单机操作系统也是分层架构,后来才演变成 linux windows这种内核架构,云操作系统从容器诞生之日起分层架构被击穿,未来也会朝着高内聚的\\\"云内核\\\"架构迁移 从现在开始,把你数据中心所有机器想象成一台\\\"抽象\\\"的超级计算机

    2024年02月07日
    浏览(36)
  • 【云原生 | Kubernetes 系列】— 部署K8S 1.28版本集群部署(基于Containerd容器运行)

    主机名 IP地址 备注 k8s-master01 192.168.0.109 master k8s-node1 192.168.0.108 node1 k8s-node2 192.168.0.107 node1 k8s-node3 192.168.0.105 node1 1、主机配置 2、升级内核 3、配置内核转发以及过滤 4、安装ipset ipvsadm,IPVS(IP Virtual Server)是一个用于负载均衡的 Linux 内核模块,它可以用来替代 kube-proxy 默认的

    2024年02月20日
    浏览(50)
  • [Kubernetes]8. K8s使用Helm部署mysql集群(主从数据库集群)

    上一节讲解了K8s包管理工具Helm、使用Helm部署mongodb集群(主从数据库集群),这里来看看 K8s使用Helm部署mysql集群(主从数据库集群) 无本地存储: 当重启的时候,数据库消失 (1).打开官网的应用中心 打开应用中心,搜索mysql (2).安装  1).添加repo仓库 2).安装 具体命令如下:  3).自动生成

    2024年01月21日
    浏览(45)
  • 【kubernetes】k8s高可用集群搭建(三主三从)

    目录 【kubernetes】k8s高可用集群搭建(三主三从) 一、服务器设置 二、环境配置 1、关闭防火墙 2、关闭selinux 3、关闭swap 4、修改主机名(根据主机角色不同,做相应修改) 5、主机名映射 6、将桥接的IPv4流量传递到iptables的链 7、时间同步 8、master之间进行免密登录设置 三、

    2024年02月09日
    浏览(31)
  • Kubernetes(K8s)使用 kubeadm 方式搭建多 master 高可用 K8s 集群

    本篇主要针对上篇文章的单 master 节点的 K8s 集群上搭建多 master 节点集群 和 LB 负载均衡服务器。 Kubernetes(K8S)集群搭建基础入门教程 虚拟机 IP 地址: IP 操作系统 主机名称 192.168.2.121 centos7.9 k8s-master01 192.168.2.124 centos7.9 k8s-master02 192.168.2.125 centos7.9 k8s-node01 192.168.2.126 centos

    2023年04月26日
    浏览(39)
  • 【Kubernetes】kubeadm安装k8s1.25.0高可用集群

    详情请参考 : 【Kubernetes】kubeadm安装k8s稳定版(1.23.1)高可用集群 这里不再赘述 这部分内容还没发布。。。后续有空再整理更新啦。 master、node节点都需要操作 docker也要安装,docker跟containerd不冲突,安装docker是为了能基于dockerfile构建镜像。 master、node节点都需要操作 3台机

    2024年01月16日
    浏览(41)
  • Kubernetes实战(十四)-k8s高可用集群扩容master节点

    k8s 集群是由一组运行 k8s 的节点组成的,节点可以是物理机、虚拟机或者云服务器。k8s 集群中的节点分为两种角色:master 和 node。 master 节点:master 节点负责控制和管理整个集群,它运行着一些关键的组件,如 kube-apiserver、kube-scheduler、kube-controller-manager 等。master 节点可以有

    2024年02月03日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包