k8s 启动mysql 主从

本文介绍如何使用Docker和Kubernetes部署MySQL主从复制服务。通过构建两个Docker镜像,分别用于MySQL主服务器和从服务器,再利用K8s的YAML配置文件实现服务的自动化部署与管理。

启动两个docker ,服务为mysql主从模式;

首先需要构建两个docker,使用mysql5.7的镜像作为基础镜像

1. mysql-master  Dockerfile

FROM mysql:latest

RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo "Asia/shanghai" >> /etc/timezone

COPY mysqld.cnf /etc/mysql/mysql.conf.d/mysqld.cnf
COPY entrypoint.sh /
COPY init-master.sh /docker-entrypoint-initdb.d/

在当前目录下执行如下命令:

docker built -t mysql-master:v1.0 .

其他文件请参照文章末尾的GitHub链接地址

2. mysql-slave Dockerfile

FROM mysql:latest

RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo "Asia/shanghai" >> /etc/timezone
COPY mysqld.cnf /etc/mysql/mysql.conf.d/
COPY entrypoint.sh /
COPY slave-init.sh /docker-entrypoint-initdb.d/

在当前目录下执行如下命令:

docker built -t mysql-slave:v1.0 .

其他文件请参照文章末尾的GitHub链接地址

3. 执行k8s 的yaml文件 master, 文件名:mysql-master.yaml

确保本地有 /data/mysql_data目录

apiVersion: v1
kind: Pod
metadata:
  name: master-tdbwv
  labels:
    name: master-tdbwv
spec:
  volumes:
    - name: data
      hostPath:
        path: /data/mysql_data
  containers:
    - name: master-tdbwv
      image: mysql-master:v1.0
      env:
        - name: MYSQL_ROOT_PASSWORD
          value: uggTKd3xsIMM
        - name: MYSQL_REPLICATION_USER
          value: repl
        - name: MYSQL_REPLICATION_PASSWORD
          value: RQfUjBff
      ports:
        - containerPort: 3306
          name: master-tdbwv
      volumeMounts:
        - name: data
          mountPath: /var/lib/mysql
      resources:
          limits:
            cpu: 2
            memory: 200Mi
  nodeName: localhost
---
apiVersion: v1
kind: Service
metadata:
  name: master-tdbwv
  labels:
    name: master-tdbwv
spec:
  type: NodePort
  ports:
    - port: 3306      
      nodePort: 
  selector:
    name: master-tdbwv

4. 执行k8s 的yaml文件 slave, 文件名:mysql-slave.yaml

确保本地有 /data/mysql_slave_data目录

apiVersion: v1
kind: Pod
metadata:
  name: slave-ncrxq
  labels:
    name: slave-ncrxq
spec:
  volumes:
    - name: data
      hostPath:
        path: /data/mysql_slave_data

  containers:
    - name: slave-ncrxq
      image: mysql-slave:v1.0
      env:
        - name: MYSQL_ROOT_PASSWORD
          value: uggTKd3xsIMM
        - name: MYSQL_REPLICATION_USER
          value: repl
        - name: MYSQL_REPLICATION_PASSWORD
          value: RQfUjBff
        - name: MYSQL_MASTER_SERVICE_HOST
          value: 127.0.0.1
      ports:
        - containerPort: 3306
          name: slave-ncrxq
      volumeMounts:
        - name: data
          mountPath: /var/lib/mysql
      resources:
          limits:
            cpu: 2
            memory: 200Mi
  nodeName: localhost
---
apiVersion: v1
kind: Service
metadata:
  name: slave-ncrxq
  labels:
    name: slave-ncrxq
spec:
  type: NodePort
  ports:
    - port: 3306      
      nodePort: 
  selector:
    name: slave-ncrxq

基本用法就是这样,具体文件请参照GitHub

https://github.com/haozhixin/docker-mysql

转载于:https://my.oschina.net/FrankXin/blog/875414

### Kubernetes 部署 MySQL 主从复制的配置教程 在 Kubernetes 中部署 MySQL主从复制涉及多个步骤,包括创建 ConfigMap、Secrets、PersistentVolume 和 StatefulSet 等资源对象。以下是详细的说明: #### 1. 创建 ConfigMap 通过 ConfigMap 定义主服务器和从服务器的不同配置文件。 ```yaml apiVersion: v1 kind: ConfigMap metadata: name: mysql namespace: mysql labels: app: mysql data: master.cnf: | [mysqld] log-bin=mysql-bin server-id=1 skip-name-resolve slave.cnf: | [mysqld] super-read-only log-bin=mysql-bin replicate-ignore-db=mysql server-id=2 skip-name-resolve ``` 此部分定义了主服务器和从服务器的具体配置[^1]。 #### 2. 创建 Secrets 为了安全存储数据库凭证,可以使用 Secret 存储用户名和密码。 ```yaml apiVersion: v1 kind: Secret metadata: name: mysql-secret namespace: mysql type: Opaque data: root-password: cGFzc3dvcmQ= # base64 encoded password, e.g., 'password' replica-password: cmVwbGljYQ== # base64 encoded replication user password, e.g., 'replica' ``` 注意:生产环境中应采用更加复杂的安全措施来保护敏感信息[^1]。 #### 3. 设置 PersistentVolumes (PV) 和 PersistentVolumeClaims (PVC) 为主从节点分配持久化存储空间。 ```yaml apiVersion: v1 kind: PersistentVolume metadata: name: mysql-pv-master spec: capacity: storage: 10Gi accessModes: - ReadWriteOnce hostPath: path: /mnt/data/mysql/master --- apiVersion: v1 kind: PersistentVolumeClaim metadata: name: mysql-pvc-master namespace: mysql spec: accessModes: - ReadWriteOnce resources: requests: storage: 10Gi ``` 重复以上过程为从节点创建 PV 和 PVC[^4]。 #### 4. 配置 StatefulSet StatefulSet 是用于管理有状态应用的工作负载之一,在这里用来运行 MySQL 实例。 ##### 主实例 StatefulSet ```yaml apiVersion: apps/v1 kind: StatefulSet metadata: name: mysql-master namespace: mysql spec: serviceName: "mysql" replicas: 1 selector: matchLabels: app: mysql role: master template: metadata: labels: app: mysql role: master spec: containers: - name: mysql image: mysql:5.7 env: - name: MYSQL_ROOT_PASSWORD valueFrom: secretKeyRef: name: mysql-secret key: root-password ports: - containerPort: 3306 name: mysql volumeMounts: - name: config-volume mountPath: /etc/mysql/conf.d - name: data-volume mountPath: /var/lib/mysql volumes: - name: config-volume configMap: name: mysql items: - key: master.cnf path: master.cnf - name: data-volume persistentVolumeClaim: claimName: mysql-pvc-master ``` ##### 从实例 StatefulSet 对于从节点,只需调整 `role` 标签并加载不同的配置文件即可。 ```yaml apiVersion: apps/v1 kind: StatefulSet metadata: name: mysql-slave namespace: mysql spec: serviceName: "mysql" replicas: 1 selector: matchLabels: app: mysql role: slave template: metadata: labels: app: mysql role: slave spec: containers: - name: mysql image: mysql:5.7 env: - name: MYSQL_ALLOW_EMPTY_PASSWORD value: "true" command: - bash - "-c" - > mysqld --init-file=/tmp/init.sql && exec "$@" ports: - containerPort: 3306 name: mysql volumeMounts: - name: init-sql mountPath: /tmp/ - name: config-volume mountPath: /etc/mysql/conf.d - name: data-volume mountPath: /var/lib/mysql volumes: - name: init-sql configMap: name: mysql-init - name: config-volume configMap: name: mysql items: - key: slave.cnf path: slave.cnf - name: data-volume persistentVolumeClaim: claimName: mysql-pvc-slave ``` 初始化 SQL 文件可以通过另一个 ConfigMap 提供。 #### 5. 启动主从同步 完成上述资源配置后,需手动执行以下操作以启动主从同步。 - 登录到主节点,并授予从节点访问权限。 ```sql CREATE USER 'replica'@'%' IDENTIFIED WITH 'mysql_native_password' BY 'your_strong_password'; GRANT REPLICATION SLAVE ON *.* TO 'replica'@'%'; FLUSH PRIVILEGES; ``` - 在从节点上设置主节点信息。 ```sql CHANGE MASTER TO MASTER_HOST='master-node-ip', MASTER_USER='replica', MASTER_PASSWORD='your_strong_password', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=<position>; START SLAVE; ``` 具体日志文件名和位置可以从主节点的状态中获取[^3]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值