k8s部署mysql主从

本文用于测试使用,所以用的hostpath类型pv卷,实际使用不建议使用hostpath作于持久化存储。

mysql配置文件

配置yaml文件
 
cat  mysql_config.yaml
 
apiVersion: v1
kind: ConfigMap
metadata: 
  name: mysql-config
  namespace: mysql
  labels:
    app: mysql
data:
  master.cnf: |
    [client]
    socket                  = /data/mysqldata/3306/tmp/mysql.sock
    default-character-set   = utf8mb4
 
    [mysqld]
    skip_ssl
    skip-name-resolve
    port                    = 3306
    character-set-server    = utf8mb4
    server-id               = 78
    gtid_mode               = ON
    enforce_gtid_consistency= ON
    binlog_format           = ROW
    log-bin                 = /data/mysqldata/3306/binlog/mysql-bin
    expire_logs_days        = 90
    binlog_cache_size       = 4M
 
    innodb_buffer_pool_size = 42G
    innodb_log_buffer_size  = 64M
    innodb_log_file_size    = 2G
    innodb_read_io_threads  = 12
    innodb_write_io_threads = 12
    sort_buffer_size        = 16M
 
    socket                  = /data/mysqldata/3306/tmp/mysql.sock
    basedir                 = /usr/lib/mysql
    plugin_dir              = /usr/lib64/mysql/plugin
    datadir                 = /data/mysqldata/3306/data
    tmpdir                  = /data/mysqldata/3306/tmp
    log-error               = /data/mysqldata/3306/logs/mysql-3306.log
    pid-file                = /data/mysqldata/3306/tmp/mysql-3306.pid
    slow_query_log_file     = /data/mysqldata/3306/logs/slow.log
 
    open_files_limit        = 65535
    thread_cache_size       = 300
    max_connections         = 2000
    max_connect_errors      = 100000
    interactive_timeout     = 2400
    wait_timeout            = 2400
 
  slave.cnf: |
    [client]
    socket                  = /data/mysqldata/3306/tmp/mysql.sock
    default-character-set   = utf8mb4
 
    [mysqld]
    skip_ssl
    skip-name-resolve
    port                    = 3306
    character-set-server    = utf8mb4
    server-id               = 79
    gtid_mode               = ON
    enforce_gtid_consistency= ON
    relay-log               = /data/mysqldata/3306/binlog/relay-log-bin
 
    innodb_buffer_pool_size = 42G
    innodb_log_buffer_size  = 64M
    innodb_log_file_size    = 2G
    innodb_read_io_threads  = 12
    innodb_write_io_threads = 12
    sort_buffer_size        = 16M
 
    socket                  = /data/mysqldata/3306/tmp/mysql.sock
    basedir                 = /usr/lib/mysql
    plugin_dir              = /usr/lib64/mysql/plugin
    datadir                 = /data/mysqldata/3306/data
    tmpdir                  = /data/mysqldata/3306/tmp
    log-error               = /data/mysqldata/3306/logs/mysql-3306.log
    pid-file                = /data/mysqldata/3306/tmp/mysql-3306.pid
    slow_query_log_file     = /data/mysqldata/3306/logs/slow.log
 
    open_files_limit        = 65535
    thread_cache_size       = 300
    max_connections         = 2000
    max_connect_errors      = 100000
    interactive_timeout     = 2400
    wait_timeout            = 2400
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: mysql-init-sql
  namespace: mysql
data:
    init-master.sql: |
      CREATE USER IF NOT EXISTS 'repl'@'%' IDENTIFIED WITH mysql_native_password BY '****';
      GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
      FLUSH PRIVILEGES;
    init-slave.sql: |
      STOP SLAVE;
      CHANGE MASTER TO
        MASTER_HOST='mysql-master',
        MASTER_USER='repl',
        MASTER_PASSWORD='***',
        MASTER_AUTO_POSITION=1;
      START SLAVE;

svc部署无头服务

cat mysql_pvc.yaml
 
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mysql-master-pvc
  namespace: mysql
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi
  volumeName: mysql-master-pv
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mysql-slave-pvc
  namespace: mysql
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi
  volumeName: mysql-slave-pv

pv卷部署

cat mysql_pv.yaml
 
kind: PersistentVolume
metadata:
  name: mysql-slave-pv
  namespace: mysql
spec:
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  volumeMode: Filesystem
  hostPath:
    path: /data/mysql-slave
    type: DirectoryOrCreate
  nodeAffinity:
    required:
      nodeSelectorTerms:
      - matchExpressions:
        - key: kubernetes.io/hostname
          operator: In
          values:
          - slave02

主节点与从节点部署

cat mysql_master.yaml
 
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: mysql-master
  namespace: mysql
spec:
  serviceName: mysql-master
  replicas: 1
  selector:
    matchLabels:
      app: mysql-master
  template:
    metadata:
      labels:
        app: mysql-master
    spec:
      initContainers:
      - name: init-dirs
        image: busybox
        command:
        - sh
        - -c
        - |
          mkdir -p /data/mysqldata/3306/data &&
          mkdir -p /data/mysqldata/3306/tmp &&
          mkdir -p /data/mysqldata/3306/logs &&
          mkdir -p /data/mysqldata/3306/binlog &&
          mkdir -p /application/mysql &&
          chown -R 999:999 /data/mysqldata &&
          chmod -R 775 /data/mysqldata &&
          ls -la /data/mysqldata/3306
        securityContext:
          runAsUser: 0
        volumeMounts:
        - name: data
          mountPath: /data/mysqldata
      containers:
      - name: mysql
        image: mysql:8.0
        ports:
        - containerPort: 3306
        env:
        - name: MYSQL_ROOT_PASSWORD
          value: "2002"
        volumeMounts:
        - name: data
          mountPath: /data/mysqldata
        - name: config
          mountPath: /etc/my.cnf
          subPath: master.cnf
        - name: mysql-init
          mountPath: /docker-entrypoint-initdb.d
      volumes:
      - name: config
        configMap:
          name: mysql-config
          items:
          - key: master.cnf
            path: master.cnf
      - name: data
        persistentVolumeClaim:
          claimName: mysql-master-pvc
      - name: mysql-init
        configMap:
          name: mysql-init-sql
          items:
            - key: init-master.sql
              path: init-master.sql
      
---
apiVersion: v1
kind: Service
metadata:
  name: mysql-master
  namespace: mysql
spec:
  clusterIP: None
  selector:
    app: mysql-master
  ports:
  - port: 3306
    targetPort: 3306
---
cat mysql_slave.yaml
 
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: mysql-slave
  namespace: mysql
spec:
  serviceName: mysql-slave
  replicas: 1
  selector:
    matchLabels:
      app: mysql-slave
  template:
    metadata:
      labels:
        app: mysql-slave
    spec:
      initContainers:
      - name: init-dirs
        image: busybox
        command:
        - sh
        - -c
        - |
          mkdir -p /data/mysqldata/3306/data &&
          mkdir -p /data/mysqldata/3306/tmp &&
          mkdir -p /data/mysqldata/3306/logs &&
          mkdir -p /data/mysqldata/3306/binlog &&
          mkdir -p /application/mysql &&
          chown -R 999:999 /data/mysqldata &&
          chmod -R 775 /data/mysqldata &&
          ls -la /data/mysqldata/3306
        securityContext:
          runAsUser: 0
        volumeMounts:
        - name: data
          mountPath: /data/mysqldata
      containers:
      - name: mysql
        image: mysql:8.0
        ports:
        - containerPort: 3306
        env:
        - name: MYSQL_ROOT_PASSWORD
          value: "2002"
        volumeMounts:
        - name: data
          mountPath: /data/mysqldata
        - name: config
          mountPath: /etc/my.cnf
          subPath: slave.cnf
        - name: mysql-init
          mountPath: /docker-entrypoint-initdb.d
      volumes:
      - name: config
        configMap:
          name: mysql-config
          items:
          - key: slave.cnf
            path: slave.cnf
      - name: data
        persistentVolumeClaim:
          claimName: mysql-slave-pvc
      - name: mysql-init
        configMap:
          name: mysql-init-sql
          items:
            - key: init-slave.sql
              path: init-slave.sql
 
---
apiVersion: v1
kind: Service
metadata:
  name: mysql-slave
  namespace: mysql
spec:
  clusterIP: None
  selector:
    app: mysql-slave
  ports:
  - port: 3306
    targetPort: 3306

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值