1. 为什么要在K8s上部署MySQL并使用Ceph存储?
在云原生时代,将传统数据库部署在Kubernetes集群已成为主流选择。我最近在生产环境用Ceph为MySQL提供持久化存储,实测下来这套方案比传统本地存储方案可靠得多。当你的MySQL实例需要动态扩容、跨节点迁移或多副本同步时,Ceph提供的分布式块设备(RBD)能完美解决数据一致性问题。
去年我们有个惨痛教训:某次节点宕机导致MySQL数据卷丢失,整整两天才从备份恢复。后来切换到Ceph+RBD后,即使整个K8s节点崩溃,数据也能秒级挂载到新节点。Ceph的自动修复机制还能在后台检测和恢复损坏的数据副本,这对数据库这种有状态服务简直是救命稻草。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境准备与前置条件检查
2.1 基础组件版本要求
在开始前,请确认你的环境满足以下要求(这是我踩过坑后总结的黄金组合):
- Kubernetes集群版本 ≥1.20(CSI驱动需要较新版本)
- Ceph集群版本 ≥Octopus(v15.2.0)
- Helm版本 ≥3.0(用于部署MySQL Operator)
- 所有节点已安装
rbd内核模块(执行lsmod | grep rbd验证)
重要提示:如果Ceph和K8s跨机房部署,务必检查网络延迟!我们曾因机房之间网络抖动导致MySQL性能下降80%,后来通过调整Ceph的
osd_client_message_timeout参数解决。
2.2 Ceph集群对接K8s的准备工作
-
在Ceph集群创建专供K8s使用的存储池:
bash复制
ceph osd pool create k8s_mysql 128 128 rbd pool init k8s_mysql -
创建K8s访问Ceph的认证密钥:
bash复制ceph auth get-or-create client.k8s mon 'allow r' osd 'allow rwx pool=k8s_mysql' -o /etc/ceph/ceph.client.k8s.keyring -
将密钥编码为base64后存入K8s Secret:
bash复制cat /etc/ceph/ceph.client.k8s.keyring | base64 -w0然后创建secret.yaml:
yaml复制apiVersion: v1 kind: Secret metadata: name: ceph-secret type: kubernetes.io/rbd data: key: [上一步输出的base64编码]
3. 部署MySQL的三种方案对比
3.1 方案一:使用StatefulSet直接部署
这是最基础的部署方式,适合快速验证场景。关键配置在PVC部分:
yaml复制apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mysql-pvc
spec:
accessModes:
- ReadWriteOnce
storageClassName: ceph-rbd
resources:
requests:
storage: 10Gi
需要提前创建StorageClass:
yaml复制apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: ceph-rbd
provisioner: rbd.csi.ceph.com
parameters:
clusterID: [你的ceph集群ID]
pool: k8s_mysql
imageFeatures: layering
csi.storage.k8s.io/provisioner-secret-name: ceph-secret
csi.storage.k8s.io/node-stage-secret-name: ceph-secret
3.2 方案二:使用MySQL Operator管理
对于生产环境,我强烈推荐使用Oracle官方的MySQL Operator。安装步骤:
bash复制helm repo add mysql-operator https://mysql.github.io/mysql-operator/
helm install my-mysql mysql-operator/mysql-operator
然后创建InnoDB Cluster:
yaml复制apiVersion: mysql.oracle.com/v2
kind: InnoDBCluster
metadata:
name: mysql-prod
spec:
secretName: mysql-root-password
tlsUseSelfSigned: true
instances: 3
router:
instances: 1
volumeClaimTemplate:
storageClassName: ceph-rbd
resources:
requests:
storage: 20Gi
3.3 方案三:使用Percona XtraDB Cluster
如果需要更高性能的Galera集群,可以选用Percona方案。关键配置差异在于:
yaml复制spec:
pxc:
size: 3
volumeSpec:
persistentVolumeClaim:
storageClassName: ceph-rbd
resources:
requests:
storage: 15Gi
4. 性能调优实战技巧
4.1 Ceph层优化参数
在/etc/ceph/ceph.conf添加这些参数能显著提升MySQL性能:
ini复制[client]
rbd cache = true
rbd cache size = 256MB
rbd cache max dirty = 64MB
rbd cache target dirty = 32MB
4.2 MySQL参数适配分布式存储
修改my.cnf关键参数:
ini复制[mysqld]
innodb_flush_method = O_DIRECT
innodb_io_capacity = 2000
innodb_io_capacity_max = 4000
innodb_buffer_pool_size = 4G
4.3 K8s存储类高级配置
对于生产环境,建议启用CSI卷扩展功能:
yaml复制allowVolumeExpansion: true
parameters:
imageFormat: "2"
mounter: kernel
mapOptions: "krbd:rxbounce"
5. 故障排查与日常维护
5.1 常见问题处理手册
问题一:Pod卡在ContainerCreating状态
检查命令:
bash复制kubectl describe pod mysql-0
如果看到rbd: image k8s_mysql/kubernetes-dynamic-pvc-xxx is locked by other nodes,执行:
bash复制rbd lock list k8s_mysql/kubernetes-dynamic-pvc-xxx
rbd lock remove k8s_mysql/kubernetes-dynamic-pvc-xxx [锁ID]
问题二:IOPS突然下降
检查Ceph集群状态:
bash复制ceph osd perf
ceph pg dump | grep -i slow
5.2 数据备份方案
推荐使用Velero进行定时快照备份:
bash复制velero install \
--provider aws \
--plugins velero/velero-plugin-for-aws:v1.0.0 \
--bucket mysql-backup \
--backup-location-config region=minio,s3ForcePathStyle="true",s3Url=http://minio:9000 \
--snapshot-location-config region=ceph
创建备份计划:
yaml复制apiVersion: velero.io/v1
kind: Schedule
metadata:
name: mysql-daily-backup
spec:
schedule: "0 3 * * *"
template:
includedNamespaces:
- mysql-namespace
ttl: 720h
6. 监控与告警配置
6.1 Prometheus监控指标采集
部署mysql-exporter:
yaml复制containers:
- name: mysqld-exporter
image: prom/mysqld-exporter
env:
- name: DATA_SOURCE_NAME
value: "exporter:password@(localhost:3306)/"
Ceph监控建议使用ceph-mixin:
json复制{
"groups": [{
"name": "ceph_cluster",
"rules": [{
"expr": "sum(ceph_health_status)",
"record": "cluster:ceph_health_status:sum"
}]
}]
}
6.2 关键告警规则示例
对于MySQL:
yaml复制- alert: MySQLDown
expr: mysql_up == 0
for: 1m
labels:
severity: critical
annotations:
summary: "MySQL instance {{ $labels.instance }} down"
对于Ceph:
yaml复制- alert: CephOSDDown
expr: ceph_osd_up == 0
for: 5m
labels:
severity: warning
这套方案在我们生产环境稳定运行了9个月,期间经历了3次机房迁移和无数次节点维护,MySQL服务始终零中断。最让我惊喜的是Ceph的自动再平衡功能——当新增OSD节点时,数据会自动均匀分布,完全不用手动干预。
