k8s1.27集群部署mysql8.0双主双从

环境介绍:
#节点分配
159m--->两个master,生产环境建议,一个master一个节点。

160n-->slave-0

161n-->slaves-0
#存储卷
pv-->放在节点上,没用nfs/云存储。hostpath方式存储。pv的资源分配1G,较小,用来测试环境

-----------------kind资源

159m节点创建目录并授权:mkdir -p /data/mysql-masters && chmod 755 -R /data/mysql-masters

                                           mkdir -p /data/mysql-master && chmod 755 -R /data/mysql-master

160n节点创建目录并授权: mkdir -p /data/mysql-slave-0 && chmod 755 -R /data/mysql-slave-0

161n节点创建目录并授权: mkdir -p /data/mysql-slave-1 && chmod 755 -R /data/mysql-slave-1

master节点:

mkdir -p /kind/mysql-kind

cd /kind/mysql-kind

vim mysql-pv.yaml

---
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: local1
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: WaitForFirstConsumer
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: mysql-master-pv
  labels:
    type: local
spec:
  capacity:
    storage: 1Gi
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  storageClassName: local-storage
  local:
    path: /data/mysql-master
  nodeAffinity:
    required:
      nodeSelectorTerms:
      - matchExpressions:
        - key: kubernetes.io/hostname
          operator: In
          values:
          - 159m  # 替换为你的主节点名称,kubectl get nodes获取,也可以放在其他节点。例如158n
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: mysql-masters-pv
  labels:
    type: local
spec:
  capacity:
    storage: 1Gi
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  storageClassName: local-storage
  local:
    path: /data/mysql-masters
  nodeAffinity:
    required:
      nodeSelectorTerms:
      - matchExpressions:
        - key: kubernetes.io/hostname
          operator: In
          values:
          - 159m  # 替换为你的主节点名称
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: mysql-slave-pv-0
  labels:
    type: local
spec:
  capacity:
    storage: 1Gi
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  storageClassName: local1
  local:
    path: /data/mysql-slave-0
  nodeAffinity:
    required:
      nodeSelectorTerms:
      - matchExpressions:
        - key: kubernetes.io/hostname
          operator: In
          values:
          - 160n  # 替换为你的第一个从节点名称
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: mysql-slave-pv-1
  labels:
    type: local
spec:
  capacity:
    storage: 1Gi
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  storageClassName: local1
  local:
    path: /data/mysql-slave-1
  nodeAffinity:
    required:
      nodeSelectorTerms:
      - matchExpressions:
        - key: kubernetes.io/hostname
          operator: In
          values:
          - 161n  # 替换为你的第二个从节点名称,

vim mysql-pvc.yaml

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mysql-master-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi
  storageClassName: local-storage
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mysql-masters-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi
  storageClassName: local-storage
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mysql-slave-pvc-0
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi
  storageClassName: local-storage
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mysql-slave-pvc-1
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi
  storageClassName: local-storage

vim mysql-sts-master.yaml
注意这里configmap有一个插件参数,需要先让podruning起来,再增加插件配置。

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: mysql-master
spec:
  serviceName: mysql-master
  replicas: 1
  selector:
    matchLabels:
      app: mysql-master
  template:
    metadata:
      labels:
        app: mysql-master
    spec:
      tolerations:
      - key: "node-role.kubernetes.io/control-plane"
        operator: "Exists"
        effect: "NoSchedule"
      containers:
      - name: mysql
        image: swr.cn-north-4.myhuaweicloud.com/ddn-k8s/gcr.io/ml-pipeline/mysql:8.0.26
        env:
        - name: MYSQL_ROOT_PASSWORD
          valueFrom:
            secretKeyRef:
              name: mysql-secret
              key: MYSQL_ROOT_PASSWORD
        ports:
        - containerPort: 3306
          name: mysql
        volumeMounts:
        - name: mysql-storage
          mountPath: /var/lib/mysql
        - name: mysql-config
          mountPath: /etc/mysql/conf.d/my.cnf
          subPath: my.cnf
      volumes:
      - name: mysql-config
        configMap:
          name: mysql-master-config
      - name: mysql-storage
        persistentVolumeClaim:
          claimName: mysql-master-pvc
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: mysql-master-config
data:
  my.cnf: |
    [mysqld]
    server-id=1  # 保证id唯一
    read-only=0 # 允许读写
    #binlog-ignore-db=mysql # 忽略数据,指不需要同步的数据库
    #binlog-do-db=db01 # 指定同步的数据库
    log_bin=mysql-bin  # 开binlog
    bind-address = 0.0.0.0
    default-storage-engine = INNODB
    innodb_buffer_pool_size = 512mb
    #mysql_native_password=ON #这里!先让podrunning起来再添加配置,不然会报插件错误
---
apiVersion: v1
kind: Service
metadata:
  name: mysql-master-headless
spec:
  clusterIP: None
  selector:
    app: mysql-master

vim mysql-sts-masters.yaml

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: mysql-masters
spec:
  serviceName: mysql-masters
  replicas: 1
  selector:
    matchLabels:
      app: mysql-masters
  template:
    metadata:
      labels:
        app: mysql-masters
    spec:
      tolerations:
      - key: "node-role.kubernetes.io/control-plane"
        operator: "Exists"
        effect: "NoSchedule"
      containers:
      - name: mysql
        image: swr.cn-north-4.myhuaweicloud.com/ddn-k8s/gcr.io/ml-pipeline/mysql:8.0.26
        env:
        - name: MYSQL_ROOT_PASSWORD
          valueFrom:
            secretKeyRef:
              name: mysql-secret
              key: MYSQL_ROOT_PASSWORD
        ports:
        - containerPort: 3306
          name: mysql
        volumeMounts:
        - name: mysql-storage
          mountPath: /var/lib/mysql
        - name: mysql-config
          mountPath: /etc/mysql/conf.d/my.cnf
          subPath: my.cnf
      volumes:
      - name: mysql-config
        configMap:
          name: mysql-masters-config
      - name: mysql-storage
        persistentVolumeClaim:
          claimName: mysql-masters-pvc
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: mysql-masters-config
data:
  my.cnf: |
    [mysqld]
    server-id=4  # 保证id唯一
    read-only=0 # 允许读写
    #binlog-ignore-db=mysql # 忽略数据,指不需要同步的数据库
    #binlog-do-db=db01 # 指定同步的数据库
    log_bin=mysql-bin  # 开binlog
    bind-address = 0.0.0.0
    default-storage-engine = INNODB
    innodb_buffer_pool_size = 512mb
    #mysql_native_password=ON
    #等podrunning起来之后,在更新这个配置,不然初始化直接报错
---
apiVersion: v1
kind: Service
metadata:
  name: mysql-masters-headless
spec:
  clusterIP: None
  selector:
    app: mysql-masters

vim mysql-sts-slave.yaml

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: mysql-slave
spec:
  serviceName: mysql-slave
  replicas: 1
  selector:
    matchLabels:
      app: mysql-slave
  template:
    metadata:
      labels:
        app: mysql-slave
    spec:
      volumes:
      - name: mysql-config
        configMap:
          name: mysql-slave0-config
      - name: mysql-storage
        persistentVolumeClaim:
          claimName: mysql-slave-pvc-0
      containers:
      - name: mysql
        image: swr.cn-north-4.myhuaweicloud.com/ddn-k8s/gcr.io/ml-pipeline/mysql:8.0.26
        env:
        - name: MYSQL_ROOT_PASSWORD
          valueFrom:
            secretKeyRef:
              name: mysql-secret
              key: MYSQL_ROOT_PASSWORD
        ports:
        - containerPort: 3306
          name: mysql
        volumeMounts:
        - name: mysql-storage
          mountPath: /var/lib/mysql
        - name: mysql-config
          mountPath: /etc/mysql/conf.d/my.cnf
          subPath: my.cnf
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: mysql-slave0-config
data:
  my.cnf: |
    [mysqld]
    server-id=2 #保证id唯一
    read-only=1 #允许读,普通用户
    bind-address = 0.0.0.0
    default-storage-engine = INNODB
    innodb_buffer_pool_size = 512mb

vim mysql-sts-slaves.yaml

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: mysql-slaves
spec:
  serviceName: mysql-slaves
  replicas: 1
  selector:
    matchLabels:
      app: mysql-slave
  template:
    metadata:
      labels:
        app: mysql-slave
    spec:
      volumes:
      - name: mysql-config
        configMap:
          name: mysql-slaves-config
      - name: mysql-storage
        persistentVolumeClaim:
          claimName: mysql-slave-pvc-1
      containers:
      - name: mysql
        image: swr.cn-north-4.myhuaweicloud.com/ddn-k8s/gcr.io/ml-pipeline/mysql:8.0.26
        env:
        - name: MYSQL_ROOT_PASSWORD
          valueFrom:
            secretKeyRef:
              name: mysql-secret
              key: MYSQL_ROOT_PASSWORD
        ports:
        - containerPort: 3306
          name: mysql
        volumeMounts:
        - name: mysql-storage
          mountPath: /var/lib/mysql
        - name: mysql-config
          mountPath: /etc/mysql/conf.d/my.cnf
          subPath: my.cnf
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: mysql-slaves-config
data:
  my.cnf: |
    [mysqld]
    server-id=3 #保证id唯一
    read-only=1 #允许读,普通用户
    bind-address = 0.0.0.0
    default-storage-engine = INNODB
    innodb_buffer_pool_size = 512mb

vim mysql-secret.yaml

apiVersion: v1
kind: Secret
metadata:
  name: mysql-secret
type: Opaque
data:
  MYSQL_ROOT_PASSWORD: cm9vdA==  #base64编码,密码为root

kubectl apply -f .   #应用整个文件夹

vim mysql-sts-master.yaml mysql-sts-masters.yaml

configmap.mysql_native_password=ON 去掉注释

kubectl apply -f mysql-sts-master.yaml mysql-sts-masters.yaml


身份划分--做主从:

master的从节点为slave-0

1.首先进入master容器创建用户及授权,还有slave授权。

CREATE USER 'itcast'@'%' IDENTIFIED BY '1';

GRANT ALL PRIVILEGES ON *.* TO 'itcast'@'%' WITH GRANT OPTION;

grant replication slave on *.* to 'itcast'@'%';

show master status; #查看binlog日志坐标,本次演示为mysql-bin.000003,2458

mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000003 |     2458 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+

2.然后进入slave-0,添加master主节点信息,然后开启slave;

#mysql-master做了无头服务,通过coredns会在集群内部解析mysql-masters-headless.default.svc.cluster.local

CHANGE MASTER TO
    MASTER_HOST='mysql-master-headless.default.svc.cluster.local',
    MASTER_PORT=3306,
    MASTER_USER='itcast',
    MASTER_PASSWORD='1',
    MASTER_LOG_FILE='mysql-bin.000003',
    MASTER_LOG_POS=2458;

start slave;  #开启从服务

show slave status\G;  #两个yes标识成功
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes

masters的从节点为slaves-0

同上操作,注意无头服务为mysql-masters-headless.default.svc.cluster.local

双主操作

master和masters两个互为主从,master给masters做从,masters给master做从。和master与slave操作一致。

此时:

当从两个master写入的时候,两个从节点都会记录数据增删改数据,master建库删库,slave一同跟着操作,但是在slave中创建数据库和数据,master节点看不到。

报错:

  Last_IO_Error: Got fatal error 1236 from master when reading data from binary log: 'Could not find first log file name in binary log index file'
 Error 'You are not allowed to create a user with GRANT' on query. Default database: ''. Query: 'GRANT REPLICATION SLAVE ON *.* TO 'itcast'@'%''
  Replicate_Ignore_Server_Ids: 
8.0版本不支持创建用户和授权一条命令。

mysql> create user 'itcast'@'%' identified with mysql_nactive_password by '1';
ERROR 1524 (HY000): Plugin 'mysql_nactive_password' is not loaded
命令错误,应该是native。不然就是my.cnf没有启用插件

主从不成功,注意查看show slave status\G;中last_io_error报错

Kubernetesk8s)是一个用于自动化部署、扩展和管理容器化应用程序的开源平台。MySQL是一个流行的关系型数据库管理系统。在Kubernetes部署MySQL8.0主从集群意味着在该平台上使用容器化的方式来管理MySQL数据库,主从集群是一种数据库复制的架构,用于提高数据库的可用性和性能。 要在Kubernetes部署MySQL8.0主从集群,首先需要创建一个包含MySQL8.0镜像的容器,并定义相应的Pod和Service。然后可以使用Kubernetes的Deployment和StatefulSet等资源对象来定义MySQL主从集群部署配置。可以通过定义多个Replica来实现数据库的水平扩展,同时可以使用Kubernetes的存储卷来实现数据的持久化存储,并通过Service来实现集群内部和外部的访问。 Kubernetes提供了一些工具和资源对象,如PersistentVolume(PV)、PersistentVolumeClaim(PVC)等,可以帮助用户管理数据库的持久化存储。此外,Kubernetes还提供了一些网络策略和服务发现的功能,可以帮助用户实现容器间的通信和负载均衡。 通过使用Kubernetes的灵活性和强大的管理能力,可以方便地部署和管理MySQL8.0主从集群,实现高可用性和高性能的数据库服务。同时,Kubernetes的自动扩展和自愈能力也可以帮助用户实现数据库集群的自动化管理,提高运维效率。因此,Kubernetes是一个理想的平台,用于部署和管理MySQL8.0主从集群
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值