k8s中部署ceph外部存储与简单使用
在 Kubernetes (k8s) 中部署 Ceph 作为外部存储,可以提供高可用、可扩展和持久化的存储解决方案。本指南将详细讲解如何在 k8s 集群中集成 Ceph,并使用 Ceph RBD (块存储) 和 CephFS (文件存储)。
1. Ceph 介绍
Ceph 提供三种主要的存储模式:
- RBD (RADOS Block Device):块存储,适用于数据库、持久化应用,如 MySQL、PostgreSQL。
- CephFS (Ceph File System):分布式文件系统,适用于共享存储,如 Web 应用、日志存储。
- Object Storage (S3 兼容):适用于大规模对象存储,如图片、备份。
Kubernetes 可以通过 Ceph CSI (Container Storage Interface) 实现动态存储管理。
2. 部署 Ceph 存储集群
2.1 环境要求
- Kubernetes 集群 (v1.20+ 推荐) 确保你的 K8s 集群已经搭建好,并且每个存储节点(OSD 节点)上有未格式化的本地磁盘可用。
- 3+ 台服务器(建议至少 3 个节点)
- 安装
qemu-nbd
是用于将磁盘映像文件映射到块设备的工具:yum install qemu-img。 否则在osd的job初始化时会报错 - 所有部署yaml来源官方github仓库,地址:GitHub - rook/rook: Storage Orchestration for Kubernetes 文件路径:deploy/examples
- Ceph 需要的基本组件
mon
(监视器):存储集群的元数据mgr
(管理器):集群管理osd
(存储守护进程):数据存储mds
(元数据服务器,仅 CephFS 需要)radosgw
(对象存储网关,仅 S3 兼容对象存储需要)
- 部署过程中出现错误删除所有资源重新部署时还需要清理osd相关本地目录
rm -rf /var/lib/ceph/osd/*
rm -rf /var/lib/rook
rm -rf /var/lib/kubelet/plugins/ceph*
rm -rf /etc/ceph
rm -rf /dev/ceph-*
rm -rf /dev/nbd*
2.2 部署 Ceph 集群
使用 Rook-Ceph 在 Kubernetes 中部署 Ceph。
准备镜像,由于国内网络原因,最好先准备好需要的镜像,一下镜像来源operator.yaml,cluster.yaml以及部署过程需要拉取的:
docker.io/rook/ceph:master
quay.io/ceph/ceph:v19.2.1
registry.k8s.io/sig-storage/csi-node-driver-registrar:v2.13.0
registry.k8s.io/sig-storage/csi-attacher:v4.8.0
registry.k8s.io/sig-storage/csi-snapshotter:v8.2.0
registry.k8s.io/sig-storage/csi-provisioner:v5.1.0
quay.io/cephcsi/cephcsi:v3.13.1
registry.k8s.io/sig-storage/csi-resizer:v1.13.1
docker.io/library/busybox
Step 1: 安装 Rook Operator
先下载文件,在执行
curl -LO https://raw.githubusercontent.com/rook/rook/master/deploy/examples/common.yaml
curl -LO https://raw.githubusercontent.com/rook/rook/master/deploy/examples/operator.yamlkubectl create -f common.yaml
kubectl create -f operator.yaml
Step 2: 部署 Ceph 集群
注意,在部署集群之前先创建crds资源
curl -LO https://raw.githubusercontent.com/rook/rook/master/deploy/examples/crds.yaml
kubectl create -f crds.yamlcurl -LO https://raw.githubusercontent.com/rook/rook/master/deploy/examples/cluster.yaml
# 修改dashboard 的ssl为false,没有证书否则无法正常访问dashboard,dashboard默认开启
# dashboard:
# enabled: true
# ssl: false # http默认端口7000,https为8443
kubectl create -f cluster.yaml
执行后,Rook 将自动创建:
- Ceph OSD (Object Storage Daemon)
- Ceph Monitor (MON)
- Ceph Manager (MGR)
检查 Ceph 集群状态
kubectl -n rook-ceph get pod
确保 rook-ceph-mon
、rook-ceph-osd
、rook-ceph-mgr
等 Pod 正常运行。
如需dashboard对外访问需要提供ingress,此时可以在dashboard创建存储池,提供给StorageClass使用
vim ceph-dashboard-ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: rook-ceph-dashboardnamespace: rook-cephannotations:nginx.ingress.kubernetes.io/rewrite-target: /
spec:ingressClassName: nginxrules:- host: ceph-dashboard.localhttp:paths:- path: /pathType: Prefixbackend:service:name: rook-ceph-mgr-dashboardport:number: 7000
获取dashboard的登录密码
kubectl -n rook-ceph get secret rook-ceph-dashboard-password -o jsonpath="{.data.password}" | base64 --decode && echo
在 Rook-Ceph 部署完成后,可以安装 rook-ceph-tools 这个工具 Pod,用来管理和调试 Ceph 集群。以下是安装步骤:
1. 安装 rook-ceph-tools
官方 Rook 提供了一个工具 Pod,包含 ceph
命令行工具。你可以使用以下命令部署它:
curl -LO https://raw.githubusercontent.com/rook/rook/master/deploy/examples/toolbox.yaml
kubectl apply -f toolbox.yaml
如果你使用的是 离线环境,你可能需要手动下载 toolbox.yaml
文件并修改镜像地址。
2. 确保 rook-ceph-tools
正常运行
kubectl get pods -n rook-ceph
你应该看到类似的输出:
NAME READY STATUS RESTARTS AGE
rook-ceph-tools-6b8d89f67d-abcde 1/1 Running 0 30s
如果 rook-ceph-tools
处于 CrashLoopBackOff,可能是 Ceph 集群未完全启动,可以先检查:
kubectl get cephcluster -n rook-ceph
如果状态是 HEALTH_WARN
或 HEALTH_ERR
,需要先修复集群。
3. 进入 rook-ceph-tools
Pod
kubectl exec -it -n rook-ceph deploy/rook-ceph-tools -- bash
进入后,你可以运行 ceph
相关命令,比如:
ceph status
ceph osd tree
ceph mon stat
ceph health detail
4. (可选) 删除 rook-ceph-tools
如果不再需要,可以删除:
kubectl delete -f toolbox.yaml
3. Kubernetes 使用 Ceph 存储
在创建StorageClass前需要创建存储池 pool
3.1 Ceph RBD (块存储)
Step 1: 创建 StorageClass
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:name: ceph-rbd
provisioner: rook-ceph.rbd.csi.ceph.com
parameters:clusterID: rook-cephpool: replicapoolimageFormat: "2"imageFeatures: "layering"csi.storage.k8s.io/provisioner-secret-name: rook-csi-rbd-provisionercsi.storage.k8s.io/provisioner-secret-namespace: rook-cephcsi.storage.k8s.io/node-stage-secret-name: rook-csi-rbd-nodecsi.storage.k8s.io/node-stage-secret-namespace: rook-ceph
reclaimPolicy: Retain
解释:
provisioner: rook-ceph.rbd.csi.ceph.com
表示 Ceph CSI 驱动。pool: replicapool
是 Ceph RBD 存储池。reclaimPolicy: Retain
表示 PVC 删除后 PV 不会自动删除数据。
Step 2: 创建 PVC
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: ceph-rbd-pvc
spec:accessModes:- ReadWriteOnceresources:requests:storage: 10GistorageClassName: ceph-rbd
Step 3: 创建使用 Ceph RBD 的 Pod
apiVersion: v1
kind: Pod
metadata:name: ceph-rbd-pod
spec:containers:- name: appimage: busyboxcommand: [ "sleep", "3600" ]volumeMounts:- mountPath: "/mnt/data"name: ceph-storagevolumes:- name: ceph-storagepersistentVolumeClaim:claimName: ceph-rbd-pvc
测试 Ceph RBD 存储
kubectl exec -it ceph-rbd-pod -- df -h /mnt/data
3.2 CephFS (文件存储)
适用于多个 Pod 共享访问的场景。
Step 1: 创建 CephFS StorageClass
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:name: cephfs
provisioner: rook-ceph.cephfs.csi.ceph.com
parameters:clusterID: rook-cephfsName: myfspool: myfs-data0csi.storage.k8s.io/provisioner-secret-name: rook-csi-cephfs-provisionercsi.storage.k8s.io/provisioner-secret-namespace: rook-cephcsi.storage.k8s.io/node-stage-secret-name: rook-csi-cephfs-nodecsi.storage.k8s.io/node-stage-secret-namespace: rook-ceph
reclaimPolicy: Retain
Step 2: 创建 PVC
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: cephfs-pvc
spec:accessModes:- ReadWriteManyresources:requests:storage: 10GistorageClassName: cephfs
Step 3: 创建使用 CephFS 的 Pod
apiVersion: v1
kind: Pod
metadata:name: cephfs-test-pod
spec:containers:- name: appimage: busyboxcommand: [ "sleep", "3600" ]volumeMounts:- mountPath: "/mnt/shared"name: cephfs-volumevolumes:- name: cephfs-volumepersistentVolumeClaim:claimName: cephfs-pvc
验证 CephFS 共享存储
kubectl exec -it cephfs-test-pod -- df -h /mnt/shared
4. 验证 Ceph 存储
4.1 检查 Ceph 运行状态
kubectl -n rook-ceph get pod
4.2 查看存储池
kubectl -n rook-ceph get cephblockpools
4.3 进入 Ceph 工具 Pod
kubectl -n rook-ceph exec -it deploy/rook-ceph-tools -- bash
在 Ceph Pod 内运行:
ceph status
ceph osd status
rbd list -p replicapool
5.ceph的简单使用
I.查看pool
在 Ceph 中查看存储池(Pool)的方法如下:
. 使用 ceph osd pool ls
列出所有存储池
ceph osd pool ls
输出示例:
mypool
rbd
cephfs_data
cephfs_metadata
如果你想查看更详细的信息,可以使用:
ceph osd pool ls detail
输出示例:
pool 1 'mypool' replicated size 3 min_size 2 crush_rule 0 object_hash rjenkins pg_num 128 pgp_num 128 ...
2. 查看指定存储池的详细信息
ceph osd pool get <pool-name> all
例如:
ceph osd pool get mypool all
输出示例:
size: 3
min_size: 2
pg_num: 128
pgp_num: 128
crush_rule: 0
3. 查看存储池的使用情况
ceph df
示例输出:
POOLS:NAME ID USED %USED MAX AVAIL OBJECTSmypool 1 10 GiB 5% 200 GiB 10240rbd 2 20 GiB 10% 180 GiB 20480
这显示了每个池的已使用空间、最大可用空间和对象数量。
4. 查看 Pool 中的对象
rados -p mypool ls
示例输出:
obj1
obj2
obj3
如果要统计对象总数:
rados df
或者:
ceph osd pool stats mypool
5. 查看 PG 状态
ceph pg dump pgs
或者查看特定 Pool 的 PG:
ceph pg ls-by-pool mypool
6. 在 rook-ceph-tools
里执行
如果你在 Kubernetes 中使用 rook-ceph
,先进入工具箱:
kubectl exec -it -n rook-ceph deploy/rook-ceph-tools -- bash
然后执行上面的 Ceph 命令。
II.在 Ceph 中删除存储池(Pool)
删除 Ceph 存储池需要小心操作,因为删除后数据无法恢复。确保你已经备份或确认不再需要该存储池。
1. 启用 Pool 删除功能
默认情况下,Ceph 不允许 直接删除 Pool,需要先启用删除功能:
ceph config set mon mon_allow_pool_delete true
然后检查是否启用:
ceph config get mon mon_allow_pool_delete
如果返回 true
,说明已开启。
2. 删除 Pool
2.1 列出所有存储池
ceph osd pool ls
示例输出:
mypool
rbd
cephfs_data
cephfs_metadata
假设要删除 mypool
。
2.2 删除指定 Pool
ceph osd pool delete mypool mypool --yes-i-really-really-mean-it
⚠️ 注意:
- mypool(第一个参数):要删除的存储池名称。
- mypool(第二个参数):确认删除的存储池名称,必须和第一个参数一致。
- --yes-i-really-really-mean-it:强制删除,绕过确认。
3. 确认 Pool 已删除
ceph osd pool ls
如果 mypool
不在列表中,说明删除成功。
4. 关闭 Pool 删除功能(可选)
如果不想误删其他池,可以关闭删除功能:
ceph config set mon mon_allow_pool_delete false
在 Rook-Ceph(Kubernetes)环境中删除 Pool
如果你在 Rook-Ceph(Kubernetes 内部部署):
-
先进入
rook-ceph-tools
容器:
kubectl exec -it -n rook-ceph deploy/rook-ceph-tools -- bash
-
按照上面的步骤删除 Pool。
III.pool type 有哪几类
Ceph 存储池(Pool)的类型主要分为以下几类:
1. Replicated Pool(复制池)
特点:
- 通过 多副本 机制保障数据可靠性。
- 数据会被复制到多个 OSD(通常是 3 个,默认
size=3
)。 - 适用于高可靠性场景,如 Kubernetes RBD 存储、CephFS 元数据等。
创建示例:
sh复制编辑ceph osd pool create my-replicated-pool 128
ceph osd pool set my-replicated-pool size 3
size=3
表示 3 副本,每个对象存 3 份。
2. Erasure Coded Pool(纠删码池)
特点:
- 通过 纠删码(Erasure Coding, EC) 进行数据分片,提高存储效率。
- 适用于大容量存储需求,减少存储开销(比 3 副本方案节省 30-50% 存储空间)。
- 读取性能比 Replicated Pool 差一些,因为需要计算和重构数据。
创建示例(EC 4+2 模式)
sh复制编辑ceph osd erasure-code-profile set my-ec-profile k=4 m=2
ceph osd pool create my-ec-pool 128 erasure my-ec-profile
k=4, m=2
表示:数据分成 4 份,额外存 2 份校验数据。
⚠️ 需要注意:
- EC Pool 不能直接用作 RBD 或 CephFS,因为它不支持 omap 数据(RADOS 对象索引)。
- 适用于 RGW(Ceph Object Gateway,S3 兼容存储) 或 大对象存储。
3. Cache Tier Pool(缓存层池,已废弃)
特点:
- 早期 Ceph 设计的一种 热数据缓存 方案,冷热数据分层存储。
- 由于性能和复杂性问题,Ceph 从 Luminous 版本开始废弃了 Cache Tiering。
- 现在推荐使用 SSD+HDD 设备分组 来替代。
示例(已不推荐)
ceph osd tier add-cache my-hot-pool my-cold-pool
4. Metadata Pool(元数据池,CephFS 专用)
特点:
- CephFS(Ceph 文件系统) 需要专门的 元数据池 存储目录结构、文件信息等。
- 该 Pool 由 CephFS 自动管理,不需要手动创建。
查看 CephFS 的元数据池:
ceph fs ls
示例输出:
name: cephfs, metadata pool: cephfs_metadata, data pools: [cephfs_data]
5. Special Purpose Pool(特殊用途池)
一些特殊用途的 Pool,例如:
- RBD Pool(块存储):用于存放 Ceph RBD(块设备)数据。
- RGW Pool(对象存储):用于 Ceph Object Gateway(S3 API 兼容)。
- Custom Pools(自定义池):可以根据应用需求创建。
示例:
ceph osd pool create rbd-pool 128
rbd pool init rbd-pool
rbd pool init
让 Pool 适配 RBD 存储。
总结
Pool 类型 | 适用场景 | 主要特点 |
---|---|---|
Replicated | 高可靠存储,CephFS 元数据,RBD | 3 副本,高可靠性,存储占用大 |
Erasure Coded | 对象存储(RGW)、大文件存储 | 纠删码存储,节省空间,读取时需计算恢复 |
Cache Tier(废弃) | 旧版冷热数据缓存方案 | Ceph 已不推荐使用 |
Metadata | CephFS 专用 | 用于存储 CephFS 的目录结构和索引 |
Special Purpose | RBD、RGW、Custom Pool | 适用于块存储、对象存储等特定需求 |
IV.Ceph Pool 的作用
在 Ceph 中,Pool(存储池) 是用于组织和管理存储数据的逻辑分区,主要作用如下:
1. 数据分组管理
- Pool 提供了一种逻辑隔离的方式,把不同用途的数据分开存储。
- 例如:
rbd
池 存储块设备(Ceph RBD)。cephfs_data
池 存储 Ceph 文件系统数据。cephfs_metadata
池 存储 CephFS 的元数据。rgw.buckets.data
池 存储对象存储(S3 兼容的 RGW)。
2. 控制数据存储策略
-
每个 Pool 可以有
不同的存储策略
,如:
- 副本数(size):
ceph osd pool set mypool size 3
(存 3 份数据)。 - PG 数量(pg_num):影响数据分布和性能。
- Erasure Coding 纠删码:节省存储空间。
- 存储级别(CRUSH 规则):存储在哪些 OSD 或磁盘类型(SSD/HDD)。
- 副本数(size):
3. 资源隔离
- 通过不同的 Pool,可以为不同用户或应用提供存储隔离,避免互相影响。
- 例如:
pool-A
供数据库使用(高 IOPS)。pool-B
供日志存储(高吞吐量)。pool-C
供备份数据(低成本 HDD)。
4. 适用于不同存储类型
Ceph Pool 适用于不同存储模式:
- 块存储(RBD):使用
rbd
池存放虚拟机磁盘。 - 文件存储(CephFS):使用
cephfs_data
存文件,cephfs_metadata
存目录结构。 - 对象存储(RGW):使用
rgw.buckets.data
存对象数据。
5. 负载均衡 & 性能优化
-
通过调整 Pool 的
PG 数量
,可以优化 OSD 负载均衡,提高存储性能:
ceph osd pool set mypool pg_num 128
-
还可以使用 不同 CRUSH 规则,让 Pool 存在特定类型的 OSD(例如 SSD 或 HDD)。
总结
作用 | 说明 |
---|---|
数据分类存储 | 让不同用途的数据存储在不同的 Pool 里。 |
存储策略管理 | 控制副本数、纠删码、PG 数量等策略。 |
资源隔离 | 为不同应用/用户提供独立存储空间。 |
适配存储类型 | 支持块存储、文件存储、对象存储。 |
优化性能 | 通过 CRUSH 规则和 PG 负载均衡提高性能。 |
V.如何查看存储在ceph中的数据
在 Ceph 中查看存储数据的方法取决于你使用的存储类型(块存储 RBD、文件存储 CephFS、对象存储 RGW)。以下是几种常见方式:
1. 查看存储池中的对象(适用于所有 Pool)
1.1 列出 Pool 中的所有对象*
rados -p <pool-name> ls
示例:
rados -p mypool ls
输出示例:
obj1
obj2
obj3
这个命令适用于 所有 Ceph Pool,可以直接列出存储在池中的 RADOS 对象。
1.2 查看 Pool 的存储占用
ceph osd pool stats <pool-name>
示例:
ceph osd pool stats mypool
输出示例:
mypool:objects: 10240bytes_used: 10GiBmax_avail: 200GiB
显示当前存储池的对象数量、已用空间和可用空间。
2. RBD(块存储)中的数据
如果你在 Ceph RBD(块存储)中存储数据,你可以使用以下命令查看 RBD 镜像。
2.1 列出所有 RBD 镜像
rbd ls -p <pool-name>
示例:
rbd ls -p rbd
输出示例:
vm-disk-1
vm-disk-2
这表示
rbd
存储池中存储了两个 RBD 磁盘。
2.2 查看 RBD 镜像的详细信息
rbd info -p <pool-name> <image-name>
示例:
rbd info -p rbd vm-disk-1
输出示例:
rbd image 'vm-disk-1':size 50GiB in 1280 objectsorder 22 (4MiB objects)block_name_prefix: rbd_data.abc123format: 2features: layering, exclusive-lock, object-map
这里显示了 RBD 磁盘的大小、存储格式等信息。
2.3 挂载 RBD 设备并读取数据
rbd map -p rbd vm-disk-1
mount /dev/rbd0 /mnt
ls /mnt
适用于直接读取块存储的数据。
3. CephFS(文件存储)中的数据
如果你使用 CephFS 作为文件存储,你可以直接查看挂载点的数据。
3.1 列出 CephFS 里的文件
进入 rook-ceph-tools
容器:
kubectl exec -it -n rook-ceph deploy/rook-ceph-tools -- bash
然后执行:
ceph fs ls
示例输出:
name: cephfs, metadata pool: cephfs_metadata, data pools: [cephfs_data]
如果 CephFS 已经挂载到本地:
ls /mnt/cephfs
查看 CephFS 存储的文件。
4. RGW(对象存储,S3 兼容)中的数据
如果你在 Ceph RGW(对象存储) 里存放 S3 兼容的对象,可以使用以下命令查看。
4.1 列出对象存储的桶
radosgw-admin bucket list
输出示例:
["my-bucket1", "my-bucket2"]
这表示
my-bucket1
和my-bucket2
是 Ceph RGW 里存储的对象桶。
4.2 列出桶中的对象
radosgw-admin bucket stats --bucket=my-bucket1
输出示例:
{"bucket": "my-bucket1","num_objects": 1500,"size_kb": 1048576,"size_kb_actual": 1050000
}
这表示
my-bucket1
里存储了 1500 个对象,总大小 1GB。
4.3 使用 S3 命令列出对象
如果使用 s3cmd
连接 Ceph RGW:
s3cmd ls s3://my-bucket1
或者使用 aws s3
命令:
aws --endpoint-url=http://ceph-rgw.example.com s3 ls s3://my-bucket1
总结
存储类型 | 查看方式 | 命令示例 |
---|---|---|
所有 Ceph Pool | 列出存储对象 | rados -p mypool ls |
块存储(RBD) | 查看 RBD 镜像 | rbd ls -p rbd |
文件存储(CephFS) | 直接访问文件 | ls /mnt/cephfs |
对象存储(RGW) | 列出桶和对象 | radosgw-admin bucket list |
如果你使用的是 Kubernetes + Rook-Ceph,建议你先进入 rook-ceph-tools
容器再执行这些命令:
kubectl exec -it -n rook-ceph deploy/rook-ceph-tools -- bash
VI.导出数据
Ceph 数据导出的方法取决于存储类型(RADOS 对象、RBD 块设备、CephFS 文件系统、RGW 对象存储)。以下是不同场景下的数据导出方法:
1. 导出 RADOS 对象(适用于所有 Ceph Pool)
如果你想导出特定 Pool 里的对象,可以使用 rados get
命令。
1.1 导出单个对象
rados -p <pool-name> get <object-name> <output-file>
示例:
rados -p mypool get obj1 obj1-backup.data
这会把
mypool
里的obj1
导出为obj1-backup.data
。
1.2 导出整个 Pool
如果你想导出整个 Pool,可以遍历导出所有对象:
for obj in $(rados -p mypool ls); dorados -p mypool get $obj $obj.backup
done
这个脚本会把
mypool
里的所有对象导出到当前目录。
2. 导出 RBD 镜像(块存储)
如果你在 Ceph RBD(块存储) 里存有数据,可以用 rbd export
导出整个 RBD 镜像。
2.1 导出 RBD 镜像到文件
rbd export -p <pool-name> <rbd-image> <output-file>
示例:
rbd export -p rbd vm-disk-1 vm-disk-1.img
这会把
rbd
池中的vm-disk-1
镜像导出为vm-disk-1.img
,可用于备份或迁移。
2.2 直接挂载 RBD 设备并拷贝数据
如果你想直接访问 RBD 里的数据:
rbd map -p rbd vm-disk-1
mount /dev/rbd0 /mnt
cp -r /mnt /backup
这会把 RBD 设备挂载到
/mnt
,然后拷贝数据到/backup
。
3. 导出 CephFS(文件存储)
CephFS 作为一个 POSIX 兼容的文件系统,可以直接使用 rsync
或 tar
导出数据。
3.1 挂载 CephFS 并导出
如果你的 CephFS 已经挂载:
rsync -av /mnt/cephfs /backup/
或者:
tar -czf cephfs-backup.tar.gz -C /mnt/cephfs .
这个方法适用于 CephFS 里存储的所有文件。
3.2 直接从 CephFS Pool 导出数据
如果你不能挂载 CephFS,可以从 cephfs_data
和 cephfs_metadata
Pool 里导出数据:
rados -p cephfs_data ls | while read obj; dorados -p cephfs_data get $obj $obj.backup
done
这个方法适用于恢复文件系统级别的元数据。
4. 导出 RGW(对象存储,S3 兼容)
如果你使用 Ceph RGW(对象存储,S3 兼容),可以使用 radosgw-admin
或 s3cmd
/aws s3
导出数据。
4.1 使用 radosgw-admin
导出
radosgw-admin bucket list
radosgw-admin bucket stats --bucket=my-bucket
然后遍历导出:
radosgw-admin object list --bucket=my-bucket | jq -r '.[].name' | while read obj; doradosgw-admin object get --bucket=my-bucket --object "$obj" --outfile "$obj"
done
4.2 使用 s3cmd
或 aws s3
如果 Ceph RGW 配置了 S3 API:
s3cmd sync s3://my-bucket /backup/
或者:
aws --endpoint-url=http://ceph-rgw.example.com s3 sync s3://my-bucket /backup/
这个方法适用于大规模对象存储备份。
总结
存储类型 | 导出方式 | 命令示例 |
---|---|---|
RADOS 对象 | 导出单个对象 | rados -p mypool get obj1 obj1-backup.data |
RADOS 对象 | 导出整个 Pool | for obj in $(rados -p mypool ls); do rados -p mypool get $obj $obj.backup; done |
RBD(块存储) | 导出 RBD 镜像 | rbd export -p rbd vm-disk-1 vm-disk-1.img |
RBD(块存储) | 挂载后拷贝数据 | rbd map -p rbd vm-disk-1 && mount /dev/rbd0 /mnt && cp -r /mnt /backup |
CephFS(文件存储) | 直接拷贝数据 | rsync -av /mnt/cephfs /backup/ |
CephFS(文件存储) | 导出 Pool 数据 | `rados -p cephfs_data ls |
RGW(对象存储) | radosgw-admin 导出 |
radosgw-admin object get --bucket=my-bucket --object "obj1" --outfile "obj1" |
RGW(对象存储) | s3cmd 导出 |
s3cmd sync s3://my-bucket /backup/ |
VII.删除ceph中的数据
在 Ceph 中删除数据的方法取决于存储类型(RADOS 对象、RBD 块存储、CephFS 文件系统、RGW 对象存储)。请注意,删除数据是不可逆的,请谨慎操作! 🔥
1. 删除 RADOS 对象(适用于所有 Ceph Pool)
1.1 删除单个对象
rados -p <pool-name> rm <object-name>
示例:
rados -p mypool rm obj1
这个命令会从
mypool
里删除obj1
。
1.2 删除整个 Pool 里的所有对象
rados -p <pool-name> ls | while read obj; dorados -p <pool-name> rm $obj
done
这个方法适用于清空整个 Pool。
2. 删除 RBD(块存储)
2.1 列出所有 RBD 镜像
rbd ls -p <pool-name>
示例:
rbd ls -p rbd
你会看到该 Pool 里的所有 RBD 磁盘。
2.2 删除 RBD 镜像
如果确认不需要某个 RBD 镜像,可以删除:
rbd rm -p <pool-name> <image-name>
示例:
rbd rm -p rbd my-vm-disk
这个命令会彻底删除
rbd
池中的my-vm-disk
磁盘。
2.3 删除 PVC 绑定的 RBD
如果 RBD 由 Kubernetes 通过 PVC 创建,先删除 PVC:
kubectl delete pvc <pvc-name>
如果 StorageClass
的 RECLAIMPOLICY=Delete
,Ceph 会自动删除 RBD 卷。如果是 Retain
,你需要手动删除 RBD 镜像。
3. 删除 CephFS(文件存储)
3.1 删除 CephFS 里的文件
如果 CephFS 已经挂载到本地:
rm -rf /mnt/cephfs/*
这个命令会删除 CephFS 里的所有文件,但不会删除整个文件系统。
3.2 直接从 CephFS 数据池删除数据
rados -p cephfs_data ls | while read obj; dorados -p cephfs_data rm $obj
done
这个方法适用于从
cephfs_data
池直接删除存储对象。
4. 删除 RGW(对象存储,S3 兼容)
4.1 删除 S3 Bucket
如果你使用了 S3 兼容的 RGW 存储,可以使用 s3cmd
:
s3cmd rb --recursive s3://my-bucket
或者:
aws --endpoint-url=http://ceph-rgw.example.com s3 rb s3://my-bucket --force
4.2 直接删除 Bucket
radosgw-admin bucket delete --bucket=my-bucket
4.3 删除 RGW 对象
radosgw-admin object rm --bucket=my-bucket --object=obj1
5. 删除 Ceph Pool
如果你想删除整个 Pool(⚠ 危险操作!会删除所有数据!):
-
确保 Pool 允许删除
ceph osd pool set <pool-name> allow_delete true
-
删除 Pool
ceph osd pool delete <pool-name> <pool-name> --yes-i-really-really-mean-it
示例:
ceph osd pool delete mypool mypool --yes-i-really-really-mean-it
⚠ 重要提示: 这个命令会彻底删除
mypool
,且数据无法恢复!
总结
存储类型 | 删除方法 | 命令示例 |
---|---|---|
RADOS 对象 | 删除单个对象 | rados -p mypool rm obj1 |
RADOS 对象 | 清空 Pool | `rados -p mypool ls |
RBD(块存储) | 删除 RBD 镜像 | rbd rm -p rbd my-vm-disk |
RBD(块存储) | 删除 PVC 绑定的 RBD | kubectl delete pvc my-pvc |
CephFS(文件存储) | 删除文件 | rm -rf /mnt/cephfs/* |
CephFS(文件存储) | 删除 Pool 数据 | `rados -p cephfs_data ls |
RGW(对象存储) | 删除 Bucket | radosgw-admin bucket delete --bucket=my-bucket |
RGW(对象存储) | 删除对象 | radosgw-admin object rm --bucket=my-bucket --object=obj1 |
删除整个 Pool | 彻底删除 Pool | ceph osd pool delete mypool mypool --yes-i-really-really-mean-it |
6. 总结
存储类型 | 适用场景 |
---|---|
Ceph RBD (块存储) | 适用于数据库、单 Pod 访问 |
CephFS (文件存储) | 适用于多个 Pod 共享存储 |
S3 兼容对象存储 | 适用于日志、备份、大规模数据 |
推荐:
- 数据库:使用 Ceph RBD。
- 共享文件存储:使用 CephFS。
- 大规模对象存储:使用 S3 兼容对象存储。