
基于k8s的mysql主從配置方案
13頁基于k8s的mysql主從配置方案#### 1、主從配置文件拉取鏡像*xtrabackup*:在work節(jié)點上創(chuàng)建文件 pull-.sh```#!/bin/bashimage=$1echo $1img=`echo $image | sed 's/k8s\.gcr\.io/anjia0532\/google-containers/g;s/gcr\.io/anjia0532/g;s/\//\./g;s/ /\n/g;s/_/-/g;s/anjia0532\./anjia0532\//g' | uniq | awk '{print ""$1""}'`echo "docker pull $img"docker pull $imgecho "docker tag $img $image"docker tag $img $image```chmod +x pull-.sh, 執(zhí)行 sh pull-.sh *gcr.io/google-samples/xtrabackup:1.0*配置nfs:```yum install nfs-utilsmkdir -p /net/mysql-0 /net/mysql-1 /net/mysql-2echo '/net/mysql-0 *(rw,no_root_squash)' >> /etc/exportsecho '/net/mysql-1 *(rw,no_root_squash)' >> /etc/exportsecho '/net/mysql-2 *(rw,no_root_squash)' >> /etc/exportssystemctl restart nfs-serversystemctl enable nfs```創(chuàng)建持久卷:```yamlmysql_pv-a.yaml :apiVersion: v1kind: PersistentVolumemetadata: name: pv-aspec: capacity: storage: 1Gi accessModes: - ReadWriteOnce - ReadOnlyMany #persistentVolumeReclaimPolicy: Retain # 當聲明被釋放,pv將保留(不清理和刪除) persistentVolumeReclaimPolicy: Recycle # 當聲明被釋放,空間將回收再利用 nfs: server: 192.168.74.114 path: /net/mysql-0 mysql_pv-b.yamlapiVersion: v1kind: PersistentVolumemetadata: name: pv-bspec: capacity: storage: 1Gi accessModes: - ReadWriteOnce - ReadOnlyMany #persistentVolumeReclaimPolicy: Retain # 當聲明被釋放,pv將保留(不清理和刪除) persistentVolumeReclaimPolicy: Recycle # 當聲明被釋放,空間將回收再利用 nfs: server: 192.168.74.114 path: /net/mysql-1mysql_pv-b.yamlapiVersion: v1kind: PersistentVolumemetadata: name: pv-cspec: capacity: storage: 1Gi accessModes: - ReadWriteOnce - ReadOnlyMany #persistentVolumeReclaimPolicy: Retain # 當聲明被釋放,pv將保留(不清理和刪除) persistentVolumeReclaimPolicy: Recycle # 當聲明被釋放,空間將回收再利用 nfs: server: 192.168.74.114 path: /net/mysql-2 這里的pv,當執(zhí)行了kubectl apply -f pv-c.yaml 后,pv下的所有內(nèi)容都會被刪除,請注意操作```配置configmap字典```yamlapiVersion: v1kind: ConfigMapmetadata: name: mysql labels: app: mysqldata: f: | # Apply this config only on the master. [mysqld] log-bin default-storage-engine=INNODB character_set_server=utf8mb4 collation_server=utf8mb4_general_ci lower_case_table_names=1 expire_logs_days = 15 innodb_log_buffer_size = 8M innodb_flush_log_at_trx_commit = 2 sql_mode='ONLY_FULL_GROUP_BY,NO_AUTO_VALUE_ON_ZERO,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,PIPES_AS_CONCAT,ANSI_QUOTES' [client] default-character-set=utf8mb4 [mysql] default-character-set=utf8mb4 f: | # Apply this config only on slaves. [mysqld] super-read-only default-storage-engine=INNODB character_set_server=utf8mb4 collation_server=utf8mb4_general_ci lower_case_table_names=1 expire_logs_days = 15 innodb_log_buffer_size = 8M innodb_flush_log_at_trx_commit = 2 sql_mode='ONLY_FULL_GROUP_BY,NO_AUTO_VALUE_ON_ZERO,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,PIPES_AS_CONCAT,ANSI_QUOTES' [client] default-character-set=utf8mb4 [mysql] default-character-set=utf8mb4這個配置會掛載到pod的/etc/mysql/conf.d 中,配置完成后如果apply不能生效,那需要kubectl delete -f,再重新聲明。
修改了配置文件需要重啟statelful kubectl delete -f mysql_statefulSet.yaml kubectl apply -f mysql_statefulSet.yaml```配置service:```yamlapiVersion: v1kind: Servicemetadata: name: mysql-headless labels: app: mysqlspec: ports: - name: mysql port: 3306 clusterIP: None selector: app: mysql```**配置數(shù)據(jù)庫密碼**```yamlapiVersion: v1kind: Secretmetadata: name: mysql-secrettype: Opaquedata: passsword: YWJjMTIz #echo -c "abc123" | base64```**部署SatefulSet**```yamlapiVersion: apps/v1kind: StatefulSetmetadata: name: mysql-ssspec: selector: matchLabels: app: mysql serviceName: mysql-headless replicas: 2 template: metadata: labels: app: mysql spec: initContainers: - name: init-mysql #這里初始化容器的作用是獲取statefulset啟動的這個pod的順序,判斷是否為主或備 image: mysql:5.7 command: - bash - "-c" - | set ex # 從hostname中獲取索引,比如(mysql-1)會獲取(1) [[ `hostname` =~ -([0-9]+)$ ]] || exit 1 ordinal=${BASH_REMATCH[1]} echo [mysqld] > /mnt/conf.d/server-f # 為了不讓server-id相同而增加偏移量 echo server-id=$((100 + $ordinal)) >> /mnt/conf.d/server-f #獲取的數(shù)據(jù)進行emptyDir共享卷,給后面的容器使用數(shù)據(jù)。
一個pod里面的卷都是共享的 # 拷貝對應(yīng)的文件到/mnt/conf.d/文件夾中 if [[ $ordinal -eq 0 ]]; then cp /mnt/config-map/f /mnt/conf.d/ else cp /mnt/config-map/f /mnt/conf.d/ fi volumeM。
