Dict.CN 在线词典, 英语学习, 在线翻译 ------------- MyGitee My腾云code My51cto

Happy_EveryDay

可以平凡 不可以平庸 无爱则无忧,无欲则无求,无怒而无敌,无怨才是佛。所有烦恼,都是放不下的执著 开源技群 328035181 MyGitee

博客园 首页 新随笔 管理

一、k8s节点及nacos库

master:192.168.91.166

node2:192.168.91.167

node3:192.168.91.168

 

image

 

 

 

 

二、文件清单

#1 创建命名空间

mariadb‑namespace.yaml

#2 创建Secret密码
mariadb‑secret.yaml

#3 无头服务(StatefulSet依赖)
mariadb‑headless‑service.yaml

#4 NodePort对外服务
mariadb‑service.yaml(nodePort:30086)

#5 主库专用Service(写流量)
mariadb‑master‑service.yaml

#6 部署StatefulSet,拉起3个Pod
mariadb‑statefulset.yaml

gen‑conf.sh(自动化主从脚本)

 

 

 

 

 

1、mariadb‑namespace.yaml内容
apiVersion: v1
kind: Namespace
metadata:
name: mariadb-cluster


2、mariadb‑secret.yaml内容

##cm9vdA==对应root
apiVersion: v1
kind: Secret
metadata:
name: mariadb-secret
namespace: mariadb-cluster
type: Opaque
data:
root-password: cm9vdA==


3、mariadb‑headless‑service.yaml内容

apiVersion: v1
kind: Service
metadata:
name: mariadb-headless-service
namespace: mariadb-cluster
spec:
selector:
app: mariadb
clusterIP: None
ports:
- port: 3306
targetPort: 3306
type: ClusterIP


4、mariadb‑service.yaml 内容【nodePort:30086】 


apiVersion: v1
kind: Service
metadata:
name: mariadb-service
namespace: mariadb-cluster
spec:
selector:
app: mariadb
ports:
- port: 3306
targetPort: 3306
nodePort: 30086
type: NodePort


5、mariadb‑master‑service.yaml内容

apiVersion: v1
kind: Service
metadata:
name: mariadb-master-service
namespace: mariadb-cluster
spec:
selector:
app: mariadb
statefulset.kubernetes.io/pod-name: mariadb-0
ports:
- port: 3306
targetPort: 3306
type: ClusterIP


6、mariadb‑statefulset.yaml内容

apiVersion: apps/v1
kind: StatefulSet
metadata:
name: mariadb
namespace: mariadb-cluster
spec:
replicas: 3
selector:
matchLabels:
app: mariadb
serviceName: mariadb-headless-service
template:
metadata:
labels:
app: mariadb
spec:
containers:
- name: mariadb
image: mariadb:latest
env:
- name: MARIADB_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: mariadb-secret
key: root-password
ports:
- containerPort: 3306
name: mysql
volumeMounts:
- name: mariadb-data
mountPath: /var/lib/mysql
volumeClaimTemplates:
- metadata:
name: mariadb-data
spec:
accessModes: [ "ReadWriteOnce" ]

storageClassName: local‑path #显式指定local‑path
resources:
requests:
storage: 10Gi

 

 

 

 

 

 

image

image

 


7、gen‑conf.sh内容

#!/bin/bash
set -e
NS="mariadb-cluster"
ROOT_PWD="root"

echo "===== 1.主库 mariadb-0 创建复制账号 ====="
kubectl exec -it mariadb-0 -n ${NS} -- mysql -uroot -p${ROOT_PWD} -e "
CREATE USER IF NOT EXISTS 'repl'@'%' IDENTIFIED BY 'root';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
FLUSH PRIVILEGES;
"

# 获取主库 binlog File / Position
MASTER_STATUS=$(kubectl exec mariadb-0 -n ${NS} -- mysql -uroot -p${ROOT_PWD} -Ns -e "SHOW MASTER STATUS;")
MASTER_LOG_FILE=$(echo ${MASTER_STATUS} | awk '{print $1}')
MASTER_LOG_POS=$(echo ${MASTER_STATUS} | awk '{print $2}')

echo "MASTER_LOG_FILE=${MASTER_LOG_FILE}"
echo "MASTER_LOG_POS=${MASTER_LOG_POS}"

echo -e "\n===== 2.配置从库 mariadb-1 ====="
kubectl exec -it mariadb-1 -n ${NS} -- mysql -uroot -p${ROOT_PWD} -e "
STOP SLAVE;
CHANGE MASTER TO
MASTER_HOST='mariadb-0.mariadb-headless-service.${NS}.svc.cluster.local',
MASTER_USER='repl',
MASTER_PASSWORD='root',
MASTER_LOG_FILE='${MASTER_LOG_FILE}',
MASTER_LOG_POS=${MASTER_LOG_POS};
START SLAVE;
"

echo -e "\n===== 3.配置从库 mariadb-2 ====="
kubectl exec -it mariadb-2 -n ${NS} -- mysql -uroot -p${ROOT_PWD} -e "
STOP SLAVE;
CHANGE MASTER TO
MASTER_HOST='mariadb-0.mariadb-headless-service.${NS}.svc.cluster.local',
MASTER_USER='repl',
MASTER_PASSWORD='root',
MASTER_LOG_FILE='${MASTER_LOG_FILE}',
MASTER_LOG_POS=${MASTER_LOG_POS};
START SLAVE;
"

echo -e "\n===== 4.检查从库复制状态 mariadb-1 ====="
kubectl exec mariadb-1 -n ${NS} -- mysql -uroot -p${ROOT_PWD} -e "SHOW SLAVE STATUS\G" | grep -E "Slave_IO_Running|Slave_SQL_Running|Last_Errno"

echo -e "\n===== 5.检查从库复制状态 mariadb-2 ====="
kubectl exec mariadb-2 -n ${NS} -- mysql -uroot -p${ROOT_PWD} -e "SHOW SLAVE STATUS\G" | grep -E "Slave_IO_Running|Slave_SQL_Running|Last_Errno"

echo -e "\n===== 完成 ====="

 

 

 

 

三、文件执行顺序

#1 创建命名空间
kubectl apply -f mariadb-namespace.yaml

#2 创建Secret密码
kubectl apply -f mariadb-secret.yaml

#3 无头服务(StatefulSet依赖)
kubectl apply -f mariadb-headless-service.yaml

#4 NodePort对外服务
kubectl apply -f mariadb-service.yaml

#5 主库专用Service(写流量)
kubectl apply -f mariadb-master-service.yaml

#6 部署StatefulSet,拉起3个Pod
kubectl apply -f mariadb-statefulset.yaml

 

####等待全部 Pod 变成 Running 状态

kubectl get pods -n mariadb-cluster -w

image

 

####给脚本授权,执行自动化主从配置
chmod +x gen-conf.sh
./gen-conf.sh

 

image

 

 

 

 

 

 

 

 

四、查看全部资源

1、查看全部资源
kubectl get all,pvc -n mariadb-cluster

image

 

image

 

image

 

image

 

 

 

 

2、查看主库 binlog 状态
kubectl exec mariadb-0 -n mariadb-cluster -- mariadb -uroot -proot -e "SHOW MASTER STATUS;"

image

 


3、校验从库复制(Slave_IO_Running:Yes、Slave_SQL_Running:Yes、Last_Errno:0 才正常)

 

kubectl exec mariadb-1 -n mariadb-cluster -- mariadb -uroot -proot -e "SHOW SLAVE STATUS\G"

image

 


kubectl exec mariadb-2 -n mariadb-cluster -- mariadb -uroot -proot -e "SHOW SLAVE STATUS\G"

image

 

 


4、数据同步测试
#主库创建测试库

kubectl exec mariadb-0 -n mariadb-cluster -- mariadb -uroot -proot -e "CREATE DATABASE test_sync2_db;"

image

 

#从库查询,能看到 test_sync_db 代表复制生效
kubectl exec mariadb-1 -n mariadb-cluster -- mariadb -uroot -proot -e "SHOW DATABASES;"

image

 


kubectl exec mariadb-2 -n mariadb-cluster -- mariadb -uroot -proot -e "SHOW DATABASES;"

image

 

 

5、NodePort 外部访问测试【30086】

 

image

 

 

 

 

 

 

五、其他

 

1、集群内部访问域名
写(仅主库):mariadb-master-service.mariadb-cluster.svc.cluster.local:3306
Pod 直接访问:
mariadb-0.mariadb-headless-service.mariadb-cluster.svc.cluster.local
mariadb-1.mariadb-headless-service.mariadb-cluster.svc.cluster.local
mariadb-2.mariadb-headless-service.mariadb-cluster.svc.cluster.local

2、集群完整清理命令
kubectl delete -f mariadb-statefulset.yaml
kubectl delete -f mariadb-master-service.yaml
kubectl delete -f mariadb-service.yaml
kubectl delete -f mariadb-headless-service.yaml
kubectl delete -f mariadb-secret.yaml
kubectl delete -f mariadb-namespace.yaml
kubectl delete pvc -n mariadb-cluster mariadb-data-mariadb-0 mariadb-data-mariadb-1 mariadb-data-mariadb-2

3、必须 Pod 全部 Running 后再运行gen‑conf.sh,否则脚本报错。

4、从库报 1396 冲突,在故障从库执行:
stop slave;
set global sql_slave_skip_counter=1;
start slave;
show slave status\G

 

posted on 2026-08-17 19:49  2026cn  阅读(3)  评论(0)    收藏  举报