0


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[root@localhost ~]# ls
  2. anaconda-ks.cfg sysconfigure.sh
  3. [root@localhost ~]# exit
  4. 登出
  5. Connection closed by foreign host.
  6. 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)/data/nfs/mysql-slaver-01 10.62.158.*(rw,sync,no_root_squash)/data/nfs/mysql-slaver-02 10.62.158.*(rw,sync,no_root_squash)
  3. EOF
安装NFS共享存储服务【客户端】

k8s集群节点也需要安装

  1. nfs-utils

用于访问NFS服务端(

  1. nfs-utils

中不仅包含服务端程序,也包含客户端程序,不需要启动NFS程序,仅安装即可),否则无法访问NFS服务端

  • master & node01 & node02 节点安装客户端
  1. [root@master ~]# yum install nfs-utils -y
  1. [root@node01 ~]# yum install nfs-utils -y
  1. [root@node02 ~]# yum install nfs-utils -y
  • master & node01 & node02 节点访问NFS服务端,查看共享信息,此时 master 节点 & node01节点 & node02节点 就可以使用共享目录进行文件的读写操作了
  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.*/data/nfs/mysql-slaver-01 10.62.158.*/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.*/data/nfs/mysql-slaver-01 10.62.158.*/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.*/data/nfs/mysql-slaver-01 10.62.158.*/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 TYPEDATA 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. apiVersion: v1
  16. kind: PersistentVolumeClaim
  17. metadata:
  18. name: deploy-mysql-master-nfs-pvc # PVC 的名称
  19. namespace: deploy-mysql # PVC 所属的命名空间
  20. spec:
  21. accessModes:
  22. - ReadWriteMany # PVC 的访问模式为 ReadWriteMany
  23. storageClassName: "nfs"# PVC 使用的存储类名称为 "nfs"
  24. resources:
  25. requests:
  26. storage: 1Gi # 请求 1GB 的存储空间
  27. 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]skip-host-cache # 不使用主机缓存skip-name-resolve # 不解析主机名
  2. datadir = /var/lib/mysql # 数据文件存放目录
  3. socket = /var/run/mysqld/mysqld.sock # MySQL服务器套接字文件路径
  4. secure-file-priv = /var/lib/mysql-files # 指定安全文件的位置
  5. pid-file = /var/run/mysqld/mysqld.pid # PID文件路径
  6. user = mysql # MySQL服务运行的用户
  7. secure-file-priv = NULL # 禁用安全文件访问限制
  8. server-id = 1 # 服务器唯一标识符
  9. log-bin = master-bin # 启用二进制日志,并指定日志文件名
  10. log_bin_index = master-bin.index # 二进制日志索引文件路径
  11. binlog_do_db = db_k8s # 仅记录指定数据库的操作到二进制日志
  12. binlog_ignore_db = information_schema # 忽略记录指定数据库的操作到二进制日志
  13. binlog_ignore_db = mysql # 忽略记录指定数据库的操作到二进制日志
  14. binlog_ignore_db = performance_schema # 忽略记录指定数据库的操作到二进制日志
  15. binlog_ignore_db = sys # 忽略记录指定数据库的操作到二进制日志
  16. binlog-format = ROW # 设置二进制日志格式为行格式[client]
  17. socket = /var/run/mysqld/mysqld.sock # 客户端连接MySQL服务器时使用的套接字文件路径!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: |[mysqld]skip-host-cache # 不使用主机缓存skip-name-resolve # 不解析主机名
  5. datadir = /var/lib/mysql # 数据文件存放目录
  6. socket = /var/run/mysqld/mysqld.sock # MySQL服务器套接字文件路径
  7. secure-file-priv = /var/lib/mysql-files # 指定安全文件的位置
  8. pid-file = /var/run/mysqld/mysqld.pid # PID文件路径
  9. user = mysql # MySQL服务运行的用户
  10. secure-file-priv = NULL # 禁用安全文件访问限制
  11. server-id = 1 # 服务器唯一标识符
  12. log-bin = master-bin # 启用二进制日志,并指定日志文件名
  13. log_bin_index = master-bin.index # 二进制日志索引文件路径
  14. binlog_do_db = db_k8s # 仅记录指定数据库的操作到二进制日志
  15. binlog_ignore_db = information_schema # 忽略记录指定数据库的操作到二进制日志
  16. binlog_ignore_db = mysql # 忽略记录指定数据库的操作到二进制日志
  17. binlog_ignore_db = performance_schema # 忽略记录指定数据库的操作到二进制日志
  18. binlog_ignore_db = sys # 忽略记录指定数据库的操作到二进制日志
  19. binlog-format = ROW # 设置二进制日志格式为行格式[client]
  20. socket = /var/run/mysqld/mysqld.sock # 客户端连接MySQL服务器时使用的套接字文件路径!includedir /etc/mysql/conf.d/ # 包含额外的配置文件目录
  21. kind: ConfigMap
  22. metadata:
  23. creationTimestamp: null
  24. name: mysql-master-configmap
  25. 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: |+[mysqld]skip-host-cache # 不使用主机缓存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. binlog_do_db = db_k8s # 仅记录指定数据库的操作到二进制日志
  13. log_bin_index = master-bin.index # 二进制日志索引文件路径
  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 # 设置二进制日志格式为行格式[client]
  19. socket = /var/run/mysqld/mysqld.sock # 客户端连接MySQL服务器时使用的套接字文件路径
  20. kind: ConfigMap
  21. metadata:
  22. creationTimestamp: null
  23. name: mysql-master-configmap
  24. namespace: deploy-mysql
  25. ---
  26. apiVersion: v1
  27. kind: Service
  28. metadata:
  29. name: deploy-mysql-master-svc # 定义服务的名称
  30. namespace: deploy-mysql # 定义服务所属的命名空间
  31. labels:
  32. app: mysql-master
  33. spec:
  34. ports:
  35. - port: 3306 # 服务暴露的端口号
  36. name: mysql
  37. targetPort: 3306
  38. nodePort: 30306 # NodePort 类型服务的端口
  39. selector:
  40. app: mysql-master # 选择器,选择哪些 Pod 作为后端type: NodePort # 服务类型为 NodePort
  41. sessionAffinity: ClientIP # 会话亲和性设置为 ClientIP---
  42. apiVersion: apps/v1
  43. kind: StatefulSet
  44. metadata:
  45. name: deploy-mysql-master # StatefulSet 的名称
  46. namespace: deploy-mysql # StatefulSet 所属的命名空间
  47. spec:
  48. selector:
  49. matchLabels:
  50. app: mysql-master # 选择器,用于选择管理的 Pod
  51. serviceName: "deploy-mysql-master-svc"# 关联的 Service 的名称
  52. replicas: 1 # 副本数
  53. template:
  54. metadata:
  55. labels:
  56. app: mysql-master # Pod 模板的标签
  57. spec:
  58. terminationGracePeriodSeconds: 10 # 终止优雅期的秒数
  59. containers:
  60. - args:
  61. ---character-set-server=utf8mb4 # MySQL 参数设置---collation-server=utf8mb4_unicode_ci
  62. ---lower_case_table_names=1
  63. ---default-time_zone=+8:00
  64. name: mysql # 容器的名称
  65. image: mysql:8.0.34 # 容器镜像
  66. ports:
  67. - containerPort: 3306 # 容器监听的端口号
  68. name: mysql
  69. volumeMounts:
  70. - name: mysql-data# 挂载的持久化卷
  71. mountPath: /var/lib/mysql
  72. - name: mysql-conf # 挂载的 ConfigMap
  73. mountPath: /etc/my.cnf
  74. readOnly: true
  75. subPath: my.cnf
  76. env: # 容器的环境变量- name: MYSQL_ROOT_PASSWORD
  77. valueFrom:
  78. secretKeyRef:
  79. key: mysql_root_password
  80. name: mysql-password # 引用的 Secret 的名称
  81. volumes:
  82. - name: mysql-data# 持久化卷的名称
  83. persistentVolumeClaim:
  84. claimName: deploy-mysql-master-nfs-pvc # 持久化卷声明的名称- name: mysql-conf # ConfigMap 的名称
  85. configMap:
  86. name: mysql-master-configmap # ConfigMap 的名称
  87. items:
  88. - key: my.cnf # ConfigMap 中的键值对
  89. mode: 0644 # 文件权限
  90. 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-rw-r----- 1 polkitd input 8585216 4月 19 10:55 #ib_16384_1.dblwr-rw-r----- 1 polkitd input 3541 4月 19 11:07 ib_buffer_pool
  9. -rw-r----- 1 polkitd input 12582912 4 19 11:09 ibdata1
  10. -rw-r----- 1 polkitd input 12582912 4 19 11:10 ibtmp1
  11. drwxr-x--- 2 polkitd input 4096 4 19 11:09 #innodb_redo
  12. drwxr-x--- 2 polkitd input 187 4 19 11:09 #innodb_temp-rw-r----- 1 polkitd input 180 4月 19 10:55 master-bin.000001
  13. -rw-r----- 1 polkitd input 180 4 19 10:55 master-bin.000002
  14. -rw-r----- 1 polkitd input 180 4 19 10:59 master-bin.000003
  15. -rw-r----- 1 polkitd input 180 4 19 11:07 master-bin.000004
  16. -rw-r----- 1 polkitd input 157 4 19 11:09 master-bin.000005
  17. -rw-r----- 1 polkitd input 100 4 19 11:09 master-bin.index
  18. drwxr-x--- 2 polkitd input 143 4 19 10:55 mysql
  19. -rw-r----- 1 polkitd input 31457280 4 19 11:09 mysql.ibd
  20. lrwxrwxrwx 1 polkitd input 27 4 19 11:09 mysql.sock -> /var/run/mysqld/mysqld.sock
  21. drwxr-x--- 2 polkitd input 8192 4 19 10:55 performance_schema
  22. -rw------- 1 polkitd input 1676 4 19 10:55 private_key.pem
  23. -rw-r--r-- 1 polkitd input 452 4 19 10:55 public_key.pem
  24. -rw-r--r-- 1 polkitd input 1112 4 19 10:55 server-cert.pem
  25. -rw------- 1 polkitd input 1680 4 19 10:55 server-key.pem
  26. drwxr-x--- 2 polkitd input 28 4 19 10:55 sys
  27. -rw-r----- 1 polkitd input 16777216 4 19 11:11 undo_001
  28. -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. apiVersion: v1
  16. kind: PersistentVolumeClaim
  17. metadata:
  18. name: deploy-mysql-slave01-nfs-pvc # PVC 的名称
  19. namespace: deploy-mysql # PVC 所属的命名空间
  20. spec:
  21. accessModes:
  22. - ReadWriteMany # PVC 的访问模式为 ReadWriteMany
  23. storageClassName: "nfs"# PVC 使用的存储类名称为 "nfs"
  24. resources:
  25. requests:
  26. storage: 1Gi # 请求 1GB 的存储空间
  27. 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]skip-host-cache # 不使用主机缓存skip-name-resolve # 不进行主机名解析
  2. datadir = /var/lib/mysql # MySQL 数据目录
  3. socket = /var/run/mysqld/mysqld.sock # MySQL Socket 文件路径
  4. secure-file-priv = /var/lib/mysql-files # 安全文件目录
  5. pid-file = /var/run/mysqld/mysqld.pid # MySQL 进程 ID 文件路径
  6. user = mysql # MySQL 运行用户
  7. secure-file-priv = NULL # 安全文件权限设置
  8. server-id = 2 # 从节点服务器 ID
  9. log-bin = slave-bin # 二进制日志文件名
  10. relay-log = slave-relay-bin # 中继日志文件名
  11. relay-log-index = slave-relay-bin.index # 中继日志索引文件名[client]
  12. 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: |[mysqld]skip-host-cache # 不使用主机缓存skip-name-resolve # 不进行主机名解析
  5. datadir = /var/lib/mysql # MySQL 数据目录
  6. socket = /var/run/mysqld/mysqld.sock # MySQL Socket 文件路径
  7. secure-file-priv = /var/lib/mysql-files # 安全文件目录
  8. pid-file = /var/run/mysqld/mysqld.pid # MySQL 进程 ID 文件路径
  9. user = mysql # MySQL 运行用户
  10. secure-file-priv = NULL # 安全文件权限设置
  11. server-id = 2 # 从节点服务器 ID
  12. log-bin = slave-bin # 二进制日志文件名
  13. relay-log = slave-relay-bin # 中继日志文件名
  14. relay-log-index = slave-relay-bin.index # 中继日志索引文件名[client]
  15. socket = /var/run/mysqld/mysqld.sock # MySQL 客户端 Socket 文件路径
  16. kind: ConfigMap
  17. metadata:
  18. creationTimestamp: null
  19. name: mysql-slave01-configmap
  20. 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: |[mysqld]skip-host-cache # 不使用主机缓存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 # 中继日志索引文件名[client]
  14. socket = /var/run/mysqld/mysqld.sock # MySQL 客户端 Socket 文件路径
  15. kind: ConfigMap
  16. metadata:
  17. creationTimestamp: null
  18. name: mysql-slave01-configmap
  19. namespace: deploy-mysql
  20. ---
  21. apiVersion: v1
  22. kind: Service
  23. metadata:
  24. name: deploy-mysql-slave-svc # MySQL从节点服务名称
  25. namespace: deploy-mysql # 部署的命名空间
  26. labels:
  27. app: mysql-slave
  28. spec:
  29. ports:
  30. - port: 3306
  31. name: mysql
  32. targetPort: 3306
  33. nodePort: 30308 # 暴露的节点端口
  34. selector:
  35. app: mysql-slave
  36. type: NodePort
  37. sessionAffinity: ClientIP
  38. ---
  39. apiVersion: apps/v1
  40. kind: StatefulSet
  41. metadata:
  42. name: deploy-mysql-slave-01 # MySQL从节点StatefulSet名称
  43. namespace: deploy-mysql # 部署的命名空间
  44. spec:
  45. selector:
  46. matchLabels:
  47. app: mysql-slave-01
  48. serviceName: "deploy-mysql-slave-svc"# 关联的Service名称
  49. replicas: 1
  50. template:
  51. metadata:
  52. labels:
  53. app: mysql-slave-01
  54. spec:
  55. terminationGracePeriodSeconds: 10
  56. containers:
  57. - args:
  58. ---character-set-server=utf8mb4
  59. ---collation-server=utf8mb4_unicode_ci
  60. ---lower_case_table_names=1
  61. ---default-time_zone=+8:00
  62. name: mysql
  63. # image: docker.io/library/mysql:8.0.34
  64. image: mysql:8.0.34 # MySQL镜像地址
  65. ports:
  66. - containerPort: 3306
  67. name: mysql
  68. volumeMounts:
  69. - name: mysql-data
  70. mountPath: /var/lib/mysql
  71. - name: mysql-conf
  72. mountPath: /etc/my.cnf
  73. readOnly: true
  74. subPath: my.cnf
  75. env:
  76. - name: MYSQL_ROOT_PASSWORD
  77. valueFrom:
  78. secretKeyRef:
  79. key: mysql_root_password
  80. name: mysql-password
  81. volumes:
  82. - name: mysql-data
  83. persistentVolumeClaim:
  84. claimName: deploy-mysql-slave01-nfs-pvc # 持久卷声明名称- name: mysql-conf
  85. configMap:
  86. name: mysql-slave01-configmap # ConfigMap名称
  87. items:
  88. - key: my.cnf
  89. mode: 0644
  90. 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. apiVersion: v1
  16. kind: PersistentVolumeClaim
  17. metadata:
  18. name: deploy-mysql-slave02-nfs-pvc # PVC 的名称
  19. namespace: deploy-mysql # PVC 所属的命名空间
  20. spec:
  21. accessModes:
  22. - ReadWriteMany # PVC 的访问模式为 ReadWriteMany
  23. storageClassName: "nfs"# PVC 使用的存储类名称为 "nfs"
  24. resources:
  25. requests:
  26. storage: 1Gi # 请求 1GB 的存储空间
  27. 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]skip-host-cache # 不使用主机缓存skip-name-resolve # 不进行主机名解析
  2. datadir = /var/lib/mysql # MySQL 数据目录
  3. socket = /var/run/mysqld/mysqld.sock # MySQL Socket 文件路径
  4. secure-file-priv = /var/lib/mysql-files # 安全文件目录
  5. pid-file = /var/run/mysqld/mysqld.pid # MySQL 进程 ID 文件路径
  6. user = mysql # MySQL 运行用户
  7. secure-file-priv = NULL # 安全文件权限设置
  8. server-id = 3 # 从节点服务器 ID
  9. log-bin = slave-bin # 二进制日志文件名
  10. relay-log = slave-relay-bin # 中继日志文件名
  11. relay-log-index = slave-relay-bin.index # 中继日志索引文件名[client]
  12. 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: |[mysqld]skip-host-cache # 不使用主机缓存skip-name-resolve # 不进行主机名解析
  5. datadir = /var/lib/mysql # MySQL 数据目录
  6. socket = /var/run/mysqld/mysqld.sock # MySQL Socket 文件路径
  7. secure-file-priv = /var/lib/mysql-files # 安全文件目录
  8. pid-file = /var/run/mysqld/mysqld.pid # MySQL 进程 ID 文件路径
  9. user = mysql # MySQL 运行用户
  10. secure-file-priv = NULL # 安全文件权限设置
  11. server-id = 3 # 从节点服务器 ID
  12. log-bin = slave-bin # 二进制日志文件名
  13. relay-log = slave-relay-bin # 中继日志文件名
  14. relay-log-index = slave-relay-bin.index # 中继日志索引文件名[client]
  15. socket = /var/run/mysqld/mysqld.sock # MySQL 客户端 Socket 文件路径
  16. kind: ConfigMap
  17. metadata:
  18. creationTimestamp: null
  19. name: mysql-slave02-configmap
  20. 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: |[mysqld]skip-host-cache # 不使用主机缓存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 # 中继日志索引文件名[client]
  14. socket = /var/run/mysqld/mysqld.sock # MySQL 客户端 Socket 文件路径
  15. kind: ConfigMap
  16. metadata:
  17. creationTimestamp: null
  18. name: mysql-slave02-configmap
  19. namespace: deploy-mysql
  20. ---
  21. apiVersion: apps/v1
  22. kind: StatefulSet
  23. metadata:
  24. name: deploy-mysql-slave-02 # MySQL从节点StatefulSet名称
  25. namespace: deploy-mysql # 部署的命名空间
  26. spec:
  27. selector:
  28. matchLabels:
  29. app: mysql-slave-02
  30. serviceName: "deploy-mysql-slave-svc"# 关联的Service名称
  31. replicas: 1
  32. template:
  33. metadata:
  34. labels:
  35. app: mysql-slave-02
  36. spec:
  37. terminationGracePeriodSeconds: 10
  38. containers:
  39. - args:
  40. ---character-set-server=utf8mb4
  41. ---collation-server=utf8mb4_unicode_ci
  42. ---lower_case_table_names=1
  43. ---default-time_zone=+8:00
  44. name: mysql
  45. # image: docker.io/library/mysql:8.0.34
  46. image: mysql:8.0.34 # MySQL镜像地址
  47. ports:
  48. - containerPort: 3306
  49. name: mysql
  50. volumeMounts:
  51. - name: mysql-data
  52. mountPath: /var/lib/mysql
  53. - name: mysql-conf
  54. mountPath: /etc/my.cnf
  55. readOnly: true
  56. subPath: my.cnf
  57. env:
  58. - name: MYSQL_ROOT_PASSWORD
  59. valueFrom:
  60. secretKeyRef:
  61. key: mysql_root_password
  62. name: mysql-password
  63. volumes:
  64. - name: mysql-data
  65. persistentVolumeClaim:
  66. claimName: deploy-mysql-slave02-nfs-pvc # 持久卷声明名称- name: mysql-conf
  67. configMap:
  68. name: mysql-slave02-configmap # ConfigMap名称
  69. items:
  70. - key: my.cnf
  71. mode: 0644
  72. 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;+-------------------+----------+--------------+-------------------------------------------------+-------------------+| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |+-------------------+----------+--------------+-------------------------------------------------+-------------------+| master-bin.000005 | 157 | db_k8s | information_schema,mysql,performance_schema,sys ||+-------------------+----------+--------------+-------------------------------------------------+-------------------+
  2. 1 row in set(0.00 sec)

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

  • 进入从节点mysql pod内部,执行以下命令加入集群中
  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 ,所以我们mastermysql地址是 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,0rows 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,0rows affected,1 warning (0.01 sec)

查看slave状态

  1. mysql>show slave status;
验证集群主从复制效果
  • 主节点操作会被同步到两个子节点中
  • 子节点操作不会被同步到主节点中
  • 子节点操作会同步到另一个自己点中在这里插入图片描述
标签: kubernetes mysql 容器

本文转载自: https://blog.csdn.net/m0_50978391/article/details/137965362
版权归原作者 长夜多忧思 所有, 如有侵权,请联系我们删除。

“K8s集群中部署Mysql一主两从集群”的评论:

还没有评论