1.创建启动MySQL.yaml文件

vim mysql-simple.yaml

复制以下即可:

apiVersion: v1
kind: Namespace
metadata:
  name: mysql-replication
---
apiVersion: v1
kind: Secret
metadata:
  name: mysql-secrets
  namespace: mysql-replication
type: Opaque
data:
  root-password: cm9vdHBhc3M=  # "rootpass"
  repl-password: cmVwbHBhc3M= # "replpass"
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: mysql-config
  namespace: mysql-replication
data:
  master.cnf: |
    [mysqld]
    server-id=1
    log-bin=mysql-bin
    binlog-format=ROW
    bind-address=*
    skip-name-resolve
  slave.cnf: |
    [mysqld]
    server-id=2
    relay-log=relay-log
    read_only=1
    skip-name-resolve
---
apiVersion: v1
kind: Service
metadata:
  name: mysql
  namespace: mysql-replication
spec:
  clusterIP: None
  ports:
    - port: 3306
  selector:
    app: mysql
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: mysql
  namespace: mysql-replication
spec:
  serviceName: mysql
  replicas: 2
  selector:
    matchLabels:
      app: mysql
  template:
    metadata:
      labels:
        app: mysql
    spec:
      terminationGracePeriodSeconds: 30
      initContainers:
        - name: init-mysql
          image: mysql:8.0
          command:
            - bash
            - "-c"
            - |
              set -ex
              ordinal=$(hostname | cut -d'-' -f2)
              if [[ $ordinal -eq 0 ]]; then
                cp /mnt/config/master.cnf /mnt/conf.d/
              else
                cp /mnt/config/slave.cnf /mnt/conf.d/
              fi
              echo "server-id=$((ordinal+1))" >> /mnt/conf.d/server-id.cnf
          volumeMounts:
            - name: conf
              mountPath: /mnt/conf.d
            - name: config-volume
              mountPath: /mnt/config
      containers:
        - name: mysql
          image: mysql:8.0
          env:
            - name: MYSQL_ROOT_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: mysql-secrets
                  key: root-password
          ports:
            - containerPort: 3306
          volumeMounts:
            - name: data
              mountPath: /var/lib/mysql
            - name: conf
              mountPath: /etc/mysql/conf.d
          resources:
            requests:
              memory: "512Mi"
              cpu: "200m"
      volumes:
        - name: config-volume
          configMap:
            name: mysql-config
        - name: conf
          emptyDir: {}
  volumeClaimTemplates:
    - metadata:
        name: data
      spec:
        accessModes: ["ReadWriteOnce"]
        resources:
          requests:
            storage: 2Gi

应用yaml文件

kubectl apply -f mysql-simple.yaml

2.手动创建pv.yaml文件

apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-mysql-primary
spec:
  capacity:
    storage: 1Gi
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  hostPath:
    path: /mnt/data/mysql-primary
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-mysql-replica
spec:
  capacity:
    storage: 1Gi
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  hostPath:
    path: /mnt/data/mysql-replica

  应用文件命令:

kubectl apply -f pv.yaml

正确如下:

3.创建mysql-primary-svc.yaml给主库暴漏端口

vim mysql-primary-svc.yaml
apiVersion: v1
kind: Service
metadata:
  name: mysql-primary
  namespace: mysql-replication
spec:
  ports:
  - port: 3306
    targetPort: 3306
  selector:
    app: mysql
    role: primary

应用yaml文件:

kubectl apply -f mysql-primary-svc.yaml

4.创建主库从库yaml文件      (注:MySQL密码:your_strong_root_password)!

vim mysql-replication.yaml
# 1. 创建命名空间
apiVersion: v1
kind: Namespace
metadata:
  name: mysql-replication

---
# 2. 创建 Secret 存储 MySQL 密码
apiVersion: v1
kind: Secret
metadata:
  name: mysql-secret
  namespace: mysql-replication
type: Opaque
data:
  # 请将 'your_strong_root_password' 替换为你自己的密码,并用 base64 编码
  # 例如: echo -n 'MyPass123!' | base64
  root-password: eW91cl9zdHJvbmdfcm9vdF9wYXNzd29yZA== # your_strong_root_password

---
# 3. 主库 ConfigMap
apiVersion: v1
kind: ConfigMap
metadata:
  name: mysql-primary-config
  namespace: mysql-replication
data:
  primary.cnf: |
    [mysqld]
    server-id=1
    gtid_mode=ON
    enforce_gtid_consistency=ON
    log-bin=mysql-bin
    binlog_format=ROW
    skip-host-cache
    skip-name-resolve

---
# 4. 从库 ConfigMap
apiVersion: v1
kind: ConfigMap
metadata:
  name: mysql-replica-config
  namespace: mysql-replication
data:
  replica.cnf: |
    [mysqld]
    server-id=2
    gtid_mode=ON
    enforce_gtid_consistency=ON
    log-bin=mysql-bin
    binlog_format=ROW
    read_only=ON
    skip-host-cache
    skip-name-resolve

---
# 5. Headless Service (用于 StatefulSet)
apiVersion: v1
kind: Service
metadata:
  name: mysql
  namespace: mysql-replication
  labels:
    app: mysql
spec:
  ports:
  - port: 3306
    name: mysql
  clusterIP: None # Headless Service
  selector:
    app: mysql

---
# 6. 主库 StatefulSet
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: mysql-primary
  namespace: mysql-replication
spec:
  serviceName: mysql
  replicas: 1
  selector:
    matchLabels:
      app: mysql
      role: primary
  template:
    metadata:
      labels:
        app: mysql
        role: primary
    spec:
      containers:
      - name: mysql
        image: mysql:8.0
        env:
        - name: MYSQL_ROOT_PASSWORD
          valueFrom:
            secretKeyRef:
              name: mysql-secret
              key: root-password
        ports:
        - containerPort: 3306
          name: mysql
        volumeMounts:
        - name: data
          mountPath: /var/lib/mysql
        - name: config
          mountPath: /etc/mysql/conf.d
        livenessProbe:
          exec:
            command: ["mysqladmin", "ping", "-uroot", "-p$(MYSQL_ROOT_PASSWORD)"]
          initialDelaySeconds: 30
          periodSeconds: 10
        readinessProbe:
          exec:
            command: ["mysql", "-h", "127.0.0.1", "-uroot", "-p$(MYSQL_ROOT_PASSWORD)", "-e", "SELECT 1"]
          initialDelaySeconds: 10
          periodSeconds: 5
      volumes:
      - name: config
        configMap:
          name: mysql-primary-config
  volumeClaimTemplates:
  - metadata:
      name: data
    spec:
      accessModes: ["ReadWriteOnce"]
      resources:
        requests:
          storage: 1Gi
      storageClassName: "" # 关键!匹配你手动创建的 PV

---
# 7. 从库 StatefulSet
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: mysql-replica
  namespace: mysql-replication
spec:
  serviceName: mysql
  replicas: 1
  selector:
    matchLabels:
      app: mysql
      role: replica
  template:
    metadata:
      labels:
        app: mysql
        role: replica
    spec:
      containers:
      - name: mysql
        image: mysql:8.0
        env:
        - name: MYSQL_ROOT_PASSWORD
          valueFrom:
            secretKeyRef:
              name: mysql-secret
              key: root-password
        ports:
        - containerPort: 3306
          name: mysql
        volumeMounts:
        - name: data
          mountPath: /var/lib/mysql
        - name: config
          mountPath: /etc/mysql/conf.d
        livenessProbe:
          exec:
            command: ["mysqladmin", "ping", "-uroot", "-p$(MYSQL_ROOT_PASSWORD)"]
          initialDelaySeconds: 30
          periodSeconds: 10
        readinessProbe:
          exec:
            command: ["mysql", "-h", "127.0.0.1", "-uroot", "-p$(MYSQL_ROOT_PASSWORD)", "-e", "SELECT 1"]
          initialDelaySeconds: 10
          periodSeconds: 5
      volumes:
      - name: config
        configMap:
          name: mysql-replica-config
  volumeClaimTemplates:
  - metadata:
      name: data
    spec:
      accessModes: ["ReadWriteOnce"]
      resources:
        requests:
          storage: 1Gi
      storageClassName: "" # 关键!匹配你手动创建的 PV

应用yaml文件命令:

kubectl apply -f mysql-replication.yaml

正确如下:

5.进入主库及创建用户👇

kubectl exec mysql-primary-0 -n mysql-replication -c mysql -- \
  mysql -uroot -pyour_strong_root_password -e "
    CREATE USER 'repl'@'%' IDENTIFIED BY 'replpass';
    GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
    FLUSH PRIVILEGES;
  "

1)查看mysql-bin日志

输入命令:

SHOW BINARY LOGS;

显示如下:结合从库的 3)使用   注:结合实际bin日志👇

6.登录从库和主库关联起来:

1)注:容器中没有bash换用sh

kubectl exec -it mysql-replica-0 -n mysql-replication -- bash

2)进入从库连接MySQL

mysql -uroot -pyour_strong_root_password

3)在MySQL下输入以下命令配置关联主从:

STOP SLAVE;

CHANGE MASTER TO
  MASTER_HOST='mysql-primary.mysql-replication.svc.cluster.local',
  MASTER_USER='repl',
  MASTER_PASSWORD='replpass',
  MASTER_LOG_FILE='mysql-bin.000006', 
  MASTER_LOG_POS=3070,                  
  MASTER_AUTO_POSITION=0;

START SLAVE;

4)在MySQL下输入并验证是否关联:

SHOW SLAVE STATUS\G

如下显示就是关联成功:👇

7.测试主从复制打开两个端口(以下一起操作!)

1)进入主库:

kubectl exec -it mysql-primary-0 -n mysql-replication -c mysql -- bash

容器内执行:

mysql -uroot -pyour_strong_root_password

查看库命令:

SHOW DATABASES;

创建库命令:(注:w13 库名称)

CREATE DATABASE w13;
SHOW DATABASES;#查看库

2)进入从库:

kubectl exec -it mysql-replica-0 -n mysql-replication -c mysql -- bash

容器内执行:

mysql -uroot -pyour_strong_root_password

查看库:

SHOW DATABASES;

再次执行:

SHOW DATABASES;

发现库以同步,MySQL主从复制部署完成!

更多推荐