ToB企服应用市场:ToB评测及商务社交产业平台

标题: K8s集群中部署Mysql一主两从集群 [打印本页]

作者: 反转基因福娃    时间: 2024-8-22 22:11
标题: K8s集群中部署Mysql一主两从集群
主机规划

主机名IP地址角色操作体系硬件设置master10.62.158.200管理节点CentOS 72 Core/4G Memorynode0110.62.158.201工作节点01CentOS 72 Core/4G Memorynode0210.62.158.202工作节点02CentOS 72 Core/4G Memorynfs10.62.158.203文件共享节点CentOS 72 Core/4G Memory 设置主机名

  1. [root@localhost ~]# hostnamectl set-hostname nfs
  2. [root@localhost ~]# ls
  3. anaconda-ks.cfg  sysconfigure.sh
  4. [root@localhost ~]# exit
  5. 登出
  6. Connection closed by foreign host.
  7. Disconnected from remote host(测试机 - 203) at 09:49:26.
复制代码
安装NFS共享存储服务【服务端】

安装NFS软件包
  1. [root@nfs ~]# yum install nfs-utils -y
复制代码
创建NFS共享目次,该共享目次后续为多个服务提供共享文件夹
  1. [root@nfs ~]# mkdir -p /data/nfs/{mysql-master,mysql-slaver-01,mysql-slaver-02}
复制代码
修改NFS设置文件,指定共享目次是哪个
  1. cat >> /etc/exports << EOF
  2. /data/nfs/mysql-master 10.62.158.*(rw,sync,no_root_squash)
  3. /data/nfs/mysql-slaver-01 10.62.158.*(rw,sync,no_root_squash)
  4. /data/nfs/mysql-slaver-02 10.62.158.*(rw,sync,no_root_squash)
  5. EOF
复制代码
安装NFS共享存储服务【客户端】

k8s集群节点也需要安装 nfs-utils 用于访问NFS服务端(nfs-utils 中不仅包含服务端程序,也包含客户端程序,不需要启动NFS程序,仅安装即可),否则无法访问NFS服务端

  1. [root@master ~]# yum install nfs-utils -y
复制代码
  1. [root@node01 ~]# yum install nfs-utils -y
复制代码
  1. [root@node02 ~]# yum install nfs-utils -y
复制代码

  1. [root@master ~]# showmount -e 10.62.158.203
  2. Export list for 10.62.158.203:
  3. /data/nfs/mysql-slaver-02 10.62.158.*
  4. /data/nfs/mysql-slaver-01 10.62.158.*
  5. /data/nfs/mysql-master    10.62.158.*
复制代码
  1. [root@node01 ~]# showmount -e 10.62.158.203
  2. Export list for 10.62.158.203:
  3. /data/nfs/mysql-slaver-02 10.62.158.*
  4. /data/nfs/mysql-slaver-01 10.62.158.*
  5. /data/nfs/mysql-master    10.62.158.*
复制代码
  1. [root@node02 ~]# showmount -e 10.62.158.203
  2. Export list for 10.62.158.203:
  3. /data/nfs/mysql-slaver-02 10.62.158.*
  4. /data/nfs/mysql-slaver-01 10.62.158.*
  5. /data/nfs/mysql-master    10.62.158.*
复制代码
前置工作

创建命名空间
  1. [root@master ~]# kubectl create namespace deploy-mysql  
  2. namespace/deploy-mysql created
  3. [root@master ~]# kubectl get ns
  4. NAME              STATUS   AGE
  5. default           Active   6d21h
  6. deploy-mysql      Active   13s
  7. kube-node-lease   Active   6d21h
  8. kube-public       Active   6d21h
  9. kube-system       Active   6d21h
复制代码
创建MySQL暗码的Secret
  1. [root@master ~]# kubectl create secret generic mysql-password --namespace=deploy-mysql --from-literal=mysql_root_password=root --dry-run=client -o=yaml
  2. apiVersion: v1
  3. data:
  4.   mysql_root_password: cm9vdA==
  5. kind: Secret
  6. metadata:
  7.   creationTimestamp: null
  8.   name: mysql-password
  9.   namespace: deploy-mysql
复制代码
复制生存天生后的内容为 mysql-secret.yaml 文件
  1. [root@master ~]# vim mysql-secret.yaml
复制代码
  1. apiVersion: v1
  2. data:
  3.   mysql_root_password: cm9vdA==
  4. kind: Secret
  5. metadata:
  6.   creationTimestamp: null
  7.   name: mysql-password
  8.   namespace: deploy-mysql
复制代码
创建Secret
  1. [root@master ~]# kubectl apply -f mysql-secret.yaml
  2. secret/mysql-password created
复制代码
列出命名空间 deploy-mysql 中的所有 Secrets
  1. [root@master ~]# kubectl get secret -n deploy-mysql
  2. NAME                  TYPE                                  DATA   AGE
  3. default-token-272c8   kubernetes.io/service-account-token   3      8m51s
  4. mysql-password        Opaque                                1      25s
复制代码
搭建部署mysql主节点

创建持久卷(PV)和持久卷声明(PVC)
  1. [root@master ~]# vim mysql-master-pv-pvc.yaml
复制代码
  1. apiVersion: v1
  2. kind: PersistentVolume
  3. metadata:
  4.   name: deploy-mysql-master-nfs-pv  # PV 的名称
  5.   namespace: deploy-mysql  # PV 所属的命名空间
  6. spec:
  7.   capacity:
  8.     storage: 1Gi  # PV 的存储容量为 1GB(根据实际调整)
  9.   accessModes:
  10.     - ReadWriteMany  # 允许多个 Pod 同时对 PV 进行读写访问
  11.   nfs:
  12.     server: 10.62.158.203  # NFS 服务器的 IP 地址
  13.     path: /data/nfs/mysql-master  # NFS 服务器上暴露的目录路径
  14.   storageClassName: "nfs"  # PV 使用的存储类名称为 "nfs"
  15. ---
  16. apiVersion: v1
  17. kind: PersistentVolumeClaim
  18. metadata:
  19.   name: deploy-mysql-master-nfs-pvc  # PVC 的名称
  20.   namespace: deploy-mysql  # PVC 所属的命名空间
  21. spec:
  22.   accessModes:
  23.     - ReadWriteMany  # PVC 的访问模式为 ReadWriteMany
  24.   storageClassName: "nfs"  # PVC 使用的存储类名称为 "nfs"
  25.   resources:
  26.     requests:
  27.       storage: 1Gi  # 请求 1GB 的存储空间
  28.   volumeName: deploy-mysql-master-nfs-pv  # 将 PVC 绑定到 PV 的名称为 "deploy-mysql-master-nfs-pv"
复制代码
创建 PV 和 PVC
  1. [root@master ~]# kubectl apply -f mysql-master-pv-pvc.yaml
  2. persistentvolume/deploy-mysql-master-nfs-pv created
  3. persistentvolumeclaim/deploy-mysql-master-nfs-pvc created
复制代码
检察PV 和 PVC
  1. [root@master ~]# kubectl get pv,pvc -n deploy-mysql
  2. NAME                                          CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                                      STORAGECLASS   REASON   AGE
  3. persistentvolume/deploy-mysql-master-nfs-pv   5Gi        RWX            Retain           Bound    deploy-mysql/deploy-mysql-master-nfs-pvc   nfs                     46s
  4. NAME                                                STATUS   VOLUME                       CAPACITY   ACCESS MODES   STORAGECLASS   AGE
  5. persistentvolumeclaim/deploy-mysql-master-nfs-pvc   Bound    deploy-mysql-master-nfs-pv   5Gi        RWX            nfs            46s
复制代码
创建主节点的mysql设置文件,同步的数据库为:db_k8s
  1. [root@master ~]# vi my.cnf
复制代码
  1. [mysqld]
  2. skip-host-cache                                 # 不使用主机缓存
  3. skip-name-resolve                               # 不解析主机名
  4. datadir          = /var/lib/mysql               # 数据文件存放目录
  5. socket           = /var/run/mysqld/mysqld.sock  # MySQL服务器套接字文件路径
  6. secure-file-priv = /var/lib/mysql-files         # 指定安全文件的位置
  7. pid-file         = /var/run/mysqld/mysqld.pid   # PID文件路径
  8. user             = mysql                        # MySQL服务运行的用户
  9. secure-file-priv = NULL                         # 禁用安全文件访问限制
  10. server-id        = 1                            # 服务器唯一标识符
  11. log-bin          = master-bin                   # 启用二进制日志,并指定日志文件名
  12. log_bin_index    = master-bin.index             # 二进制日志索引文件路径
  13. binlog_do_db     = db_k8s                       # 仅记录指定数据库的操作到二进制日志
  14. binlog_ignore_db = information_schema           # 忽略记录指定数据库的操作到二进制日志
  15. binlog_ignore_db = mysql                        # 忽略记录指定数据库的操作到二进制日志
  16. binlog_ignore_db = performance_schema           # 忽略记录指定数据库的操作到二进制日志
  17. binlog_ignore_db = sys                          # 忽略记录指定数据库的操作到二进制日志
  18. binlog-format    = ROW                          # 设置二进制日志格式为行格式
  19. [client]
  20. socket           = /var/run/mysqld/mysqld.sock  # 客户端连接MySQL服务器时使用的套接字文件路径
  21. !includedir /etc/mysql/conf.d/                  # 包含额外的配置文件目录
复制代码
天生 master 节点的mysql ConfigMap 的 YAML 资源形貌文件,指定mysql 设置文件 my.cnf
  1. [root@master ~]# kubectl create configmap mysql-master-configmap -n deploy-mysql --from-file=my.cnf=my.cnf --dry-run=client -o yaml
  2. apiVersion: v1
  3. data:
  4.   my.cnf: |
  5.     [mysqld]
  6.     skip-host-cache                                 # 不使用主机缓存
  7.     skip-name-resolve                               # 不解析主机名
  8.     datadir          = /var/lib/mysql               # 数据文件存放目录
  9.     socket           = /var/run/mysqld/mysqld.sock  # MySQL服务器套接字文件路径
  10.     secure-file-priv = /var/lib/mysql-files         # 指定安全文件的位置
  11.     pid-file         = /var/run/mysqld/mysqld.pid   # PID文件路径
  12.     user             = mysql                        # MySQL服务运行的用户
  13.     secure-file-priv = NULL                         # 禁用安全文件访问限制
  14.     server-id        = 1                            # 服务器唯一标识符
  15.     log-bin          = master-bin                   # 启用二进制日志,并指定日志文件名
  16.     log_bin_index    = master-bin.index             # 二进制日志索引文件路径
  17.     binlog_do_db     = db_k8s                       # 仅记录指定数据库的操作到二进制日志
  18.     binlog_ignore_db = information_schema           # 忽略记录指定数据库的操作到二进制日志
  19.     binlog_ignore_db = mysql                        # 忽略记录指定数据库的操作到二进制日志
  20.     binlog_ignore_db = performance_schema           # 忽略记录指定数据库的操作到二进制日志
  21.     binlog_ignore_db = sys                          # 忽略记录指定数据库的操作到二进制日志
  22.     binlog-format    = ROW                          # 设置二进制日志格式为行格式
  23.     [client]
  24.     socket           = /var/run/mysqld/mysqld.sock  # 客户端连接MySQL服务器时使用的套接字文件路径
  25.     !includedir /etc/mysql/conf.d/                  # 包含额外的配置文件目录
  26. kind: ConfigMap
  27. metadata:
  28.   creationTimestamp: null
  29.   name: mysql-master-configmap
  30.   namespace: deploy-mysql
复制代码
检察当前命名空间中的configmap
  1. [root@master ~]# kubectl get configmaps -n deploy-mysql
  2. NAME                       DATA   AGE
  3. kube-root-ca.crt           1      140m
  4. mysql-master-configmap     1      97m
复制代码
复制生存天生后的内容为文件 mysql-master-configmap.yaml,并额外添加svc、StatefulSet的设置
  1. [root@master ~]# vim mysql-master-configmap.yaml
复制代码
  1. apiVersion: v1
  2. data:
  3.   my.cnf: |+
  4.     [mysqld]
  5.     skip-host-cache                             # 不使用主机缓存
  6.     skip-name-resolve                           # 不解析主机名
  7.     datadir          = /var/lib/mysql           # 数据文件存放目录
  8.     socket           = /var/run/mysqld/mysqld.sock  # MySQL服务器套接字文件路径
  9.     secure-file-priv = /var/lib/mysql-files     # 指定安全文件的位置
  10.     pid-file         = /var/run/mysqld/mysqld.pid   # PID文件路径
  11.     user             = mysql                    # MySQL服务运行的用户
  12.     secure-file-priv = NULL                     # 禁用安全文件访问限制
  13.     server-id        = 1                        # 服务器唯一标识符
  14.     log-bin          = master-bin               # 启用二进制日志,并指定日志文件名
  15.     binlog_do_db     = db_k8s                   # 仅记录指定数据库的操作到二进制日志
  16.     log_bin_index    = master-bin.index         # 二进制日志索引文件路径
  17.     binlog_ignore_db = information_schema       # 忽略记录指定数据库的操作到二进制日志
  18.     binlog_ignore_db = mysql                    # 忽略记录指定数据库的操作到二进制日志
  19.     binlog_ignore_db = performance_schema       # 忽略记录指定数据库的操作到二进制日志
  20.     binlog_ignore_db = sys                      # 忽略记录指定数据库的操作到二进制日志
  21.     binlog-format    = ROW                      # 设置二进制日志格式为行格式
  22.     [client]
  23.     socket           = /var/run/mysqld/mysqld.sock  # 客户端连接MySQL服务器时使用的套接字文件路径
  24. kind: ConfigMap
  25. metadata:
  26.   creationTimestamp: null
  27.   name: mysql-master-configmap
  28.   namespace: deploy-mysql
  29. ---
  30. apiVersion: v1
  31. kind: Service
  32. metadata:
  33.   name: deploy-mysql-master-svc  # 定义服务的名称
  34.   namespace: deploy-mysql  # 定义服务所属的命名空间
  35.   labels:
  36.     app: mysql-master
  37. spec:
  38.   ports:
  39.   - port: 3306  # 服务暴露的端口号
  40.     name: mysql
  41.     targetPort: 3306
  42.     nodePort: 30306  # NodePort 类型服务的端口
  43.   selector:
  44.     app: mysql-master  # 选择器,选择哪些 Pod 作为后端
  45.   type: NodePort  # 服务类型为 NodePort
  46.   sessionAffinity: ClientIP  # 会话亲和性设置为 ClientIP
  47. ---
  48. apiVersion: apps/v1
  49. kind: StatefulSet
  50. metadata:
  51.   name: deploy-mysql-master  # StatefulSet 的名称
  52.   namespace: deploy-mysql  # StatefulSet 所属的命名空间
  53. spec:
  54.   selector:
  55.     matchLabels:
  56.       app: mysql-master  # 选择器,用于选择管理的 Pod
  57.   serviceName: "deploy-mysql-master-svc"  # 关联的 Service 的名称
  58.   replicas: 1  # 副本数
  59.   template:
  60.     metadata:
  61.       labels:
  62.         app: mysql-master  # Pod 模板的标签
  63.     spec:
  64.       terminationGracePeriodSeconds: 10  # 终止优雅期的秒数
  65.       containers:
  66.       - args:
  67.         - --character-set-server=utf8mb4  # MySQL 参数设置
  68.         - --collation-server=utf8mb4_unicode_ci
  69.         - --lower_case_table_names=1
  70.         - --default-time_zone=+8:00
  71.         name: mysql  # 容器的名称
  72.         image: mysql:8.0.34  # 容器镜像
  73.         ports:
  74.         - containerPort: 3306  # 容器监听的端口号
  75.           name: mysql
  76.         volumeMounts:
  77.         - name: mysql-data  # 挂载的持久化卷
  78.           mountPath: /var/lib/mysql
  79.         - name: mysql-conf  # 挂载的 ConfigMap
  80.           mountPath: /etc/my.cnf
  81.           readOnly: true
  82.           subPath: my.cnf
  83.         env:  # 容器的环境变量
  84.         - name: MYSQL_ROOT_PASSWORD
  85.           valueFrom:
  86.             secretKeyRef:
  87.               key: mysql_root_password
  88.               name: mysql-password  # 引用的 Secret 的名称
  89.       volumes:
  90.       - name: mysql-data  # 持久化卷的名称
  91.         persistentVolumeClaim:
  92.           claimName: deploy-mysql-master-nfs-pvc  # 持久化卷声明的名称
  93.       - name: mysql-conf  # ConfigMap 的名称
  94.         configMap:
  95.           name: mysql-master-configmap  # ConfigMap 的名称
  96.           items:
  97.           - key: my.cnf  # ConfigMap 中的键值对
  98.             mode: 0644  # 文件权限
  99.             path: my.cnf  # 挂载路径
复制代码
应用 YAML 文件到 Kubernetes 集群
  1. [root@master ~]# kubectl apply -f mysql-master-configmap.yaml
  2. configmap/mysql-master-configmap created
  3. service/deploy-mysql-master-svc created
  4. statefulset.apps/deploy-mysql-master created
复制代码
获取在指定命名空间[ deploy-mysq ]中所有资源的具体信息
  1. [root@master ~]# kubectl get all -o wide -n deploy-mysql
  2. NAME                        READY   STATUS    RESTARTS   AGE    IP                NODE     NOMINATED NODE   READINESS GATES
  3. pod/deploy-mysql-master-0   1/1     Running   0          100s   192.168.196.131   node01   <none>           <none>
  4. NAME                              TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE    SELECTOR
  5. service/deploy-mysql-master-svc   NodePort   10.109.63.216   <none>        3306:30306/TCP   100s   app=mysql-master
  6. NAME                                   READY   AGE    CONTAINERS   IMAGES
  7. statefulset.apps/deploy-mysql-master   1/1     100s   mysql        mysql:8.0.34
复制代码
检察Pod日志
  1. [root@master ~]# kubectl logs deploy-mysql-master-0 -n deploy-mysql
复制代码
检察 NFS 服务器中的共享目次,检查此中的文件并确认是否存在 log-bin 文件:master-bin
  1. [root@nfs nfs]# ls -l /data/nfs/mysql-master/
  2. 总用量 96720
  3. -rw-r----- 1 polkitd input       56 4月  19 10:54 auto.cnf
  4. -rw------- 1 polkitd input     1676 4月  19 10:55 ca-key.pem
  5. -rw-r--r-- 1 polkitd input     1112 4月  19 10:55 ca.pem
  6. -rw-r--r-- 1 polkitd input     1112 4月  19 10:55 client-cert.pem
  7. -rw------- 1 polkitd input     1680 4月  19 10:55 client-key.pem
  8. -rw-r----- 1 polkitd input   196608 4月  19 11:11 #ib_16384_0.dblwr
  9. -rw-r----- 1 polkitd input  8585216 4月  19 10:55 #ib_16384_1.dblwr
  10. -rw-r----- 1 polkitd input     3541 4月  19 11:07 ib_buffer_pool
  11. -rw-r----- 1 polkitd input 12582912 4月  19 11:09 ibdata1
  12. -rw-r----- 1 polkitd input 12582912 4月  19 11:10 ibtmp1
  13. drwxr-x--- 2 polkitd input     4096 4月  19 11:09 #innodb_redo
  14. drwxr-x--- 2 polkitd input      187 4月  19 11:09 #innodb_temp
  15. -rw-r----- 1 polkitd input      180 4月  19 10:55 master-bin.000001
  16. -rw-r----- 1 polkitd input      180 4月  19 10:55 master-bin.000002
  17. -rw-r----- 1 polkitd input      180 4月  19 10:59 master-bin.000003
  18. -rw-r----- 1 polkitd input      180 4月  19 11:07 master-bin.000004
  19. -rw-r----- 1 polkitd input      157 4月  19 11:09 master-bin.000005
  20. -rw-r----- 1 polkitd input      100 4月  19 11:09 master-bin.index
  21. drwxr-x--- 2 polkitd input      143 4月  19 10:55 mysql
  22. -rw-r----- 1 polkitd input 31457280 4月  19 11:09 mysql.ibd
  23. lrwxrwxrwx 1 polkitd input       27 4月  19 11:09 mysql.sock -> /var/run/mysqld/mysqld.sock
  24. drwxr-x--- 2 polkitd input     8192 4月  19 10:55 performance_schema
  25. -rw------- 1 polkitd input     1676 4月  19 10:55 private_key.pem
  26. -rw-r--r-- 1 polkitd input      452 4月  19 10:55 public_key.pem
  27. -rw-r--r-- 1 polkitd input     1112 4月  19 10:55 server-cert.pem
  28. -rw------- 1 polkitd input     1680 4月  19 10:55 server-key.pem
  29. drwxr-x--- 2 polkitd input       28 4月  19 10:55 sys
  30. -rw-r----- 1 polkitd input 16777216 4月  19 11:11 undo_001
  31. -rw-r----- 1 polkitd input 16777216 4月  19 11:11 undo_002
复制代码
搭建部署mysql主节点slave01

创建持久卷(PV)和持久卷声明(PVC)
  1. [root@master ~]# vim mysql-slave01-pv-pvc.yaml
复制代码
  1. apiVersion: v1
  2. kind: PersistentVolume
  3. metadata:
  4.   name: deploy-mysql-slave01-nfs-pv  # PV 的名称
  5.   namespace: deploy-mysql  # PV 所属的命名空间
  6. spec:
  7.   capacity:
  8.     storage: 1Gi  # PV 的存储容量为 1GB(根据实际调整)
  9.   accessModes:
  10.     - ReadWriteMany  # 允许多个 Pod 同时对 PV 进行读写访问
  11.   nfs:
  12.     server: 10.62.158.203  # NFS 服务器的 IP 地址
  13.     path: /data/nfs/mysql-slaver-01  # NFS 服务器上暴露的目录路径
  14.   storageClassName: "nfs"  # PV 使用的存储类名称为 "nfs"
  15. ---
  16. apiVersion: v1
  17. kind: PersistentVolumeClaim
  18. metadata:
  19.   name: deploy-mysql-slave01-nfs-pvc  # PVC 的名称
  20.   namespace: deploy-mysql  # PVC 所属的命名空间
  21. spec:
  22.   accessModes:
  23.     - ReadWriteMany  # PVC 的访问模式为 ReadWriteMany
  24.   storageClassName: "nfs"  # PVC 使用的存储类名称为 "nfs"
  25.   resources:
  26.     requests:
  27.       storage: 1Gi  # 请求 1GB 的存储空间
  28.   volumeName: deploy-mysql-slave01-nfs-pv  # 将 PVC 绑定到 PV 的名称为 "deploy-mysql-master-nfs-pv"
复制代码
创建 PV 和 PVC
  1. [root@master ~]# kubectl apply -f mysql-slave01-pv-pvc.yaml
  2. persistentvolume/deploy-mysql-slave01-nfs-pv created
  3. persistentvolumeclaim/deploy-mysql-slave01-nfs-pvc created
复制代码
检察PV 和 PVC
  1. [root@master ~]# kubectl get pv,pvc -n deploy-mysql
  2. NAME                                           CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                                       STORAGECLASS   REASON   AGE
  3. persistentvolume/deploy-mysql-master-nfs-pv    5Gi        RWX            Retain           Bound    deploy-mysql/deploy-mysql-master-nfs-pvc    nfs                     114m
  4. persistentvolume/deploy-mysql-slave01-nfs-pv   1Gi        RWX            Retain           Bound    deploy-mysql/deploy-mysql-slave01-nfs-pvc   nfs                     27s
  5. NAME                                                 STATUS   VOLUME                        CAPACITY   ACCESS MODES   STORAGECLASS   AGE
  6. persistentvolumeclaim/deploy-mysql-master-nfs-pvc    Bound    deploy-mysql-master-nfs-pv    5Gi        RWX            nfs            114m
  7. persistentvolumeclaim/deploy-mysql-slave01-nfs-pvc   Bound    deploy-mysql-slave01-nfs-pv   1Gi        RWX            nfs            27s
复制代码
创建 salve01 从节点的 mysql 设置文件
  1. [root@master ~]# vim my.cnf
复制代码
  1. [mysqld]
  2. skip-host-cache  # 不使用主机缓存
  3. skip-name-resolve  # 不进行主机名解析
  4. datadir          = /var/lib/mysql  # MySQL 数据目录
  5. socket           = /var/run/mysqld/mysqld.sock  # MySQL Socket 文件路径
  6. secure-file-priv = /var/lib/mysql-files  # 安全文件目录
  7. pid-file         = /var/run/mysqld/mysqld.pid  # MySQL 进程 ID 文件路径
  8. user             = mysql  # MySQL 运行用户
  9. secure-file-priv = NULL  # 安全文件权限设置
  10. server-id        = 2  # 从节点服务器 ID
  11. log-bin          = slave-bin  # 二进制日志文件名
  12. relay-log        = slave-relay-bin  # 中继日志文件名
  13. relay-log-index  = slave-relay-bin.index  # 中继日志索引文件名
  14. [client]
  15. socket           = /var/run/mysqld/mysqld.sock  # MySQL 客户端 Socket 文件路径
复制代码
天生 slave01 节点的 mysql ConfigMap 的 YAML 资源形貌文件
  1. [root@master ~]# kubectl create configmap mysql-slave01-configmap -n deploy-mysql --from-file=my.cnf --dry-run=client -o yaml
  2. apiVersion: v1
  3. data:
  4.   my.cnf: |
  5.     [mysqld]
  6.     skip-host-cache  # 不使用主机缓存
  7.     skip-name-resolve  # 不进行主机名解析
  8.     datadir          = /var/lib/mysql  # MySQL 数据目录
  9.     socket           = /var/run/mysqld/mysqld.sock  # MySQL Socket 文件路径
  10.     secure-file-priv = /var/lib/mysql-files  # 安全文件目录
  11.     pid-file         = /var/run/mysqld/mysqld.pid  # MySQL 进程 ID 文件路径
  12.     user             = mysql  # MySQL 运行用户
  13.     secure-file-priv = NULL  # 安全文件权限设置
  14.     server-id        = 2  # 从节点服务器 ID
  15.     log-bin          = slave-bin  # 二进制日志文件名
  16.     relay-log        = slave-relay-bin  # 中继日志文件名
  17.     relay-log-index  = slave-relay-bin.index  # 中继日志索引文件名
  18.     [client]
  19.     socket           = /var/run/mysqld/mysqld.sock  # MySQL 客户端 Socket 文件路径
  20. kind: ConfigMap
  21. metadata:
  22.   creationTimestamp: null
  23.   name: mysql-slave01-configmap
  24.   namespace: deploy-mysql
复制代码
复制生存天生后的内容为文件 mysql-slave01-configmap.yaml,添加svc、StatefulSet的设置
  1. [root@master ~]# vim mysql-slave01-configmap.yaml
复制代码
  1. apiVersion: v1
  2. data:
  3.   my.cnf: |
  4.     [mysqld]
  5.     skip-host-cache  # 不使用主机缓存
  6.     skip-name-resolve  # 不进行主机名解析
  7.     datadir          = /var/lib/mysql  # MySQL 数据目录
  8.     socket           = /var/run/mysqld/mysqld.sock  # MySQL Socket 文件路径
  9.     secure-file-priv = /var/lib/mysql-files  # 安全文件目录
  10.     pid-file         = /var/run/mysqld/mysqld.pid  # MySQL 进程 ID 文件路径
  11.     user             = mysql  # MySQL 运行用户
  12.     secure-file-priv = NULL  # 安全文件权限设置
  13.     server-id        = 2  # 从节点服务器 ID
  14.     log-bin          = slave-bin  # 二进制日志文件名
  15.     relay-log        = slave-relay-bin  # 中继日志文件名
  16.     relay-log-index  = slave-relay-bin.index  # 中继日志索引文件名
  17.     [client]
  18.     socket           = /var/run/mysqld/mysqld.sock  # MySQL 客户端 Socket 文件路径
  19. kind: ConfigMap
  20. metadata:
  21.   creationTimestamp: null
  22.   name: mysql-slave01-configmap
  23.   namespace: deploy-mysql
  24. ---
  25. apiVersion: v1
  26. kind: Service
  27. metadata:
  28.   name: deploy-mysql-slave-svc  # MySQL从节点服务名称
  29.   namespace: deploy-mysql  # 部署的命名空间
  30.   labels:
  31.     app: mysql-slave
  32. spec:
  33.   ports:
  34.   - port: 3306
  35.     name: mysql
  36.     targetPort: 3306
  37.     nodePort: 30308  # 暴露的节点端口
  38.   selector:
  39.     app: mysql-slave
  40.   type: NodePort
  41.   sessionAffinity: ClientIP
  42. ---
  43. apiVersion: apps/v1
  44. kind: StatefulSet
  45. metadata:
  46.   name: deploy-mysql-slave-01  # MySQL从节点StatefulSet名称
  47.   namespace: deploy-mysql  # 部署的命名空间
  48. spec:
  49.   selector:
  50.     matchLabels:
  51.       app: mysql-slave-01
  52.   serviceName: "deploy-mysql-slave-svc"  # 关联的Service名称
  53.   replicas: 1
  54.   template:
  55.     metadata:
  56.       labels:
  57.         app: mysql-slave-01
  58.     spec:
  59.       terminationGracePeriodSeconds: 10
  60.       containers:
  61.       - args:
  62.         - --character-set-server=utf8mb4
  63.         - --collation-server=utf8mb4_unicode_ci
  64.         - --lower_case_table_names=1
  65.         - --default-time_zone=+8:00
  66.         name: mysql
  67.         # image: docker.io/library/mysql:8.0.34
  68.         image: mysql:8.0.34  # MySQL镜像地址
  69.         ports:
  70.         - containerPort: 3306
  71.           name: mysql
  72.         volumeMounts:
  73.         - name: mysql-data
  74.           mountPath: /var/lib/mysql
  75.         - name: mysql-conf
  76.           mountPath: /etc/my.cnf
  77.           readOnly: true
  78.           subPath: my.cnf
  79.         env:
  80.         - name: MYSQL_ROOT_PASSWORD
  81.           valueFrom:
  82.             secretKeyRef:
  83.               key: mysql_root_password
  84.               name: mysql-password
  85.       volumes:
  86.       - name: mysql-data
  87.         persistentVolumeClaim:
  88.           claimName: deploy-mysql-slave01-nfs-pvc  # 持久卷声明名称
  89.       - name: mysql-conf
  90.         configMap:
  91.           name: mysql-slave01-configmap # ConfigMap名称
  92.           items:
  93.           - key: my.cnf
  94.             mode: 0644
  95.             path: my.cnf
复制代码
应用 YAML 文件到 Kubernetes 集群
  1. [root@master ~]# kubectl apply -f mysql-slave01-configmap.yaml
  2. configmap/mysql-slave01-configmap created
  3. service/deploy-mysql-slave-svc created
  4. statefulset.apps/deploy-mysql-slave-01 created
复制代码
获取在指定命名空间(deploy-mysql)中所有资源的具体信息
  1. [root@master ~]# kubectl get all -o wide -n deploy-mysql
  2. NAME                          READY   STATUS    RESTARTS   AGE    IP                NODE     NOMINATED NODE   READINESS GATES
  3. pod/deploy-mysql-master-0     1/1     Running   0          138m   192.168.196.133   node01   <none>           <none>
  4. pod/deploy-mysql-slave-01-0   1/1     Running   0          6s     192.168.196.134   node01   <none>           <none>
  5. NAME                              TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE    SELECTOR
  6. service/deploy-mysql-master-svc   NodePort   10.109.46.105   <none>        3306:30306/TCP   138m   app=mysql-master
  7. service/deploy-mysql-slave-svc    NodePort   10.99.187.187   <none>        3306:30308/TCP   6s     app=mysql-slave
  8. NAME                                     READY   AGE    CONTAINERS   IMAGES
  9. statefulset.apps/deploy-mysql-master     1/1     138m   mysql        mysql:8.0.34
  10. statefulset.apps/deploy-mysql-slave-01   1/1     6s     mysql        mysql:8.0.34
复制代码
搭建部署mysql主节点slave02

创建持久卷(PV)和持久卷声明(PVC)
  1. [root@master ~]# vim mysql-slave02-pv-pvc.yaml
复制代码
  1. apiVersion: v1
  2. kind: PersistentVolume
  3. metadata:
  4.   name: deploy-mysql-slave02-nfs-pv  # PV 的名称
  5.   namespace: deploy-mysql  # PV 所属的命名空间
  6. spec:
  7.   capacity:
  8.     storage: 1Gi  # PV 的存储容量为 1GB(根据实际调整)
  9.   accessModes:
  10.     - ReadWriteMany  # 允许多个 Pod 同时对 PV 进行读写访问
  11.   nfs:
  12.     server: 10.62.158.203  # NFS 服务器的 IP 地址
  13.     path: /data/nfs/mysql-slaver-02  # NFS 服务器上暴露的目录路径
  14.   storageClassName: "nfs"  # PV 使用的存储类名称为 "nfs"
  15. ---
  16. apiVersion: v1
  17. kind: PersistentVolumeClaim
  18. metadata:
  19.   name: deploy-mysql-slave02-nfs-pvc  # PVC 的名称
  20.   namespace: deploy-mysql  # PVC 所属的命名空间
  21. spec:
  22.   accessModes:
  23.     - ReadWriteMany  # PVC 的访问模式为 ReadWriteMany
  24.   storageClassName: "nfs"  # PVC 使用的存储类名称为 "nfs"
  25.   resources:
  26.     requests:
  27.       storage: 1Gi  # 请求 1GB 的存储空间
  28.   volumeName: deploy-mysql-slave02-nfs-pv  # 将 PVC 绑定到 PV 的名称为 "deploy-mysql-master-nfs-pv"
复制代码
创建 PV 和 PVC
  1. [root@master ~]# kubectl apply -f mysql-slave02-pv-pvc.yaml
  2. persistentvolume/deploy-mysql-slave02-nfs-pv created
  3. persistentvolumeclaim/deploy-mysql-slave02-nfs-pvc created
复制代码
检察PV 和 PVC
  1. [root@master ~]# kubectl get pv,pvc -n deploy-mysql
  2. NAME                                           CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                                       STORAGECLASS   REASON   AGE
  3. persistentvolume/deploy-mysql-master-nfs-pv    5Gi        RWX            Retain           Bound    deploy-mysql/deploy-mysql-master-nfs-pvc    nfs                     147m
  4. persistentvolume/deploy-mysql-slave01-nfs-pv   1Gi        RWX            Retain           Bound    deploy-mysql/deploy-mysql-slave01-nfs-pvc   nfs                     33m
  5. persistentvolume/deploy-mysql-slave02-nfs-pv   1Gi        RWX            Retain           Bound    deploy-mysql/deploy-mysql-slave02-nfs-pvc   nfs                     25s
  6. NAME                                                 STATUS   VOLUME                        CAPACITY   ACCESS MODES   STORAGECLASS   AGE
  7. persistentvolumeclaim/deploy-mysql-master-nfs-pvc    Bound    deploy-mysql-master-nfs-pv    5Gi        RWX            nfs            147m
  8. persistentvolumeclaim/deploy-mysql-slave01-nfs-pvc   Bound    deploy-mysql-slave01-nfs-pv   1Gi        RWX            nfs            33m
  9. persistentvolumeclaim/deploy-mysql-slave02-nfs-pvc   Bound    deploy-mysql-slave02-nfs-pv   1Gi        RWX            nfs            25s
复制代码
创建 salve02 从节点的 mysql 设置文件
  1. [root@master ~]# vim my.cnf
复制代码
  1. [mysqld]
  2. skip-host-cache  # 不使用主机缓存
  3. skip-name-resolve  # 不进行主机名解析
  4. datadir          = /var/lib/mysql  # MySQL 数据目录
  5. socket           = /var/run/mysqld/mysqld.sock  # MySQL Socket 文件路径
  6. secure-file-priv = /var/lib/mysql-files  # 安全文件目录
  7. pid-file         = /var/run/mysqld/mysqld.pid  # MySQL 进程 ID 文件路径
  8. user             = mysql  # MySQL 运行用户
  9. secure-file-priv = NULL  # 安全文件权限设置
  10. server-id        = 3  # 从节点服务器 ID
  11. log-bin          = slave-bin  # 二进制日志文件名
  12. relay-log        = slave-relay-bin  # 中继日志文件名
  13. relay-log-index  = slave-relay-bin.index  # 中继日志索引文件名
  14. [client]
  15. socket           = /var/run/mysqld/mysqld.sock  # MySQL 客户端 Socket 文件路径
复制代码
天生 slave02 节点的 mysql ConfigMap 的 YAML 资源形貌文件
  1. [root@master ~]# kubectl create configmap mysql-slave02-configmap -n deploy-mysql --from-file=my.cnf --dry-run=client -o yaml
  2. apiVersion: v1
  3. data:
  4.   my.cnf: |
  5.     [mysqld]
  6.     skip-host-cache  # 不使用主机缓存
  7.     skip-name-resolve  # 不进行主机名解析
  8.     datadir          = /var/lib/mysql  # MySQL 数据目录
  9.     socket           = /var/run/mysqld/mysqld.sock  # MySQL Socket 文件路径
  10.     secure-file-priv = /var/lib/mysql-files  # 安全文件目录
  11.     pid-file         = /var/run/mysqld/mysqld.pid  # MySQL 进程 ID 文件路径
  12.     user             = mysql  # MySQL 运行用户
  13.     secure-file-priv = NULL  # 安全文件权限设置
  14.     server-id        = 3  # 从节点服务器 ID
  15.     log-bin          = slave-bin  # 二进制日志文件名
  16.     relay-log        = slave-relay-bin  # 中继日志文件名
  17.     relay-log-index  = slave-relay-bin.index  # 中继日志索引文件名
  18.     [client]
  19.     socket           = /var/run/mysqld/mysqld.sock  # MySQL 客户端 Socket 文件路径
  20. kind: ConfigMap
  21. metadata:
  22.   creationTimestamp: null
  23.   name: mysql-slave02-configmap
  24.   namespace: deploy-mysql
复制代码
复制生存天生后的内容为文件 mysql-slave02-configmap.yaml,添加svc、StatefulSet的设置
  1. [root@master ~]# vim mysql-slave02-configmap.yaml
复制代码
  1. apiVersion: v1
  2. data:
  3.   my.cnf: |
  4.     [mysqld]
  5.     skip-host-cache  # 不使用主机缓存
  6.     skip-name-resolve  # 不进行主机名解析
  7.     datadir          = /var/lib/mysql  # MySQL 数据目录
  8.     socket           = /var/run/mysqld/mysqld.sock  # MySQL Socket 文件路径
  9.     secure-file-priv = /var/lib/mysql-files  # 安全文件目录
  10.     pid-file         = /var/run/mysqld/mysqld.pid  # MySQL 进程 ID 文件路径
  11.     user             = mysql  # MySQL 运行用户
  12.     secure-file-priv = NULL  # 安全文件权限设置
  13.     server-id        = 3  # 从节点服务器 ID
  14.     log-bin          = slave-bin  # 二进制日志文件名
  15.     relay-log        = slave-relay-bin  # 中继日志文件名
  16.     relay-log-index  = slave-relay-bin.index  # 中继日志索引文件名
  17.     [client]
  18.     socket           = /var/run/mysqld/mysqld.sock  # MySQL 客户端 Socket 文件路径
  19. kind: ConfigMap
  20. metadata:
  21.   creationTimestamp: null
  22.   name: mysql-slave02-configmap
  23.   namespace: deploy-mysql
  24. ---
  25. apiVersion: apps/v1
  26. kind: StatefulSet
  27. metadata:
  28.   name: deploy-mysql-slave-02  # MySQL从节点StatefulSet名称
  29.   namespace: deploy-mysql  # 部署的命名空间
  30. spec:
  31.   selector:
  32.     matchLabels:
  33.       app: mysql-slave-02
  34.   serviceName: "deploy-mysql-slave-svc"  # 关联的Service名称
  35.   replicas: 1
  36.   template:
  37.     metadata:
  38.       labels:
  39.         app: mysql-slave-02
  40.     spec:
  41.       terminationGracePeriodSeconds: 10
  42.       containers:
  43.       - args:
  44.         - --character-set-server=utf8mb4
  45.         - --collation-server=utf8mb4_unicode_ci
  46.         - --lower_case_table_names=1
  47.         - --default-time_zone=+8:00
  48.         name: mysql
  49.         # image: docker.io/library/mysql:8.0.34
  50.         image: mysql:8.0.34  # MySQL镜像地址
  51.         ports:
  52.         - containerPort: 3306
  53.           name: mysql
  54.         volumeMounts:
  55.         - name: mysql-data
  56.           mountPath: /var/lib/mysql
  57.         - name: mysql-conf
  58.           mountPath: /etc/my.cnf
  59.           readOnly: true
  60.           subPath: my.cnf
  61.         env:
  62.         - name: MYSQL_ROOT_PASSWORD
  63.           valueFrom:
  64.             secretKeyRef:
  65.               key: mysql_root_password
  66.               name: mysql-password
  67.       volumes:
  68.       - name: mysql-data
  69.         persistentVolumeClaim:
  70.           claimName: deploy-mysql-slave02-nfs-pvc  # 持久卷声明名称
  71.       - name: mysql-conf
  72.         configMap:
  73.           name: mysql-slave02-configmap # ConfigMap名称
  74.           items:
  75.           - key: my.cnf
  76.             mode: 0644
  77.             path: my.cnf
复制代码
应用 YAML 文件到 Kubernetes 集群
  1. [root@master ~]# kubectl apply -f mysql-slave02-configmap.yaml
  2. configmap/mysql-slave02-configmap created
  3. statefulset.apps/deploy-mysql-slave-02 created
复制代码
获取在指定命名空间(deploy-mysql)中所有资源的具体信息
  1. [root@master ~]# kubectl get all -o wide -n deploy-mysql
  2. NAME                          READY   STATUS    RESTARTS   AGE    IP                NODE     NOMINATED NODE   READINESS GATES
  3. pod/deploy-mysql-master-0     1/1     Running   0          165m   192.168.196.133   node01   <none>           <none>
  4. pod/deploy-mysql-slave-01-0   1/1     Running   0          27m    192.168.196.134   node01   <none>           <none>
  5. pod/deploy-mysql-slave-02-0   1/1     Running   0          9s     192.168.196.135   node01   <none>           <none>
  6. NAME                              TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE    SELECTOR
  7. service/deploy-mysql-master-svc   NodePort   10.109.46.105   <none>        3306:30306/TCP   165m   app=mysql-master
  8. service/deploy-mysql-slave-svc    NodePort   10.99.187.187   <none>        3306:30308/TCP   27m    app=mysql-slave
  9. NAME                                     READY   AGE    CONTAINERS   IMAGES
  10. statefulset.apps/deploy-mysql-master     1/1     165m   mysql        mysql:8.0.34
  11. statefulset.apps/deploy-mysql-slave-01   1/1     27m    mysql        mysql:8.0.34
  12. statefulset.apps/deploy-mysql-slave-02   1/1     9s     mysql        mysql:8.0.34
复制代码
使三台服务器组成一个集群

启动一个交互式会话,毗连到名为 deploy-mysql-master-0 的 Pod,检察主节点的状态
  1. [root@master ~]# kubectl exec -it -n deploy-mysql deploy-mysql-master-0 -- mysql -uroot -p
  2. Enter password:
复制代码
检察主节点的状态
  1. mysql> show master status;
  2. +-------------------+----------+--------------+-------------------------------------------------+-------------------+
  3. | File              | Position | Binlog_Do_DB | Binlog_Ignore_DB                                | Executed_Gtid_Set |
  4. +-------------------+----------+--------------+-------------------------------------------------+-------------------+
  5. | master-bin.000005 |      157 | db_k8s       | information_schema,mysql,performance_schema,sys |                   |
  6. +-------------------+----------+--------------+-------------------------------------------------+-------------------+
  7. 1 row in set (0.00 sec)
复制代码
设置从节点(Slave)毗连到主节点(Master)

  1. CHANGE MASTER TO
  2.     MASTER_HOST='deploy-mysql-master-0.deploy-mysql-master-svc.deploy-mysql.svc.cluster.local',
  3.     MASTER_PORT=3306,
  4.     MASTER_USER='root',
  5.     MASTER_PASSWORD='root',
  6.     MASTER_LOG_FILE='master-bin.000003',
  7.     MASTER_LOG_POS=157,
  8.     MASTER_CONNECT_RETRY=30,
  9.     GET_MASTER_PUBLIC_KEY=1;
复制代码

  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
  2. master_port: 主节点的mysql端口,我们没改默认是3306
  3. master_user: 登录到主节点的mysql用户
  4. master_password: 登录到主节点要用到的密码
  5. master_log_file: 我们之前查看mysql主节点状态时候的 File 字段
  6. master_log_pos: 我们之前查看mysql主节点状态时候的 Position 字段
  7. master_connect_retry: 主节点重连时间
  8. get_master_public_key: 连接主mysql的公钥获取方式
复制代码
slave01 加入master

进入deploy-mysql-slave-01-0 的 Pod,暗码root
  1. [root@master ~]# kubectl exec -itn deploy-mysql pod/deploy-mysql-slave-01-0 -- mysql -uroot -p
复制代码
设置从节点(Slave)毗连到主节点(Master)的参数,实行以下命令来设置它们毗连到主节点
  1. CHANGE MASTER TO
  2.     MASTER_HOST='deploy-mysql-master-0.deploy-mysql-master-svc.deploy-mysql.svc.cluster.local',
  3.     MASTER_PORT=3306,
  4.     MASTER_USER='root',
  5.     MASTER_PASSWORD='root',
  6.     MASTER_LOG_FILE='master-bin.000005',
  7.     MASTER_LOG_POS=157,
  8.     MASTER_CONNECT_RETRY=30,
  9.     GET_MASTER_PUBLIC_KEY=1;
复制代码

启动从节点的复制进程
  1. mysql> start slave;
  2. Query OK, 0 rows affected, 1 warning (0.01 sec)
复制代码
检察slave状态
  1. mysql> show slave status;
复制代码
slave02 加入master

进入deploy-mysql-slave-02-0 的 Pod,暗码root
  1. [root@master ~]# kubectl exec -itn deploy-mysql pod/deploy-mysql-slave-02-0 -- mysql -uroot -p
复制代码
设置从节点(Slave)毗连到主节点(Master)的参数,实行以下命令来设置它们毗连到主节点
  1. CHANGE MASTER TO
  2.     MASTER_HOST='deploy-mysql-master-0.deploy-mysql-master-svc.deploy-mysql.svc.cluster.local',
  3.     MASTER_PORT=3306,
  4.     MASTER_USER='root',
  5.     MASTER_PASSWORD='root',
  6.     MASTER_LOG_FILE='master-bin.000005',
  7.     MASTER_LOG_POS=157,
  8.     MASTER_CONNECT_RETRY=30,
  9.     GET_MASTER_PUBLIC_KEY=1;
复制代码

启动从节点的复制进程
  1. mysql> start slave;
  2. Query OK, 0 rows affected, 1 warning (0.01 sec)
复制代码
检察slave状态
  1. mysql> show slave status;
复制代码
验证集群主从复制结果



免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4