在云原生时代,有状态应用(数据库、中间件、AI 推理缓存等) 对持久化存储提出了更高要求:高可用、可扩展、可快照、可克隆、可扩容。
Ceph CSI(Container Storage Interface) 是当前 Kubernetes 官方推荐的 Ceph 集成方案,它全面取代了旧版 rbd / cephfs in-tree 插件,并支持:
✅ 动态卷供应(Dynamic Provisioning)
✅ 在线扩容(Expansion)
✅ 快照 / 克隆(Snapshot / Clone)
✅ RBD(块存储) / CephFS(共享文件)
✅ 企业级高可用架构
本文将带你完成一套生产可落地级别的 Kubernetes + Ceph CSI 集成方案,涵盖从部署到企业级架构的完整实战。
一、为什么选择 Ceph CSI?
在规划生产环境存储方案时,选型至关重要。下面我们来对比一下新旧方案的核心差异:
| 对比维度 |
旧版 rbd/cephfs 插件 |
Ceph CSI |
| 架构标准 |
In-tree(已废弃) |
✅ CSI 标准 |
| 动态供应 |
有限支持 |
✅ 完整支持 |
| 快照 |
❌ 不友好 |
✅ 原生支持 |
| 扩容 |
复杂 |
✅ 在线扩容 |
| 兼容性 |
逐步淘汰 |
✅ 官方长期支持 |
结论很明确:对于新建的 Kubernetes 集群,必须使用 CSI 方案。
二、准备工作(生产必做)
在动手部署之前,请务必完成以下环境检查,这是稳定运行的基石。
1. 检查集群版本
- Kubernetes ≥ v1.17
- Ceph ≥ Octopus / Pacific
2. Node 安装 ceph-common
所有 Kubernetes 工作节点都需要安装:
apt install ceph-common -y
# 或
yum install ceph-common -y
原因:CSI NodePlugin 依赖 rbd 命令来映射块设备。
3. Ceph 集群健康检查
执行命令检查 Ceph 集群状态:
ceph -s
确保输出状态为:
HEALTH_OK
警告:如果状态是 HEALTH_WARN 或 ERR,不建议直接接入生产环境,请先排查解决集群问题。
三、准备 Ceph 集群信息
与 Ceph 集群安全、正确地建立连接是第一步。
1. 创建最小权限用户(安全最佳实践)
永远不要使用 admin 密钥。为 Kubernetes 创建一个专属的、权限最小的用户:
ceph auth get-or-create client.k8s-rbd \
mon ‘profile rbd’ \
osd ‘profile rbd pool=kubernetes’ \
mgr ‘profile rbd pool=kubernetes’
命令会输出类似下面的密钥信息,请记录下来:
[client.k8s-rbd]
key = AQBh1TNmFYERJhAAf5yqP4Wnrb/u4yNGsBKZHA==
2. 获取 fsid 与 monitors
获取 Ceph 集群的唯一标识和监控节点地址:
ceph mon dump
示例输出:
fsid 6d5c12c9-6dfb-445a-940f-301aa7de0f29
0: [v2:10.0.0.136:3300/0,v1:10.0.0.136:6789/0]
请记录:
- clusterID → 即
fsid (6d5c12c9-6dfb-445a-940f-301aa7de0f29)
- monitors → 使用
v1 协议的地址 (10.0.0.136:6789)
四、Kubernetes 部署 Ceph CSI
现在,我们开始在 Kubernetes 侧进行部署。
1. 创建专用 Namespace(生产推荐)
为 CSI 组件创建独立的命名空间,实现资源与权限隔离。
kubectl create namespace ceph-csi
2. 创建 ConfigMap
这个 ConfigMap 用于向 CSI 驱动传递 Ceph 集群的连接信息。
apiVersion: v1
kind: ConfigMap
metadata:
name: ceph-csi-config
namespace: ceph-csi
data:
config.json: |-
[
{
"clusterID": "6d5c12c9-6dfb-445a-940f-301aa7de0f29",
"monitors": [
"10.0.0.136:6789"
]
}
]
---
apiVersion: v1
kind: ConfigMap
metadata:
name: ceph-csi-encryption-kms-config
namespace: ceph-csi
data:
config.json: |-
{}
重要:JSON 内容内禁止任何注释,否则会导致 CSI 驱动解析失败。
3. 创建 Secret
存储之前创建的 Ceph 用户密钥,供 CSI 驱动认证使用。
apiVersion: v1
kind: Secret
metadata:
name: csi-rbd-secret
namespace: ceph-csi
stringData:
userID: k8s-rbd
userKey: AQBh1TNmFYERJhAAf5yqP4Wnrb/u4yNGsBKZHA==
4. 部署 CSI 插件
从 Ceph CSI 官方 GitHub 仓库获取对应的 RBAC 和部署 YAML 文件进行部署。
kubectl apply -f csi-provisioner-rbac.yaml
kubectl apply -f csi-nodeplugin-rbac.yaml
kubectl apply -f csi-rbdplugin-provisioner.yaml
kubectl apply -f csi-rbdplugin.yaml
生产环境必须修改镜像版本:在部署 YAML 中,务必指定一个稳定的版本标签,而不是 :canary 或 :latest。
image: quay.io/cephcsi/cephcsi:v3.10.0
五、创建 StorageClass(核心)
StorageClass 是动态存储供应的蓝图,定义了如何创建 PV(持久卷)。
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: csi-rbd-sc
provisioner: rbd.csi.ceph.com
parameters:
clusterID: 6d5c12c9-6dfb-445a-940f-301aa7de0f29
pool: kubernetes
imageFormat: “2”
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: ceph-csi
csi.storage.k8s.io/node-stage-secret-name: csi-rbd-secret
csi.storage.k8s.io/node-stage-secret-namespace: ceph-csi
csi.storage.k8s.io/controller-expand-secret-name: csi-rbd-secret
csi.storage.k8s.io/controller-expand-secret-namespace: ceph-csi
reclaimPolicy: Retain
allowVolumeExpansion: true
volumeBindingMode: WaitForFirstConsumer
mountOptions:
- discard
关键参数解析
| 参数 |
作用 |
imageFeatures |
启用 RBD 镜像的高级功能,为快照、克隆和性能优化提供支持。 |
Retain |
删除 PVC 后保留底层 RBD 镜像,防止生产数据被误删。 |
allowVolumeExpansion |
允许后续在线扩容 PVC。 |
WaitForFirstConsumer |
延迟 PV 绑定,直到使用它的 Pod 被调度,避免存储与计算节点的拓扑不匹配问题。 |
六、申请 PVC
有了 StorageClass,就可以按需创建持久卷声明(PVC)了。
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: rbd-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
storageClassName: csi-rbd-sc
七、Pod 挂载验证
创建一个 Pod 挂载上一步创建的 PVC,验证整个链路是否通畅。
apiVersion: v1
kind: Pod
metadata:
name: rbd-demo-pod
spec:
containers:
- name: nginx
image: nginx
volumeMounts:
- name: data
mountPath: /usr/share/nginx/html
volumes:
- name: data
persistentVolumeClaim:
claimName: rbd-pvc
部署后,使用以下命令验证状态:
kubectl get pvc
kubectl describe pod rbd-demo-pod
观察 PVC 是否进入 Bound 状态,Pod 是否正常启动且 Volume 被成功挂载。
八、启用快照能力(生产强烈推荐)
快照是数据保护的核心手段,Ceph CSI 原生支持。
1. VolumeSnapshotClass
定义如何创建快照。
apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshotClass
metadata:
name: csi-rbd-snapclass
driver: rbd.csi.ceph.com
deletionPolicy: Delete
parameters:
clusterID: 6d5c12c9-6dfb-445a-940f-301aa7de0f29
csi.storage.k8s.io/snapshotter-secret-name: csi-rbd-secret
csi.storage.k8s.io/snapshotter-secret-namespace: ceph-csi
2. 创建快照
为之前创建的 PVC 打一个快照。
apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshot
metadata:
name: rbd-snapshot
spec:
volumeSnapshotClassName: csi-rbd-snapclass
source:
persistentVolumeClaimName: rbd-pvc
典型应用场景:
- 数据库备份:在重大变更前创建快照。
- 故障回滚:当数据损坏时,从快照恢复。
- 克隆测试环境:基于快克隆一个完全相同的卷用于测试。
九、在线扩容(真实生产操作)
当应用数据增长时,无需迁移即可扩容存储空间。
-
编辑已有的 PVC,修改存储容量大小:
kubectl edit pvc rbd-pvc
-
找到 spec.resources.requests.storage 字段,将其从 1Gi 修改为更大的值,例如 5Gi,保存退出。
-
稍等片刻,扩容操作完成后,进入 Pod 内验证磁盘容量:
kubectl exec -it rbd-demo-pod -- df -h
十、常见故障排查
部署和使用过程中可能会遇到一些问题,以下是快速排查指南。
PVC 状态始终为 Pending
- 检查:
kubectl get po -n ceph-csi
- 可能原因:CSI 插件的 Pod 没有全部正常运行。检查日志定位具体错误。
错误信息:failed to fetch monitor list
- 可能原因:
ConfigMap 中的 config.json 格式错误(例如包含了注释)或 monitors 地址不正确。
CSI Pod 出现 ImagePullBackOff
- 可能原因:镜像仓库
quay.io 网络不通。
- 解决:尝试替换为
docker.io/cephcsi/cephcsi:v3.10.0,或先将镜像拉取到本地仓库。
扩容失败
- 检查点:
StorageClass 是否设置了 allowVolumeExpansion: true。
- 底层 Ceph RBD 池是否支持
resize 操作。
十一、企业级架构建议
将 Ceph CSI 用于生产,不能止步于基本功能,还需考虑架构优化。
1. 多 StorageClass 分层
根据应用性能需求,创建不同性能层次的存储类,例如 SSD 池和 HDD 池。
| 存储类型 |
pool |
| SSD (高性能) |
kubernetes-ssd |
| HDD (大容量) |
kubernetes-hdd |
2. 数据保护策略
- 保留策略:
reclaimPolicy: Retain 是防止误删的最后防线。
- 定期快照:制定自动化快照策略,保留多个时间点的数据。
- 副本数量:确保 Ceph 存储池的
size 至少为 3,保证数据冗余。
3. 监控体系
建议将存储层监控集成到你的运维平台中,例如 Prometheus 和 Grafana。关键监控指标包括:
ceph_cluster_health_status (集群健康状态)
ceph_pool_usage (存储池使用量)
ceph_osd_up/down (OSD 状态)
4. 灾备设计
对于核心业务数据,需规划灾备方案:
- 快照备份到异地:定期将快照导出到另一个集群或对象存储。
- RBD Mirroring:启用 RBD 镜像功能,实现跨集群的实时数据同步。
- Stretch Cluster:构建延展集群,实现跨机房的容灾。
总结:生产级 Ceph CSI 的核心价值
通过系统性地部署和配置 Ceph CSI,你的 Kubernetes 存储体系将真正具备企业级能力:
✅ 动态供应:按需自动创建存储,提升资源利用率。
✅ 在线扩容:业务无感知地扩展存储空间。
✅ 快照 / 克隆:高效的数据保护与敏捷开发支持。
✅ 高可用:依托 Ceph 分布式架构,保障数据持久性。
✅ 安全隔离:最小权限原则和网络隔离,提升安全性。
一句话评价:
Ceph CSI = 云原生时代最强开源分布式存储解决方案之一
这套方案不仅能满足 数据库、中间件等有状态应用的需求,其标准化、可扩展的特性也为未来的存储演进打下了坚实基础。希望这篇实战指南能帮助你在生产环境中稳健地落地 Kubernetes 持久化存储。如果在实践中遇到更多深入问题,欢迎在技术社区如 云栈社区 进行交流探讨。