一、k8s节点及nacos库
master:192.168.91.166
node2:192.168.91.167
node3:192.168.91.168

二、文件清单
#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


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

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

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




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

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"

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

4、数据同步测试
#主库创建测试库
kubectl exec mariadb-0 -n mariadb-cluster -- mariadb -uroot -proot -e "CREATE DATABASE test_sync2_db;"

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

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

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

五、其他
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
浙公网安备 33010602011771号