k8s部署mysql主从
时间: 2025-05-24 08:53:59 AIGC 浏览: 36
### Kubernetes 部署 MySQL 主从复制的配置教程
在 Kubernetes 中部署 MySQL 的主从复制涉及多个步骤,包括创建 ConfigMap、Secrets、PersistentVolume 和 StatefulSet 等资源对象。以下是详细的说明:
#### 1. 创建 ConfigMap
通过 ConfigMap 定义主服务器和从服务器的不同配置文件。
```yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: mysql
namespace: mysql
labels:
app: mysql
data:
master.cnf: |
[mysqld]
log-bin=mysql-bin
server-id=1
skip-name-resolve
slave.cnf: |
[mysqld]
super-read-only
log-bin=mysql-bin
replicate-ignore-db=mysql
server-id=2
skip-name-resolve
```
此部分定义了主服务器和从服务器的具体配置[^1]。
#### 2. 创建 Secrets
为了安全存储数据库凭证,可以使用 Secret 存储用户名和密码。
```yaml
apiVersion: v1
kind: Secret
metadata:
name: mysql-secret
namespace: mysql
type: Opaque
data:
root-password: cGFzc3dvcmQ= # base64 encoded password, e.g., 'password'
replica-password: cmVwbGljYQ== # base64 encoded replication user password, e.g., 'replica'
```
注意:生产环境中应采用更加复杂的安全措施来保护敏感信息[^1]。
#### 3. 设置 PersistentVolumes (PV) 和 PersistentVolumeClaims (PVC)
为主从节点分配持久化存储空间。
```yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: mysql-pv-master
spec:
capacity:
storage: 10Gi
accessModes:
- ReadWriteOnce
hostPath:
path: /mnt/data/mysql/master
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mysql-pvc-master
namespace: mysql
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
```
重复以上过程为从节点创建 PV 和 PVC[^4]。
#### 4. 配置 StatefulSet
StatefulSet 是用于管理有状态应用的工作负载之一,在这里用来运行 MySQL 实例。
##### 主实例 StatefulSet
```yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: mysql-master
namespace: mysql
spec:
serviceName: "mysql"
replicas: 1
selector:
matchLabels:
app: mysql
role: master
template:
metadata:
labels:
app: mysql
role: master
spec:
containers:
- name: mysql
image: mysql:5.7
env:
- name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-secret
key: root-password
ports:
- containerPort: 3306
name: mysql
volumeMounts:
- name: config-volume
mountPath: /etc/mysql/conf.d
- name: data-volume
mountPath: /var/lib/mysql
volumes:
- name: config-volume
configMap:
name: mysql
items:
- key: master.cnf
path: master.cnf
- name: data-volume
persistentVolumeClaim:
claimName: mysql-pvc-master
```
##### 从实例 StatefulSet
对于从节点,只需调整 `role` 标签并加载不同的配置文件即可。
```yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: mysql-slave
namespace: mysql
spec:
serviceName: "mysql"
replicas: 1
selector:
matchLabels:
app: mysql
role: slave
template:
metadata:
labels:
app: mysql
role: slave
spec:
containers:
- name: mysql
image: mysql:5.7
env:
- name: MYSQL_ALLOW_EMPTY_PASSWORD
value: "true"
command:
- bash
- "-c"
- >
mysqld --init-file=/tmp/init.sql &&
exec "$@"
ports:
- containerPort: 3306
name: mysql
volumeMounts:
- name: init-sql
mountPath: /tmp/
- name: config-volume
mountPath: /etc/mysql/conf.d
- name: data-volume
mountPath: /var/lib/mysql
volumes:
- name: init-sql
configMap:
name: mysql-init
- name: config-volume
configMap:
name: mysql
items:
- key: slave.cnf
path: slave.cnf
- name: data-volume
persistentVolumeClaim:
claimName: mysql-pvc-slave
```
初始化 SQL 文件可以通过另一个 ConfigMap 提供。
#### 5. 启动主从同步
完成上述资源配置后,需手动执行以下操作以启动主从同步。
- 登录到主节点,并授予从节点访问权限。
```sql
CREATE USER 'replica'@'%' IDENTIFIED WITH 'mysql_native_password' BY 'your_strong_password';
GRANT REPLICATION SLAVE ON *.* TO 'replica'@'%';
FLUSH PRIVILEGES;
```
- 在从节点上设置主节点信息。
```sql
CHANGE MASTER TO
MASTER_HOST='master-node-ip',
MASTER_USER='replica',
MASTER_PASSWORD='your_strong_password',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=<position>;
START SLAVE;
```
具体日志文件名和位置可以从主节点的状态中获取[^3]。
---
###
阅读全文
相关推荐


















