内容简介:本文主要介绍MariaDB在Kubernetes环境中的部署实践,包括Kubernetes的基本概念、MariaDB on Kubernetes的优势、Kubernetes部署模式、集群架构设计、资源配置建议、存储配置建议等内容。通过单节点部署、主从复制部署和Galera Cluster部署案例,展示MariaDB在Kubernetes上的部署方法。风哥教程参考MariaDB官方文档和Kubernetes最佳实践。
Part01-基础概念与理论知识
1.1 Kubernetes的基本概念
Kubernetes是一个开源的容器编排平台,用于自动部署、扩展和管理容器化应用。Kubernetes的基本概念包括:
- Pod:Kubernetes的最小部署单元,包含一个或多个容器
- Deployment:管理Pod的副本数量和更新策略
- Service:提供稳定的网络访问点
- PersistentVolume (PV):持久化存储资源
- PersistentVolumeClaim (PVC):对PV的请求
- ConfigMap:存储配置数据
- Secret:存储敏感信息
- StatefulSet:管理有状态应用
1.2 MariaDB on Kubernetes的优势
MariaDB on Kubernetes的优势包括:
- 高可用性:Kubernetes提供自动故障转移和恢复
- 可扩展性:根据需求自动扩展
- 资源利用率:更高效地利用计算资源
- 简化管理:统一的管理界面和API
- 滚动更新:无停机更新应用
- 环境一致性:开发、测试和生产环境一致
1.3 Kubernetes部署模式
MariaDB在Kubernetes上的部署模式包括:
- 单节点部署:适用于开发和测试环境
- 主从复制:适用于生产环境,提供高可用性
- Galera Cluster:适用于高可用性要求高的生产环境
- StatefulSet部署:管理有状态应用的最佳实践
更多视频教程www.fgedu.net.cn
Part02-生产环境规划与建议
2.1 集群架构设计
集群架构设计建议:
- 多节点集群:部署至少3个节点,确保高可用性
- 节点分布:将节点分布在不同的可用区
- 网络配置:配置CNI网络插件,确保Pod间通信
- 存储配置:使用持久化存储,确保数据安全
- 监控配置:部署Prometheus和Grafana监控集群
2.2 资源配置建议
资源配置建议:
- CPU和内存:根据MariaDB的需求配置合适的资源
- Pod资源限制:设置资源请求和限制
- 副本数:根据高可用性需求配置副本数
- 调度策略:使用节点亲和性和反亲和性
2.3 存储配置建议
存储配置建议:
- 存储类型:选择高性能存储,如SSD
- 存储类:配置StorageClass,支持动态存储 provisioning
- 持久化卷:使用PersistentVolume和PersistentVolumeClaim
- 备份策略:定期备份数据,确保数据安全
学习交流加群风哥微信: itpux-com
Part03-生产环境项目实施方案
3.1 Kubernetes部署流程
更多学习教程公众号风哥教程itpux_com
# Kubernetes部署流程
# 1. 准备Kubernetes集群
# 安装kubectl
curl -LO “https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl”
chmod +x kubectl
sudo mv kubectl /usr/local/bin/
# 2. 配置存储
# 创建StorageClass
cat > storageclass.yaml << EOF
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: mariadb-storage
provisioner: kubernetes.io/aws-ebs
parameters:
type: gp2
reclaimPolicy: Retain
allowVolumeExpansion: true
EOF
kubectl apply -f storageclass.yaml
# 3. 创建Secret
# 创建数据库密码Secret
kubectl create secret generic mariadb-secret –from-literal=password=your-password
# 4. 部署MariaDB
# 创建StatefulSet
cat > mariadb-statefulset.yaml << EOF
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: mariadb
spec:
serviceName: mariadb
replicas: 1
selector:
matchLabels:
app: mariadb
template:
metadata:
labels:
app: mariadb
spec:
containers:
– name: mariadb
image: mariadb:10.5
ports:
– containerPort: 3306
env:
– name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: mariadb-secret
key: password
volumeMounts:
– name: mariadb-data
mountPath: /var/lib/mysql
volumeClaimTemplates:
– metadata:
name: mariadb-data
spec:
storageClassName: mariadb-storage
accessModes: [“ReadWriteOnce”]
resources:
requests:
storage: 10Gi
EOF
kubectl apply -f mariadb-statefulset.yaml
# 5. 创建Service
cat > mariadb-service.yaml << EOF
apiVersion: v1
kind: Service
metadata:
name: mariadb
spec:
selector:
app: mariadb
ports:
– port: 3306
targetPort: 3306
EOF
kubectl apply -f mariadb-service.yaml
# 1. 准备Kubernetes集群
# 安装kubectl
curl -LO “https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl”
chmod +x kubectl
sudo mv kubectl /usr/local/bin/
# 2. 配置存储
# 创建StorageClass
cat > storageclass.yaml << EOF
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: mariadb-storage
provisioner: kubernetes.io/aws-ebs
parameters:
type: gp2
reclaimPolicy: Retain
allowVolumeExpansion: true
EOF
kubectl apply -f storageclass.yaml
# 3. 创建Secret
# 创建数据库密码Secret
kubectl create secret generic mariadb-secret –from-literal=password=your-password
# 4. 部署MariaDB
# 创建StatefulSet
cat > mariadb-statefulset.yaml << EOF
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: mariadb
spec:
serviceName: mariadb
replicas: 1
selector:
matchLabels:
app: mariadb
template:
metadata:
labels:
app: mariadb
spec:
containers:
– name: mariadb
image: mariadb:10.5
ports:
– containerPort: 3306
env:
– name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: mariadb-secret
key: password
volumeMounts:
– name: mariadb-data
mountPath: /var/lib/mysql
volumeClaimTemplates:
– metadata:
name: mariadb-data
spec:
storageClassName: mariadb-storage
accessModes: [“ReadWriteOnce”]
resources:
requests:
storage: 10Gi
EOF
kubectl apply -f mariadb-statefulset.yaml
# 5. 创建Service
cat > mariadb-service.yaml << EOF
apiVersion: v1
kind: Service
metadata:
name: mariadb
spec:
selector:
app: mariadb
ports:
– port: 3306
targetPort: 3306
EOF
kubectl apply -f mariadb-service.yaml
3.2 高可用性配置
# 高可用性配置
# 1. 主从复制配置
# 创建主从复制StatefulSet
cat > mariadb-master-slave.yaml << EOF
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: mariadb-master
spec:
serviceName: mariadb-master
replicas: 1
selector:
matchLabels:
app: mariadb-master
template:
metadata:
labels:
app: mariadb-master
spec:
containers:
– name: mariadb
image: mariadb:10.5
ports:
– containerPort: 3306
env:
– name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: mariadb-secret
key: password
– name: MYSQL_REPLICATION_USER
value: repl
– name: MYSQL_REPLICATION_PASSWORD
value: repl-password
volumeMounts:
– name: mariadb-data
mountPath: /var/lib/mysql
volumeClaimTemplates:
– metadata:
name: mariadb-data
spec:
storageClassName: mariadb-storage
accessModes: [“ReadWriteOnce”]
resources:
requests:
storage: 10Gi
EOF
kubectl apply -f mariadb-master-slave.yaml
# 创建从节点StatefulSet
cat > mariadb-slave.yaml << EOF
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: mariadb-slave
spec:
serviceName: mariadb-slave
replicas: 2
selector:
matchLabels:
app: mariadb-slave
template:
metadata:
labels:
app: mariadb-slave
spec:
containers:
– name: mariadb
image: mariadb:10.5
ports:
– containerPort: 3306
env:
– name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: mariadb-secret
key: password
– name: MYSQL_REPLICATION_USER
value: repl
– name: MYSQL_REPLICATION_PASSWORD
value: repl-password
– name: MYSQL_MASTER_HOST
value: mariadb-master
– name: MYSQL_MASTER_PORT_NUMBER
value: “3306”
volumeMounts:
– name: mariadb-data
mountPath: /var/lib/mysql
volumeClaimTemplates:
– metadata:
name: mariadb-data
spec:
storageClassName: mariadb-storage
accessModes: [“ReadWriteOnce”]
resources:
requests:
storage: 10Gi
EOF
kubectl apply -f mariadb-slave.yaml
# 2. Galera Cluster配置
# 创建Galera Cluster StatefulSet
cat > mariadb-galera.yaml << EOF
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: mariadb-galera
spec:
serviceName: mariadb-galera
replicas: 3
selector:
matchLabels:
app: mariadb-galera
template:
metadata:
labels:
app: mariadb-galera
spec:
containers:
– name: mariadb
image: bitnami/mariadb-galera:10.5
ports:
– containerPort: 3306
– containerPort: 4567
– containerPort: 4568
– containerPort: 4444
env:
– name: MARIADB_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: mariadb-secret
key: password
– name: MARIADB_GALERA_CLUSTER_BOOTSTRAP
value: “true”
– name: MARIADB_GALERA_CLUSTER_NAME
value: “fgedu-galera”
– name: MARIADB_GALERA_MARIABACKUP_USER
value: backup
– name: MARIADB_GALERA_MARIABACKUP_PASSWORD
value: backup-password
volumeMounts:
– name: mariadb-data
mountPath: /bitnami/mariadb
volumeClaimTemplates:
– metadata:
name: mariadb-data
spec:
storageClassName: mariadb-storage
accessModes: [“ReadWriteOnce”]
resources:
requests:
storage: 10Gi
EOF
kubectl apply -f mariadb-galera.yaml
# 1. 主从复制配置
# 创建主从复制StatefulSet
cat > mariadb-master-slave.yaml << EOF
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: mariadb-master
spec:
serviceName: mariadb-master
replicas: 1
selector:
matchLabels:
app: mariadb-master
template:
metadata:
labels:
app: mariadb-master
spec:
containers:
– name: mariadb
image: mariadb:10.5
ports:
– containerPort: 3306
env:
– name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: mariadb-secret
key: password
– name: MYSQL_REPLICATION_USER
value: repl
– name: MYSQL_REPLICATION_PASSWORD
value: repl-password
volumeMounts:
– name: mariadb-data
mountPath: /var/lib/mysql
volumeClaimTemplates:
– metadata:
name: mariadb-data
spec:
storageClassName: mariadb-storage
accessModes: [“ReadWriteOnce”]
resources:
requests:
storage: 10Gi
EOF
kubectl apply -f mariadb-master-slave.yaml
# 创建从节点StatefulSet
cat > mariadb-slave.yaml << EOF
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: mariadb-slave
spec:
serviceName: mariadb-slave
replicas: 2
selector:
matchLabels:
app: mariadb-slave
template:
metadata:
labels:
app: mariadb-slave
spec:
containers:
– name: mariadb
image: mariadb:10.5
ports:
– containerPort: 3306
env:
– name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: mariadb-secret
key: password
– name: MYSQL_REPLICATION_USER
value: repl
– name: MYSQL_REPLICATION_PASSWORD
value: repl-password
– name: MYSQL_MASTER_HOST
value: mariadb-master
– name: MYSQL_MASTER_PORT_NUMBER
value: “3306”
volumeMounts:
– name: mariadb-data
mountPath: /var/lib/mysql
volumeClaimTemplates:
– metadata:
name: mariadb-data
spec:
storageClassName: mariadb-storage
accessModes: [“ReadWriteOnce”]
resources:
requests:
storage: 10Gi
EOF
kubectl apply -f mariadb-slave.yaml
# 2. Galera Cluster配置
# 创建Galera Cluster StatefulSet
cat > mariadb-galera.yaml << EOF
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: mariadb-galera
spec:
serviceName: mariadb-galera
replicas: 3
selector:
matchLabels:
app: mariadb-galera
template:
metadata:
labels:
app: mariadb-galera
spec:
containers:
– name: mariadb
image: bitnami/mariadb-galera:10.5
ports:
– containerPort: 3306
– containerPort: 4567
– containerPort: 4568
– containerPort: 4444
env:
– name: MARIADB_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: mariadb-secret
key: password
– name: MARIADB_GALERA_CLUSTER_BOOTSTRAP
value: “true”
– name: MARIADB_GALERA_CLUSTER_NAME
value: “fgedu-galera”
– name: MARIADB_GALERA_MARIABACKUP_USER
value: backup
– name: MARIADB_GALERA_MARIABACKUP_PASSWORD
value: backup-password
volumeMounts:
– name: mariadb-data
mountPath: /bitnami/mariadb
volumeClaimTemplates:
– metadata:
name: mariadb-data
spec:
storageClassName: mariadb-storage
accessModes: [“ReadWriteOnce”]
resources:
requests:
storage: 10Gi
EOF
kubectl apply -f mariadb-galera.yaml
3.3 监控与管理
# 监控与管理
# 1. 部署Prometheus
# 添加Prometheus Helm仓库
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
# 安装Prometheus
helm install prometheus prometheus-community/prometheus
# 2. 部署Grafana
# 添加Grafana Helm仓库
helm repo add grafana https://grafana.github.io/helm-charts
# 安装Grafana
helm install grafana grafana/grafana
# 3. 部署MariaDB Exporter
# 创建MariaDB Exporter Deployment
cat > mariadb-exporter.yaml << EOF
apiVersion: apps/v1
kind: Deployment
metadata:
name: mariadb-exporter
spec:
replicas: 1
selector:
matchLabels:
app: mariadb-exporter
template:
metadata:
labels:
app: mariadb-exporter
spec:
containers:
– name: mariadb-exporter
image: prom/mysqld_exporter:latest
ports:
– containerPort: 9104
env:
– name: DATA_SOURCE_NAME
value: “exporter:exporter-password@(mariadb:3306)/”
EOF
kubectl apply -f mariadb-exporter.yaml
# 4. 配置ServiceMonitor
cat > mariadb-servicemonitor.yaml << EOF
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: mariadb
spec:
selector:
matchLabels:
app: mariadb-exporter
endpoints:
– port: 9104
interval: 15s
EOF
kubectl apply -f mariadb-servicemonitor.yaml
# 5. 配置Grafana Dashboard
# 导入MariaDB Dashboard
# 访问Grafana UI,导入Dashboard ID: 7362
# 1. 部署Prometheus
# 添加Prometheus Helm仓库
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
# 安装Prometheus
helm install prometheus prometheus-community/prometheus
# 2. 部署Grafana
# 添加Grafana Helm仓库
helm repo add grafana https://grafana.github.io/helm-charts
# 安装Grafana
helm install grafana grafana/grafana
# 3. 部署MariaDB Exporter
# 创建MariaDB Exporter Deployment
cat > mariadb-exporter.yaml << EOF
apiVersion: apps/v1
kind: Deployment
metadata:
name: mariadb-exporter
spec:
replicas: 1
selector:
matchLabels:
app: mariadb-exporter
template:
metadata:
labels:
app: mariadb-exporter
spec:
containers:
– name: mariadb-exporter
image: prom/mysqld_exporter:latest
ports:
– containerPort: 9104
env:
– name: DATA_SOURCE_NAME
value: “exporter:exporter-password@(mariadb:3306)/”
EOF
kubectl apply -f mariadb-exporter.yaml
# 4. 配置ServiceMonitor
cat > mariadb-servicemonitor.yaml << EOF
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: mariadb
spec:
selector:
matchLabels:
app: mariadb-exporter
endpoints:
– port: 9104
interval: 15s
EOF
kubectl apply -f mariadb-servicemonitor.yaml
# 5. 配置Grafana Dashboard
# 导入MariaDB Dashboard
# 访问Grafana UI,导入Dashboard ID: 7362
学习交流加群风哥QQ113257174
Part04-生产案例与实战讲解
4.1 单节点部署案例
场景描述:在Kubernetes上部署单节点MariaDB,适用于开发和测试环境。
# 单节点部署案例
# 1. 创建StorageClass
cat > storageclass.yaml << EOF
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: mariadb-storage
provisioner: kubernetes.io/aws-ebs
parameters:
type: gp2
reclaimPolicy: Retain
allowVolumeExpansion: true
EOF
kubectl apply -f storageclass.yaml
# 2. 创建Secret
kubectl create secret generic mariadb-secret –from-literal=password=your-password
# 3. 创建StatefulSet
cat > mariadb-statefulset.yaml << EOF
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: mariadb
spec:
serviceName: mariadb
replicas: 1
selector:
matchLabels:
app: mariadb
template:
metadata:
labels:
app: mariadb
spec:
containers:
– name: mariadb
image: mariadb:10.5
ports:
– containerPort: 3306
env:
– name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: mariadb-secret
key: password
volumeMounts:
– name: mariadb-data
mountPath: /var/lib/mysql
volumeClaimTemplates:
– metadata:
name: mariadb-data
spec:
storageClassName: mariadb-storage
accessModes: [“ReadWriteOnce”]
resources:
requests:
storage: 10Gi
EOF
kubectl apply -f mariadb-statefulset.yaml
# 4. 创建Service
cat > mariadb-service.yaml << EOF
apiVersion: v1
kind: Service
metadata:
name: mariadb
spec:
selector:
app: mariadb
ports:
– port: 3306
targetPort: 3306
EOF
kubectl apply -f mariadb-service.yaml
# 5. 验证部署
kubectl get pods
kubectl get services
# 6. 连接数据库
kubectl run -it –rm –image=mariadb:10.5 mysql-client — mysql -h mariadb -u root -p
# 1. 创建StorageClass
cat > storageclass.yaml << EOF
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: mariadb-storage
provisioner: kubernetes.io/aws-ebs
parameters:
type: gp2
reclaimPolicy: Retain
allowVolumeExpansion: true
EOF
kubectl apply -f storageclass.yaml
# 2. 创建Secret
kubectl create secret generic mariadb-secret –from-literal=password=your-password
# 3. 创建StatefulSet
cat > mariadb-statefulset.yaml << EOF
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: mariadb
spec:
serviceName: mariadb
replicas: 1
selector:
matchLabels:
app: mariadb
template:
metadata:
labels:
app: mariadb
spec:
containers:
– name: mariadb
image: mariadb:10.5
ports:
– containerPort: 3306
env:
– name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: mariadb-secret
key: password
volumeMounts:
– name: mariadb-data
mountPath: /var/lib/mysql
volumeClaimTemplates:
– metadata:
name: mariadb-data
spec:
storageClassName: mariadb-storage
accessModes: [“ReadWriteOnce”]
resources:
requests:
storage: 10Gi
EOF
kubectl apply -f mariadb-statefulset.yaml
# 4. 创建Service
cat > mariadb-service.yaml << EOF
apiVersion: v1
kind: Service
metadata:
name: mariadb
spec:
selector:
app: mariadb
ports:
– port: 3306
targetPort: 3306
EOF
kubectl apply -f mariadb-service.yaml
# 5. 验证部署
kubectl get pods
kubectl get services
# 6. 连接数据库
kubectl run -it –rm –image=mariadb:10.5 mysql-client — mysql -h mariadb -u root -p
执行结果:
# 单节点部署结果
# Pod状态:Running
# Service状态:Available
# 数据库连接:成功
# 系统运行:稳定
# Pod状态:Running
# Service状态:Available
# 数据库连接:成功
# 系统运行:稳定
4.2 主从复制部署案例
场景描述:在Kubernetes上部署MariaDB主从复制,适用于生产环境。
# 主从复制部署案例
# 1. 创建StorageClass
kubectl apply -f storageclass.yaml
# 2. 创建Secret
kubectl create secret generic mariadb-secret –from-literal=password=your-password
# 3. 创建主节点StatefulSet
cat > mariadb-master.yaml << EOF
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: mariadb-master
spec:
serviceName: mariadb-master
replicas: 1
selector:
matchLabels:
app: mariadb-master
template:
metadata:
labels:
app: mariadb-master
spec:
containers:
– name: mariadb
image: mariadb:10.5
ports:
– containerPort: 3306
env:
– name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: mariadb-secret
key: password
– name: MYSQL_REPLICATION_USER
value: repl
– name: MYSQL_REPLICATION_PASSWORD
value: repl-password
volumeMounts:
– name: mariadb-data
mountPath: /var/lib/mysql
volumeClaimTemplates:
– metadata:
name: mariadb-data
spec:
storageClassName: mariadb-storage
accessModes: [“ReadWriteOnce”]
resources:
requests:
storage: 10Gi
EOF
kubectl apply -f mariadb-master.yaml
# 4. 创建主节点Service
cat > mariadb-master-service.yaml << EOF
apiVersion: v1
kind: Service
metadata:
name: mariadb-master
spec:
selector:
app: mariadb-master
ports:
– port: 3306
targetPort: 3306
EOF
kubectl apply -f mariadb-master-service.yaml
# 5. 创建从节点StatefulSet
cat > mariadb-slave.yaml << EOF
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: mariadb-slave
spec:
serviceName: mariadb-slave
replicas: 2
selector:
matchLabels:
app: mariadb-slave
template:
metadata:
labels:
app: mariadb-slave
spec:
containers:
– name: mariadb
image: mariadb:10.5
ports:
– containerPort: 3306
env:
– name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: mariadb-secret
key: password
– name: MYSQL_REPLICATION_USER
value: repl
– name: MYSQL_REPLICATION_PASSWORD
value: repl-password
– name: MYSQL_MASTER_HOST
value: mariadb-master
– name: MYSQL_MASTER_PORT_NUMBER
value: “3306”
volumeMounts:
– name: mariadb-data
mountPath: /var/lib/mysql
volumeClaimTemplates:
– metadata:
name: mariadb-data
spec:
storageClassName: mariadb-storage
accessModes: [“ReadWriteOnce”]
resources:
requests:
storage: 10Gi
EOF
kubectl apply -f mariadb-slave.yaml
# 6. 创建从节点Service
cat > mariadb-slave-service.yaml << EOF
apiVersion: v1
kind: Service
metadata:
name: mariadb-slave
spec:
selector:
app: mariadb-slave
ports:
– port: 3306
targetPort: 3306
EOF
kubectl apply -f mariadb-slave-service.yaml
# 7. 验证主从复制
# 连接主节点
kubectl run -it –rm –image=mariadb:10.5 mysql-client — mysql -h mariadb-master -u root -p -e “SHOW MASTER STATUS;
”
# 连接从节点
kubectl run -it –rm –image=mariadb:10.5 mysql-client — mysql -h mariadb-slave -u root -p -e “SHOW SLAVE STATUS\G;
”
# 1. 创建StorageClass
kubectl apply -f storageclass.yaml
# 2. 创建Secret
kubectl create secret generic mariadb-secret –from-literal=password=your-password
# 3. 创建主节点StatefulSet
cat > mariadb-master.yaml << EOF
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: mariadb-master
spec:
serviceName: mariadb-master
replicas: 1
selector:
matchLabels:
app: mariadb-master
template:
metadata:
labels:
app: mariadb-master
spec:
containers:
– name: mariadb
image: mariadb:10.5
ports:
– containerPort: 3306
env:
– name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: mariadb-secret
key: password
– name: MYSQL_REPLICATION_USER
value: repl
– name: MYSQL_REPLICATION_PASSWORD
value: repl-password
volumeMounts:
– name: mariadb-data
mountPath: /var/lib/mysql
volumeClaimTemplates:
– metadata:
name: mariadb-data
spec:
storageClassName: mariadb-storage
accessModes: [“ReadWriteOnce”]
resources:
requests:
storage: 10Gi
EOF
kubectl apply -f mariadb-master.yaml
# 4. 创建主节点Service
cat > mariadb-master-service.yaml << EOF
apiVersion: v1
kind: Service
metadata:
name: mariadb-master
spec:
selector:
app: mariadb-master
ports:
– port: 3306
targetPort: 3306
EOF
kubectl apply -f mariadb-master-service.yaml
# 5. 创建从节点StatefulSet
cat > mariadb-slave.yaml << EOF
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: mariadb-slave
spec:
serviceName: mariadb-slave
replicas: 2
selector:
matchLabels:
app: mariadb-slave
template:
metadata:
labels:
app: mariadb-slave
spec:
containers:
– name: mariadb
image: mariadb:10.5
ports:
– containerPort: 3306
env:
– name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: mariadb-secret
key: password
– name: MYSQL_REPLICATION_USER
value: repl
– name: MYSQL_REPLICATION_PASSWORD
value: repl-password
– name: MYSQL_MASTER_HOST
value: mariadb-master
– name: MYSQL_MASTER_PORT_NUMBER
value: “3306”
volumeMounts:
– name: mariadb-data
mountPath: /var/lib/mysql
volumeClaimTemplates:
– metadata:
name: mariadb-data
spec:
storageClassName: mariadb-storage
accessModes: [“ReadWriteOnce”]
resources:
requests:
storage: 10Gi
EOF
kubectl apply -f mariadb-slave.yaml
# 6. 创建从节点Service
cat > mariadb-slave-service.yaml << EOF
apiVersion: v1
kind: Service
metadata:
name: mariadb-slave
spec:
selector:
app: mariadb-slave
ports:
– port: 3306
targetPort: 3306
EOF
kubectl apply -f mariadb-slave-service.yaml
# 7. 验证主从复制
# 连接主节点
kubectl run -it –rm –image=mariadb:10.5 mysql-client — mysql -h mariadb-master -u root -p -e “SHOW MASTER STATUS;
”
# 连接从节点
kubectl run -it –rm –image=mariadb:10.5 mysql-client — mysql -h mariadb-slave -u root -p -e “SHOW SLAVE STATUS\G;
”
执行结果:
# 主从复制部署结果
# 主节点状态:Running
# 从节点状态:Running
# 主从复制状态:正常
# 系统运行:稳定
# 主节点状态:Running
# 从节点状态:Running
# 主从复制状态:正常
# 系统运行:稳定
4.3 Galera Cluster部署案例
场景描述:在Kubernetes上部署MariaDB Galera Cluster,适用于高可用性要求高的生产环境。
# Galera Cluster部署案例
# 1. 创建StorageClass
kubectl apply -f storageclass.yaml
# 2. 创建Secret
kubectl create secret generic mariadb-secret –from-literal=password=your-password
# 3. 创建Galera Cluster StatefulSet
cat > mariadb-galera.yaml << EOF
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: mariadb-galera
spec:
serviceName: mariadb-galera
replicas: 3
selector:
matchLabels:
app: mariadb-galera
template:
metadata:
labels:
app: mariadb-galera
spec:
containers:
– name: mariadb
image: bitnami/mariadb-galera:10.5
ports:
– containerPort: 3306
– containerPort: 4567
– containerPort: 4568
– containerPort: 4444
env:
– name: MARIADB_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: mariadb-secret
key: password
– name: MARIADB_GALERA_CLUSTER_BOOTSTRAP
value: “true”
– name: MARIADB_GALERA_CLUSTER_NAME
value: “fgedu-galera”
– name: MARIADB_GALERA_MARIABACKUP_USER
value: backup
– name: MARIADB_GALERA_MARIABACKUP_PASSWORD
value: backup-password
volumeMounts:
– name: mariadb-data
mountPath: /bitnami/mariadb
volumeClaimTemplates:
– metadata:
name: mariadb-data
spec:
storageClassName: mariadb-storage
accessModes: [“ReadWriteOnce”]
resources:
requests:
storage: 10Gi
EOF
kubectl apply -f mariadb-galera.yaml
# 4. 创建Galera Cluster Service
cat > mariadb-galera-service.yaml << EOF
apiVersion: v1
kind: Service
metadata:
name: mariadb-galera
spec:
selector:
app: mariadb-galera
ports:
– port: 3306
targetPort: 3306
clusterIP: None
EOF
kubectl apply -f mariadb-galera-service.yaml
# 5. 创建Galera Cluster LoadBalancer Service
cat > mariadb-galera-lb.yaml << EOF
apiVersion: v1
kind: Service
metadata:
name: mariadb-galera-lb
spec:
selector:
app: mariadb-galera
ports:
– port: 3306
targetPort: 3306
type: LoadBalancer
EOF
kubectl apply -f mariadb-galera-lb.yaml
# 6. 验证Galera Cluster
# 连接Galera Cluster
kubectl run -it –rm –image=mariadb:10.5 mysql-client — mysql -h mariadb-galera-lb -u root -p -e “SHOW STATUS LIKE ‘wsrep%’;
”
# 1. 创建StorageClass
kubectl apply -f storageclass.yaml
# 2. 创建Secret
kubectl create secret generic mariadb-secret –from-literal=password=your-password
# 3. 创建Galera Cluster StatefulSet
cat > mariadb-galera.yaml << EOF
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: mariadb-galera
spec:
serviceName: mariadb-galera
replicas: 3
selector:
matchLabels:
app: mariadb-galera
template:
metadata:
labels:
app: mariadb-galera
spec:
containers:
– name: mariadb
image: bitnami/mariadb-galera:10.5
ports:
– containerPort: 3306
– containerPort: 4567
– containerPort: 4568
– containerPort: 4444
env:
– name: MARIADB_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: mariadb-secret
key: password
– name: MARIADB_GALERA_CLUSTER_BOOTSTRAP
value: “true”
– name: MARIADB_GALERA_CLUSTER_NAME
value: “fgedu-galera”
– name: MARIADB_GALERA_MARIABACKUP_USER
value: backup
– name: MARIADB_GALERA_MARIABACKUP_PASSWORD
value: backup-password
volumeMounts:
– name: mariadb-data
mountPath: /bitnami/mariadb
volumeClaimTemplates:
– metadata:
name: mariadb-data
spec:
storageClassName: mariadb-storage
accessModes: [“ReadWriteOnce”]
resources:
requests:
storage: 10Gi
EOF
kubectl apply -f mariadb-galera.yaml
# 4. 创建Galera Cluster Service
cat > mariadb-galera-service.yaml << EOF
apiVersion: v1
kind: Service
metadata:
name: mariadb-galera
spec:
selector:
app: mariadb-galera
ports:
– port: 3306
targetPort: 3306
clusterIP: None
EOF
kubectl apply -f mariadb-galera-service.yaml
# 5. 创建Galera Cluster LoadBalancer Service
cat > mariadb-galera-lb.yaml << EOF
apiVersion: v1
kind: Service
metadata:
name: mariadb-galera-lb
spec:
selector:
app: mariadb-galera
ports:
– port: 3306
targetPort: 3306
type: LoadBalancer
EOF
kubectl apply -f mariadb-galera-lb.yaml
# 6. 验证Galera Cluster
# 连接Galera Cluster
kubectl run -it –rm –image=mariadb:10.5 mysql-client — mysql -h mariadb-galera-lb -u root -p -e “SHOW STATUS LIKE ‘wsrep%’;
”
执行结果:
# Galera Cluster部署结果
# Pod状态:Running (3个)
# Service状态:Available
# Galera Cluster状态:正常
# 系统运行:稳定
# Pod状态:Running (3个)
# Service状态:Available
# Galera Cluster状态:正常
# 系统运行:稳定
风哥提示:安全开发是防止SQL注入的第一道防线
Part05-风哥经验总结与分享
5.1 最佳实践
风哥提示:在Kubernetes上部署MariaDB时,应遵循最佳实践,确保系统的高可用性和性能。
- 使用StatefulSet:StatefulSet为有状态应用提供稳定的网络标识和持久化存储
- 配置持久化存储:使用PersistentVolume和PersistentVolumeClaim确保数据安全
- 使用Secret管理敏感信息:避免在配置文件中硬编码密码等敏感信息
- 配置资源限制:设置CPU和内存的请求和限制,避免资源争用
- 部署多副本:根据高可用性需求部署多个副本
- 使用健康检查:配置liveness和readiness探针,确保Pod的健康状态
- 监控系统:部署Prometheus和Grafana监控MariaDB的运行状态
- 定期备份:制定合理的备份策略,确保数据可恢复
5.2 常见问题与解决方案
- 存储问题:解决方案:使用高性能存储,配置合适的StorageClass
- 网络问题:解决方案:配置CNI网络插件,确保Pod间通信
- 资源不足:解决方案:合理配置资源请求和限制
- 高可用性问题:解决方案:部署多副本,使用主从复制或Galera Cluster
- 备份问题:解决方案:定期备份数据,使用备份工具如Mariabackup
- 监控问题:解决方案:部署Prometheus和Grafana,配置合适的告警
5.3 未来趋势
- Operator模式:使用MariaDB Operator简化部署和管理
- 云原生集成:与云服务提供商的Kubernetes服务深度集成
- 自动扩缩容:根据负载自动调整副本数
- 智能监控:使用AI技术进行异常检测和预测
- 多集群部署:跨多个Kubernetes集群部署MariaDB
- 边缘计算:在边缘Kubernetes集群部署MariaDB
# Kubernetes部署示例
— 创建StatefulSet
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: mariadb
spec:
serviceName: mariadb
replicas: 3
selector:
matchLabels:
app: mariadb
template:
metadata:
labels:
app: mariadb
spec:
containers:
– name: mariadb
image: mariadb:10.5
ports:
– containerPort: 3306
env:
– name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: mariadb-secret
key: password
volumeMounts:
– name: mariadb-data
mountPath: /var/lib/mysql
volumeClaimTemplates:
– metadata:
name: mariadb-data
spec:
storageClassName: mariadb-storage
accessModes: [“ReadWriteOnce”]
resources:
requests:
storage: 10Gi
— 创建Service
apiVersion: v1
kind: Service
metadata:
name: mariadb
spec:
selector:
app: mariadb
ports:
– port: 3306
targetPort: 3306
clusterIP: None
— 创建StatefulSet
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: mariadb
spec:
serviceName: mariadb
replicas: 3
selector:
matchLabels:
app: mariadb
template:
metadata:
labels:
app: mariadb
spec:
containers:
– name: mariadb
image: mariadb:10.5
ports:
– containerPort: 3306
env:
– name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: mariadb-secret
key: password
volumeMounts:
– name: mariadb-data
mountPath: /var/lib/mysql
volumeClaimTemplates:
– metadata:
name: mariadb-data
spec:
storageClassName: mariadb-storage
accessModes: [“ReadWriteOnce”]
resources:
requests:
storage: 10Gi
— 创建Service
apiVersion: v1
kind: Service
metadata:
name: mariadb
spec:
selector:
app: mariadb
ports:
– port: 3306
targetPort: 3306
clusterIP: None
通过本文的学习,相信读者已经掌握了MariaDB在Kubernetes上的部署方法。在实际生产环境中,应根据具体的业务需求和集群规模,选择合适的部署模式,确保系统的高可用性和性能。
Kubernetes为MariaDB的部署提供了灵活、可扩展的平台,希望读者能够将本文所学应用到实际工作中,提高数据库部署的效率和质量。
from MariaDB视频:www.itpux.com
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
