基于kubernetes部署MySQL主从环境

部署方式

通过部署mysql主从容器,配置主从pod之间数据同步。

配置数据库访问的密码

bash 复制代码
创建 Mysql 密码的 Secret
[root@k8s-master1 master]# kubectl create secret generic mysql-password --namespace=app --from-literal=mysql_root_password=root
secret/mysql-passowrd created
You have new mail in /var/spool/mail/root
[root@k8s-master1 master]# kubectl get secret -n app
NAME                                  TYPE                                  DATA   AGE
default-token-w6q98                   kubernetes.io/service-account-token   3      48d
ingress-nginx-admission               Opaque                                3      35d
ingress-nginx-admission-token-sqbvf   kubernetes.io/service-account-token   3      35d
ingress-nginx-token-bt7g2             kubernetes.io/service-account-token   3      35d
mysql-passowrd                        Opaque                                1      6s

先配置MySQL-Master服务

配置数据卷

bash 复制代码
[root@k8s-master1 master]# cat mysql-master-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mysql-master-pvc
  namespace: app
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 2Gi
  storageClassName: nfs-client              #这里要换成你环境的storageClassName
  volumeMode: Filesystem
[root@k8s-master1 master]# kubectl apply -f mysql-master-pvc.yaml
[root@k8s-master1 master]# kubectl get pvc -n app
NAME                         STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
mysql-master-pvc             Bound    pvc-f2b5598c-4fd8-48f2-bc93-0e8c27e225ec   2Gi        RWO            nfs-client     10s

通过ConfiigMap配置MySQL的配置文件my.cnf

bash 复制代码
[root@k8s-master1 master]# cat my.cnf
[mysqld]
skip-host-cache
skip-name-resolve
datadir                = /var/lib/mysql
socket                 = /var/run/mysqld/mysqld.sock
secure-file-priv       = /var/lib/mysql-files
pid-file               = /var/run/mysqld/mysqld.pid
user                   = mysql
secure-file-priv       = NULL
server-id              = 1                              #master节点的server-id=1
log-bin                = master-bin
log_bin_index          = master-bin.index
binlog_do_db           = deploy_test
binlog_ignore_db       = information_sechema
binlog_ignore_db       = mysql
binlog_ignore_db       = performance_schema
binlog_ignore_db       = sys
binlog-format          = row

[client]
socket                 = /var/run/mysqld/mysqld.sock

!includedir  /etc/mysql/conf.d/
[root@k8s-master1 master]# kubectl create cm mysql-master-cm --from-file=my.cnf -n app
configmap/mysql-master-cm created
[root@k8s-master1 master]# kubectl get cm -n app |grep mysql
mysql-master-cm            1      19s

配置Service服务

bash 复制代码
[root@k8s-master1 master]# cat mysql-master-svc.yaml
apiVersion: v1
kind: Service
metadata:
  name: mysql-master-svc
  namespace: app
  labels:
    app: mysql-master
spec:
  ports:
  - port: 3306
    name: mysql
    targetPort: 3306
    nodePort: 30306
  selector:
    app: mysql-master
  type: NodePort
  sessionAffinity: ClientIP
[root@k8s-master1 master]# kubectl apply -f mysql-master-svc.yaml
service/mysql-master-svc created

配置主节点pod启动的StatefulSet配置文件

bash 复制代码
[root@k8s-master1 master]# cat mysql-master-StatefulSet.yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: mysql-master
  namespace: app
spec:
  selector:
    matchLabels:
      app: mysql-master
  serviceName: "mysql-master-svc"
  replicas: 1
  template:
    metadata:
      labels:
        app: mysql-master
    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: registry.cn-shenzhen.aliyuncs.com/xiaohh-docker/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: mysql-master-pvc
      - name: mysql-conf
        configMap:
          name: mysql-master-cm
          items:
          - key: my.cnf
            mode: 0644
            path: my.cnf
[root@k8s-master1 master]# kubectl apply -f mysql-master-StatefulSet.yaml
statefulset.apps/mysql-master created

检查服务的启动情况

bash 复制代码
[root@k8s-master1 master]# kubectl get pods -n app -o wide |grep mysql
mysql-master-0                              1/1     Running   0              104s    10.10.36.73      k8s-node1     <none>           <none>

配置mysql-salve

配置PVC

bash 复制代码
[root@k8s-master1 slave]# cat mysql-slave-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mysql-slave-pvc
  namespace: app
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 2Gi
  storageClassName: nfs-client
  volumeMode: Filesystem
[root@k8s-master1 slave]# kubectl apply -f mysql-slave-pvc.yaml
persistentvolumeclaim/mysql-slave-pvc created

配置ConfigMap

bash 复制代码
[root@k8s-master1 slave]# cat my.cnf
[mysqld]
skip-host-cache
skip-name-resolve
datadir                = /var/lib/mysql
socket                 = /var/run/mysqld/mysqld.sock
secure-file-priv       = /var/lib/mysql-files
pid-file               = /var/run/mysqld/mysqld.pid
user                   = mysql
secure-file-priv       = NULL
server-id              = 2                                #这个要修改
log-bin                = master-bin
log_bin_index          = master-bin.index
binlog_do_db           = deploy_test
binlog_ignore_db       = information_sechema
binlog_ignore_db       = mysql
binlog_ignore_db       = performance_schema
binlog_ignore_db       = sys
binlog-format          = row

[client]
socket                 = /var/run/mysqld/mysqld.sock

!includedir  /etc/mysql/conf.d/
[root@k8s-master1 slave]# kubectl create cm mysql-slave-cm --from-file=my.cnf -n app
configmap/mysql-slave-cm created
You have new mail in /var/spool/mail/root
[root@k8s-master1 slave]# kubectl get cm -n app |grep mysql-slave-cm
mysql-slave-cm             1      13s

配置Service

bash 复制代码
[root@k8s-master1 slave]# cat mysql-slave-svc.yaml
apiVersion: v1
kind: Service
metadata:
  name: mysql-slave-svc
  namespace: app
  labels:
    app: mysql-slave
spec:
  ports:
  - port: 3306
    name: mysql
    targetPort: 3306
    nodePort: 30307
  selector:
    app: mysql-slave
  type: NodePort
  sessionAffinity: ClientIP
[root@k8s-master1 slave]# kubectl apply -f mysql-slave-svc.yaml
service/mysql-slave-svc created

创建MySQL的Pod

bash 复制代码
[root@k8s-master1 slave]# cat mysql-slave-StatefulSet.yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: mysql-slave
  namespace: app
spec:
  selector:
    matchLabels:
      app: mysql-slave
  serviceName: "mysql-master-svc"
  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: registry.cn-shenzhen.aliyuncs.com/xiaohh-docker/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: mysql-slave-pvc
      - name: mysql-conf
        configMap:
          name: mysql-slave-cm
          items:
          - key: my.cnf
            mode: 0644
            path: my.cnf
[root@k8s-master1 slave]# kubectl apply -f mysql-slave-StatefulSet.yaml
statefulset.apps/mysql-slave created
[root@k8s-master1 slave]# kubectl get pods -n app -o wide |grep mysql
mysql-master-0                              1/1     Running   0               14m     10.10.36.73      k8s-node1     <none>           <none>
mysql-slave-0                               1/1     Running   0               38s     10.10.36.74      k8s-node1     <none>           <none>

主从POD都创建完成了,咱们登录验证一下,并配置一下主从同步

bash 复制代码
[root@k8s-master1 slave]# kubectl exec -it mysql-master-0 -n app -- mysql -uroot -proot
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.34 MySQL Community Server - GPL

Copyright (c) 2000, 2023, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

在从节点执行,配置主从关系

bash 复制代码
mysql> change master to master_host='mysql-master-0.mysql-master-svc.app.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;
Query OK, 0 rows affected, 11 warnings (0.03 sec)
master_host:这个参数是master的地址,kubernetes 提供的解析规则是 pod 名称.service名称.命名空间.svc.cluster.local,所以 master 的 mysql 地址是 deploy-mysql-master-0.deploy-mysql-master-svc.deploy-test.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 的公钥获取方式

启动 slave

bash 复制代码
mysql> start slave;
Query OK, 0 rows affected, 1 warning (0.01 sec)

查看slave的状态

bash 复制代码
mysql> show slave status\G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for source to send event
                  Master_Host: mysql-master-0.mysql-master-svc.app.svc.cluster.local
                  Master_User: root
                  Master_Port: 3306
                Connect_Retry: 30
              Master_Log_File: master-bin.000003
          Read_Master_Log_Pos: 157
               Relay_Log_File: mysql-slave-0-relay-bin.000002
                Relay_Log_Pos: 327
        Relay_Master_Log_File: master-bin.000003
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes

在主节点创建一个数据库验证一下主从同步情况

相关推荐
这个DBA有点耶41 分钟前
GROUP BY优化全解:如何写出既不丢数据又飞快的分组查询
数据库·mysql·架构
掉头发的王富贵4 小时前
【StarRocks】极限十分钟入门StarRocks
数据库·sql·mysql
SamDeepThinking8 小时前
一条UPDATE语句在MySQL 8.0中到底加了几把锁?
后端·mysql·程序员
Patrick_Wilson1 天前
从「改个端口」到 502:Next.js on k8s 的容器端口、Service 映射与 env 覆盖
docker·kubernetes·next.js
探索云原生1 天前
K8s 1.36 这个 GA 特性,把 initContainer 拉模型的 hack 干掉了
ai·云原生·kubernetes
云恒要逆袭1 天前
运行你的第一个Docker容器
后端·docker·容器
李白客2 天前
KES新版MySQL兼容能力再升级意味着什么?
mysql·国产数据库
Java之美2 天前
一次k8s升级引发的DevicePlugin注册失败
云原生·kubernetes
程序员老赵3 天前
10 分钟部署 OpenCode:Docker 一键安装,浏览器打开就能用 AI 写代码(附完整命令与排错)
docker·容器·ai编程