Mysql主從
准備環境
一,准備軟件
官方docker_image :Mysql5.7.28
Docker Version: 19.03.4
K8s api-version: apps/v1
二,具體制作流程
1根據docker-image編寫Dockerfile制作mysql-master鏡像2.1根據docker-image編寫Dockerfile制作mysql-salve鏡像
From mysql:latest #基礎鏡像
ENV MYSQL_ALLOW_EMPTY_PASSWORD yes #設置無密碼登錄
COPY conf.sh /mysql/conf.sh #復制配置文件
COPY set.sql /mysql/set.sql #復制配置文件
CMD ["sh", "/mysql/conf.sh"] #容器啟動時執行腳本
2.1配置文件conf.sh
#! /bin/bash
set -e
echo "1,設置mysql_server_ID....."
sed -i '/\[mysqld\]/a server-id=1\nlog-bin=/var/lib/mysql/mysql-bin\ngtid-mode=ON\nenforce-gtid-consistency=ON' /etc/mysql/mysql.conf.d/mysqld.cnf
echo "2.啟動MySQL 。。。"
service mysql start
echo "3,設置密碼。。。"
sed -i 's/MYSQLROOTPASSWOED/'$MYSQL_ROOT_PASSWORD'/' mysql/set.sql
sed -i 's/MYSQLREPLICATIONPASSWORD/'$MYSQL_REPLICATION_PASSWORD'/' mysql/set.sql
sed -i 's/MYSQLREPLICATIONUSER/'$MYSQL_REPLICATION_USER'/' mysql/set.sql
mysql < /mysql/set.sql
echo "4 service mysql status"
tail -f /dev/null
2.2配置文件set.sql 設置mysql——root密碼 創建復制用戶及密碼
use mysql;
set password for root@'localhost' = password("MYSQLROOTPASSWORD");
grant all on *.* to "MYSQLREPLICATIONUSER"@'%' identified by "MYSQLREPLICATIONPASSWORD" with grant option;
grant all on *.* to 'root'@'%' identified by "MYSQLREPLICATIONPASSWORD" with grant option;
flush privileges;
1.3將三個文件放在同級目錄構建mysql-master-image
執行命令
#docker build -t mysql5.7-master:001 .
創建完image后在本地docker環境配置容器看是否有無復制用戶
#docker run --name mysql-master -e MYSQL_ROOT_PASSWORD="123456" -e MYSQL_REPLICATION_USER="rep1" -e MYSQL_REPLICATION_PASSWORD="123456" -d mysql5.7-master:01
進入容器>進去mysql>查看用戶
#docker exec -it mysql-master bash
2.1根據docker-image編寫Dockerfile制作mysql-salve鏡像
From mysql:latest #基礎鏡像
ENV MYSQL_ALLOW_EMPTY_PASSWORD yes #設置無密碼登錄
COPY conf.sh /mysql/conf.sh #復制配置文件
COPY set.sql /mysql/set.sql #復制配置文件
CMD ["sh", "/mysql/conf.sh"] #容器啟動時執行腳本
2.1配置文件conf.sh
#! /bin/bash
set -e
echo "1,設置mysql_server_ID....."
sed -i '/\[mysqld\]/a server-id=1\nlog-bin=/var/lib/mysql/mysql-bin\ngtid-mode=ON\nenforce-gtid-consistency=ON' /etc/mysql/mysql.conf.d/mysqld.cnf
echo "2.啟動MySQL 。。。"
service mysql start
echo "3,設置密碼。。。"
sed -i 's/MYSQLROOTPASSWOED/'$MYSQL_ROOT_PASSWORD'/' mysql/set.sql
sed -i 's/MYSQLREPLICATIONPASSWORD/'$MYSQL_REPLICATION_PASSWORD'/' mysql/set.sql
sed -i 's/MYSQLREPLICATIONUSER/'$MYSQL_REPLICATION_USER'/' mysql/set.sql
mysql < /mysql/set.sql
echo "4 service mysql status"
tail -f /dev/null
2.2配置文件set.sql 設置mysql——root密碼 創建復制用戶及密碼
use mysql;
set password for root@'localhost' = password("MYSQLROOTPASSWORD");
grant all on *.* to 'root'@'%' identified by "MYSQLREPLICATIONPASSWORD" with grant option;
flush privileges;
2.3將三個文件放在同級目錄構建mysql-slave-image
執行命令
#docker build -t mysql5.7-slave:001 .
2.4創建完image后在配置slave容器
2.4.1先查看master容器IP
# docker inspect mysql-master | grep IPAddr
2.5創建slave容器
docker run --name mysql-slave -e MYSQL_ROOT_PASSWORD="123456" -e MYSQL_MASTER_SERVICE_HOST="172.17.0.10" -e MYSQL_REPLICATION_USER="rep1" -e MYSQL_REPLICATION_PASSWORD="123456" -d mysql5.7-slave:001
2.6進入容器>進去mysql>slave狀態
#docker exec -it mysql-slave bash
三,將所創建mysql-images轉入k8s鏡像庫作為底層pod基礎
1 在本地環境docker保存剛剛創建的兩個mysql鏡像
#docker save -o mysql5.7-master.tar mysql5.7-master:001
#docker save -o mysql5.7-slave.tar mysql5.7-slave:001
2導入至k8s環境
# docker load -i mysql5.7-master.tar
# docker load -i mysql5.7-slave.tar
3編寫mysql-master-deploy.yaml
apiVersion: apps/v1 #版本號
kind: Deployment #創建的資源類型
metadata: #該資源的元數據,name必選項
name: mysql-master #name描述
spec: #deployment的規格說明
replicas: 1 #副本數量
selector:
matchLabels:
name: mysql-master
template: #定義pod的模板,配置文件的重要部分
metadata: #定義pod的元數據,至少定義一個label
labels:
name: mysql-master
track: stable
spec: #描述pod的規格,定義pod中每個容器的屬性,name和image必須
containers: #容器描述
- image: mysql5.7-master:001 #鏡像來源名字
name: mysql-master
imagePullPolicy: IfNotPresent
ports:
- containerPort: 3306
env:
- name: MYSQL_ROOT_PASSWORD
value: "123456"
- name: MYSQL_REPLICATION_USER
value: "rep1"
- name: MYSQL_REPLICATION_PASSWORD
value: "123456"
4編寫mysql-mater-svc.yaml 映射端口為集群:31111
apiVersion: v1
kind: Service
metadata:
name: mysql-master
labels:
name: mysql-master
spec:
type: NodePort
ports:
- port: 3306
targetPort: 3306
nodePort: 31111
protocol: TCP
selector:
name: mysql-master
5編寫mysql-slave-deploy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: mysql-slave
spec:
replicas: 3
selector:
matchLabels:
name: mysql-slave
template:
metadata:
labels:
name: mysql-slave
spec:
# hostNetwork: true
# endpoint-pod-names: mysql-master
containers:
- name: mysql-slave
image: mysql5.7-slave:001
imagePullPolicy: IfNotPresent
env:
- name: MYSQL_ROOT_PASSWORD
value: "123456"
- name: MYSQL_REPLICATION_USER
value: "rep1"
- name: MYSQL_REPLICATION_PASSWORD
value: "123456"
- name: MYSQL_MASTER_SERVICE_HOST
value: 192.168.226.183
ports:
- name:
containerPort: 3306
查看pods狀態
#kubectl get pods -o wide
驗證 再master創建一張表看slave是否同步
