找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

1804

积分

0

好友

233

主题
发表于 12 小时前 | 查看: 5| 回复: 0

在云原生时代,有状态应用(数据库、中间件、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_WARNERR,不建议直接接入生产环境,请先排查解决集群问题。

三、准备 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

典型应用场景

  • 数据库备份:在重大变更前创建快照。
  • 故障回滚:当数据损坏时,从快照恢复。
  • 克隆测试环境:基于快克隆一个完全相同的卷用于测试。

九、在线扩容(真实生产操作)

当应用数据增长时,无需迁移即可扩容存储空间。

  1. 编辑已有的 PVC,修改存储容量大小:

    kubectl edit pvc rbd-pvc
  2. 找到 spec.resources.requests.storage 字段,将其从 1Gi 修改为更大的值,例如 5Gi,保存退出。

  3. 稍等片刻,扩容操作完成后,进入 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,或先将镜像拉取到本地仓库。

扩容失败

  • 检查点
    1. StorageClass 是否设置了 allowVolumeExpansion: true
    2. 底层 Ceph RBD 池是否支持 resize 操作。

十一、企业级架构建议

将 Ceph CSI 用于生产,不能止步于基本功能,还需考虑架构优化。

1. 多 StorageClass 分层

根据应用性能需求,创建不同性能层次的存储类,例如 SSD 池和 HDD 池。

存储类型 pool
SSD (高性能) kubernetes-ssd
HDD (大容量) kubernetes-hdd

2. 数据保护策略

  • 保留策略reclaimPolicy: Retain 是防止误删的最后防线。
  • 定期快照:制定自动化快照策略,保留多个时间点的数据。
  • 副本数量:确保 Ceph 存储池的 size 至少为 3,保证数据冗余。

3. 监控体系

建议将存储层监控集成到你的运维平台中,例如 PrometheusGrafana。关键监控指标包括:

  • 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 持久化存储。如果在实践中遇到更多深入问题,欢迎在技术社区如 云栈社区 进行交流探讨。




上一篇:OpenClaw自动发布网站SEO升级?我的Agent失控亲历记
下一篇:网站SEO外链监控的几种免费方案与实操指南
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2026-2-26 17:33 , Processed in 0.466464 second(s), 40 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2026 云栈社区.

快速回复 返回顶部 返回列表