在云原生架构中,持久化存储是支撑有状态应用的核心支柱。当MySQL数据库需要保证交易记录不丢失,当Elasticsearch集群需要维护索引数据时,传统临时存储方案显然力不从心。Ceph RBD作为经过生产验证的分布式块存储系统,与Kubernetes的深度集成使其成为企业级持久化存储的首选方案之一。本文将带您从零开始,掌握Ceph RBD在Kubernetes环境中的全生命周期管理技巧。
在开始操作前,我们需要确保Ceph集群处于健康状态。通过SSH登录任意Ceph管理节点执行以下命令:
bash复制ceph -s # 检查集群整体状态
ceph osd tree # 查看OSD分布拓扑
rbd ls -l # 列出已有RBD镜像
典型健康输出应包含HEALTH_OK状态,且所有OSD都处于up状态。如果发现警告或错误,需要先解决基础集群问题再继续。
所有Kubernetes工作节点需要安装Ceph客户端工具并配置访问权限:
bash复制# Ubuntu/Debian
sudo apt-get install ceph-common
# CentOS/RHEL
sudo yum install ceph-common
将Ceph配置文件/etc/ceph/ceph.conf和管理员密钥环/etc/ceph/ceph.client.admin.keyring复制到所有Kubernetes节点的相同路径。验证节点访问权限:
bash复制rbd --id admin ls # 使用admin身份列出RBD镜像
为Kubernetes PV单独创建存储池是推荐做法,可以隔离I/O并方便管理:
bash复制ceph osd pool create kube_pv 128 128 # 创建名为kube_pv的存储池,PG数设为128
ceph osd pool application enable kube_pv rbd # 标记为RBD使用
使用rbd命令创建镜像时,需要特别注意Kubernetes的兼容性要求:
bash复制rbd create -p kube_pv --size 100Gi mysql-data-01 \
--image-feature layering,exclusive-lock,object-map,fast-diff,deep-flatten
关键参数说明:
--size:镜像容量,建议根据实际需求预留20%缓冲--image-feature:必须包含layering以支持快照克隆创建定义Ceph RBD的StorageClass资源:
yaml复制apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: ceph-rbd
provisioner: rbd.csi.ceph.com
parameters:
clusterID: ceph
pool: kube_pv
imageFeatures: layering,exclusive-lock,object-map,fast-diff,deep-flatten
csi.storage.k8s.io/provisioner-secret-name: csi-rbd-secret
csi.storage.k8s.io/provisioner-secret-namespace: default
csi.storage.k8s.io/node-stage-secret-name: csi-rbd-secret
csi.storage.k8s.io/node-stage-secret-namespace: default
reclaimPolicy: Retain
allowVolumeExpansion: true
为运行中的数据库Pod创建一致性快照需要特殊处理:
bash复制# 1. 查找Pod使用的PV对应的RBD镜像
kubectl describe pvc mysql-pvc | grep VolumeName
# 2. 暂停Pod写入(根据应用类型选择适当方式)
kubectl exec mysql-pod -- mysql -e "FLUSH TABLES WITH READ LOCK;"
# 3. 创建快照
rbd snap create kube_pv/mysql-data-01@snap_20230801
# 4. 恢复Pod写入
kubectl exec mysql-pod -- mysql -e "UNLOCK TABLES;"
快照必须处于保护状态才能用于克隆:
bash复制rbd snap protect kube_pv/mysql-data-01@snap_20230801
rbd clone kube_pv/mysql-data-01@snap_20230801 kube_pv/mysql-test-clone
克隆操作实际上采用了COW(Copy-On-Write)技术,初始时几乎不占用额外空间,只有发生写入时才分配新空间。
将克隆的镜像映射为Kubernetes PV:
yaml复制apiVersion: v1
kind: PersistentVolume
metadata:
name: mysql-test-pv
spec:
capacity:
storage: 100Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
storageClassName: ""
volumeMode: Block
rbd:
monitors:
- 10.0.0.1:6789
- 10.0.0.2:6789
- 10.0.0.3:6789
pool: kube_pv
image: mysql-test-clone
user: admin
secretRef:
name: ceph-secret
fsType: ext4
当PV空间不足时,可以动态扩展RBD镜像:
bash复制rbd resize -p kube_pv --size 200Gi mysql-data-01
然后在Kubernetes中扩展PVC:
bash复制kubectl patch pvc mysql-pvc -p '{"spec":{"resources":{"requests":{"storage":"200Gi"}}}}'
当PV出现问题时,可以直接在宿主机挂载诊断:
bash复制# 查找PV对应的设备
rbd device list
# 如果未映射,先执行映射
rbd map kube_pv/mysql-data-01 --id admin
# 挂载到临时目录
mkdir /mnt/rbd_inspect
mount /dev/rbd0 /mnt/rbd_inspect
# 检查文件系统
fsck.ext4 -f /dev/rbd0
# 操作完成后卸载
umount /mnt/rbd_inspect
rbd unmap /dev/rbd0
使用Ceph内置工具监控RBD性能:
bash复制rbd perf image iotop -p kube_pv/mysql-data-01
rbd perf image iostat -p kube_pv
常见优化参数:
| 参数 | 推荐值 | 说明 |
|---|---|---|
| osd_client_message_size_cap | 1073741824 | 提高大IO吞吐量 |
| osd_recovery_max_active | 3 | 控制恢复带宽 |
| rbd_cache_size | 33554432 | RBD客户端缓存大小 |
确保数据安全的关键配置:
bash复制ceph osd pool set kube_pv size 3 # 设置3副本
ceph osd pool set kube_pv crush_rule replicated_rack # 使用跨机架规则
建议通过CronJob实现自动化快照:
yaml复制apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: rbd-snapshot
spec:
schedule: "0 2 * * *"
jobTemplate:
spec:
template:
spec:
containers:
- name: snapshotter
image: ceph/ceph:v15
command:
- /bin/sh
- -c
- |
rbd snap create kube_pv/mysql-data-01@snap_$(date +%Y%m%d)
rbd snap protect kube_pv/mysql-data-01@snap_$(date +%Y%m%d)
restartPolicy: OnFailure
Prometheus监控示例配置:
yaml复制- job_name: 'ceph'
static_configs:
- targets: ['ceph-mgr:9283']
metrics_path: /metrics
关键监控指标告警规则:
yaml复制groups:
- name: ceph-alerts
rules:
- alert: CephClusterHealth
expr: ceph_health_status != 0
for: 5m
labels:
severity: critical
annotations:
summary: "Ceph cluster is unhealthy ({{ $value }})"