K8s部署MySQL主从复制实战
·
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主从复制部署完成!
更多推荐

所有评论(0)