Kubernetes集群部署Rook Ceph部署Ceph集群

1. Rook Ceph介绍

Rook Ceph是Rook项目中的一个存储方案,专门针对Ceph存储系统进行了优化和封装。Ceph是一个高度可扩展的分布式存储系统,提供了对象存储、块存储和文件系统的功能,广泛应用于提供大规模存储解决方案。将Ceph与Rook结合,目的是利用Rook的云原生存储编排能力来简化Ceph在Kubernetes环境中的部署和管理。
Rook Ceph官网
Rook Ceph项目代码仓库

Rook Ceph的主要特点包括:

  1. 云原生集成:Rook Ceph紧密整合了Kubernetes的特性,使Ceph存储系统能够以Kubernetes原生的方式进行部署和管理。这包括使用Kubernetes自定义资源定义(CRDs)来管理Ceph集群的配置和状态。

  2. 自动化管理:Rook自动化了Ceph的部署、配置、扩展、升级和故障处理。这意味着Rook会帮助自动管理Ceph集群的复杂性,用户可以更专注于使用存储而不是管理存储。

  3. 灵活的存储选项:通过Rook Ceph,用户可以在Kubernetes上部署和使用Ceph的对象存储、块存储和文件系统,满足不同类型的存储需求。

  4. 扩展性和高可用性:Ceph本身就是为了提供高度的扩展性和可靠性设计的。结合Rook,它可以在Kubernetes环境中自动扩展和恢复,提供持续可用的存储服务。

  5. 简化操作:Rook Ceph提供了简化的安装过程,通过几个简单的命令就可以在Kubernetes集群上部署一个完整的Ceph存储系统。

  6. 社区支持:Rook是一个活跃的开源项目,拥有广泛的社区支持,Rook Ceph作为其中的一部分,也继承了这种活跃和开放的社区特性。

使用Rook Ceph,用户可以更容易地在Kubernetes上部署和管理Ceph集群,享受到Ceph强大的存储功能,同时又不需要深入了解和管理其复杂的配置和维护任务。这使得Rook Ceph成为希望在Kubernetes环境中使用高可靠、可扩展存储解决方案的用户的一个理想选择。

2. 对比一下几种主流的Ceph安装方式

Rook Ceph, ceph-deploy, ceph-ansible, 和 cephadm 是部署和管理Ceph集群的不同工具和方法,每种方式都有其特点和适用场景。

2.1 Rook Ceph

特点:

  • 云原生集成:特别为Kubernetes环境设计,利用Rook自动化管理Ceph集群。
  • 操作简便:通过Kubernetes CRDs进行集群管理,用户无需直接与Ceph集群交互。
  • 自动化管理:自动处理部署、扩展、升级和故障恢复等。
  • 官方支持:虽然不是Ceph官方直接支持的工具,但作为CNCF项目,在云原生生态中得到广泛认可。

适用场景:

  • Kubernetes环境下,希望通过声明式API管理Ceph存储。
  • 寻求简化Ceph集群管理和自动化操作的环境。
2.2 ceph-deploy

特点:

  • 简单直接:命令行工具,适合快速部署小规模Ceph集群。
  • 易于上手:对于新手友好,不需要复杂的配置。
  • 官方支持:Ceph早期版本中推荐的部署工具和集群管理工具。它能够简化部署过程,自动配置和安装Ceph节点,并提供一些管理操作的便捷功能。当前ceph-deploy已经不再被维护,而且它还没有在比Ceph 14 (Nautilus)更新的Ceph 版本上进行测试,不支持 RHEL8、CentOS 8或更新版本的操作系统。

适用场景:

  • 小型或测试环境,快速部署Ceph集群。
  • 不需要复杂或高度自定义的部署。
2.3 ceph-ansible

特点:

  • 灵活性高:使用Ansible Playbooks,提供了更丰富的配置选项和自定义能力。
  • 大规模部署:适合大规模和生产环境的Ceph部署。
  • 社区支持:Ansible社区提供丰富的模块和角色支持。

适用场景:

  • 需要定制化配置和管理较大规模Ceph集群的环境。
  • 已经使用Ansible作为自动化工具的团队。
2.4 cephadm

特点:

  • 官方工具:Ceph官方推荐的部署工具,从Ceph 15 Octopus版本开始引入。
  • 容器化部署:使用容器化方式部署Ceph服务。
  • 简化操作:提供了简化的命令行接口,易于维护和升级。

适用场景:

  • 寻求官方支持和维护的部署方法。
  • 希望通过容器化技术部署和管理Ceph集群。
  • 需要易于升级和维护的环境。

3. 基本要求介绍

本文档使用的Rook是v1.13.1,Ceph(Reef) 18.2.1。(最新版本,暂时不推荐生产环境使用)

当前Rook支持Kubernetes v1.22或更高版本。

Rook发布包支持的架构包括amd64/x86_64和arm64。

在部署Rook之前,要检查Kubernetes集群是否准备好使用Rook,请查看以下先决条件:

要配置Ceph存储集群,至少需要以下其中一种本地存储:

  • 原始设备(Raw devices)(无分区或格式化文件系统)
  • 原始分区(Raw partitions)(无格式化文件系统)
  • LVM逻辑卷(无格式化文件系统)
  • 以块模式(block mode)在存储类(storage class)中提供的持久卷

Kubernetes集群信息:

机器名k8s版本系统版本系统内核cpu架构
yiqi-rancher-master1v1.26.8CentOS Linux release 7.95.4.242-1.el7x86_64
yiqi-rancher-master2v1.26.8CentOS Linux release 7.95.4.242-1.el7x86_64
yiqi-rancher-master3v1.26.8CentOS Linux release 7.95.4.242-1.el7x86_64
yiqi-rancher-worker1v1.26.8CentOS Linux release 7.95.4.242-1.el7x86_64
yiqi-rancher-worker2v1.26.8CentOS Linux release 7.95.4.242-1.el7x86_64
yiqi-rancher-worker3v1.26.8CentOS Linux release 7.95.4.242-1.el7x86_64
yiqi-rancher-worker4v1.26.8CentOS Linux release 7.95.4.242-1.el7x86_64
yiqi-rancher-worker5v1.26.8CentOS Linux release 7.95.4.242-1.el7x86_64

每个Work节点都有vdb,vdc,vdd三个原始设备(Raw devices):

lsblk -fNAMEFSTYPELABEL UUID MOUNTPOINTvddvdbvdcvda├─vda2LVM2_member rgicKt-MO6U-rHDf-W7YC-VbCS-Rcl8-XU1vQE │ ├─centos-swap swap3f2904bc-792e-4606-b0af-51bcaee5779c │ └─centos-root xfs 0dabeafe-43fe-4f98-9846-eeb2b66dadaa /└─vda1xfs fecac8e2-cde0-4e2a-86ac-5135aaba25b3 /boot

安装git:

yum install git -y

下载rook ceph Git项目仓库(用于安装):

git clone https://github.com/rook/rook.git

切换标签带V1.13.1版本:

git checkout v1.13.1

4. 安装Operator

安装Operator基本不需要过多定制化修改,以下的安装方式可以直接用于生产环境。

cd rook/deploy/examples/kubectl create -f crds.yaml -f common.yaml -f operator.yaml

完成后检查Pod的运行状态

kubectl -n rook-ceph get podNAMEREADY STATUSRESTARTS AGErook-ceph-operator-7c9659dcab-fh3ui 1/1 Running 042s

5. 创建ceph集群

kubectl create -f cluster.yaml# cluster.yaml文件中有很多定制化的参数,上述部署方式使用的是默认配置。# 比如可以用于设置mon,mgr节点的数量# 可以用于是否安装图形化界面,设置监控组件,设置污点和容忍等

检查Pod运行状态,osd pod的数量取决于集群中的节点数量和配置的设备数量。对于上述默认的cluster.yaml,将为每个节点上找到的每个可用设备创建一个OSD。

kubectl get po -n rook-ceph -o wideNAMEREADY STATUSRESTARTSAGE IPNODE NOMINATED NODE READINESS GATEScsi-cephfsplugin-bf5vp2/2 Running 1 (4m ago)4m34s 9.30.247.102yiqi-rancher-worker5 <none> <none>csi-cephfsplugin-j9k5q2/2 Running 1 (4m ago)4m34s 9.30.211.215yiqi-rancher-worker1 <none> <none>csi-cephfsplugin-k6c752/2 Running 1 (4m ago)4m34s 9.30.161.76 yiqi-rancher-worker3 <none> <none>csi-cephfsplugin-nxmdh2/2 Running 0 4m34s 9.30.246.169yiqi-rancher-worker4 <none> <none>csi-cephfsplugin-provisioner-56956bc974-8vvfk 5/5 Running 0 4m34s 10.42.53.134yiqi-rancher-worker4 <none> <none>csi-cephfsplugin-provisioner-56956bc974-l8f5p 5/5 Running 1 (3m59s ago) 4m34s 10.42.240.6 yiqi-rancher-worker5 <none> <none>csi-cephfsplugin-tv5kw2/2 Running 1 (4m ago)4m34s 9.30.160.224yiqi-rancher-worker2 <none> <none>csi-rbdplugin-fnqst 2/2 Running 1 (4m ago)4m34s 9.30.160.224yiqi-rancher-worker2 <none> <none>csi-rbdplugin-mvvrf 2/2 Running 0 4m34s 9.30.246.169yiqi-rancher-worker4 <none> <none>csi-rbdplugin-pjltf 2/2 Running 1 (4m ago)4m34s 9.30.247.102yiqi-rancher-worker5 <none> <none>csi-rbdplugin-provisioner-cc97cf4b9-k5frj 5/5 Running 1 (4m ago)4m34s 10.42.65.6yiqi-rancher-worker3 <none> <none>csi-rbdplugin-provisioner-cc97cf4b9-zq2r4 5/5 Running 2 (3m56s ago) 4m34s 10.42.208.133 yiqi-rancher-worker1 <none> <none>csi-rbdplugin-qf4ll 2/2 Running 1 (4m ago)4m34s 9.30.211.215yiqi-rancher-worker1 <none> <none>csi-rbdplugin-xr82v 2/2 Running 1 (4m ago)4m34s 9.30.161.76 yiqi-rancher-worker3 <none> <none>rook-ceph-crashcollector-yiqi-rancher-worker1.fyre.ibm.comwsxkm 1/1 Running 0 3m4s10.42.208.138 yiqi-rancher-worker1 <none> <none>rook-ceph-crashcollector-yiqi-rancher-worker2.fyre.ibm.comwvzxh 1/1 Running 0 3m25s 10.42.128.21yiqi-rancher-worker2 <none> <none>rook-ceph-crashcollector-yiqi-rancher-worker3.fyre.ibm.comc5cdq 1/1 Running 0 3m50s 10.42.65.8yiqi-rancher-worker3 <none> <none>rook-ceph-crashcollector-yiqi-rancher-worker4.fyre.ibm.comjrv75 1/1 Running 0 3m21s 10.42.53.139yiqi-rancher-worker4 <none> <none>rook-ceph-crashcollector-yiqi-rancher-worker5.fyre.ibm.comqbf4n 1/1 Running 0 3m22s 10.42.240.13yiqi-rancher-worker5 <none> <none>rook-ceph-exporter-yiqi-rancher-worker1.fyre.ibm.com-54bddqm5mb 1/1 Running 0 3m4s10.42.208.136 yiqi-rancher-worker1 <none> <none>rook-ceph-exporter-yiqi-rancher-worker2.fyre.ibm.com-767bc8lkfq 1/1 Running 0 3m21s 10.42.128.22yiqi-rancher-worker2 <none> <none>rook-ceph-exporter-yiqi-rancher-worker3.fyre.ibm.com-6fdfdkwlth 1/1 Running 0 3m50s 10.42.65.9yiqi-rancher-worker3 <none> <none>rook-ceph-exporter-yiqi-rancher-worker4.fyre.ibm.com-5ddb5zk9xg 1/1 Running 0 3m21s 10.42.53.140yiqi-rancher-worker4 <none> <none>rook-ceph-exporter-yiqi-rancher-worker5.fyre.ibm.com-5d4b7gn2ch 1/1 Running 0 3m18s 10.42.240.15yiqi-rancher-worker5 <none> <none>rook-ceph-mgr-a-85945fd8d4-m2sbg3/3 Running 0 4m6s10.42.128.14yiqi-rancher-worker2 <none> <none>rook-ceph-mgr-b-7f95644479-6xqhr3/3 Running 0 4m6s10.42.240.7 yiqi-rancher-worker5 <none> <none>rook-ceph-mon-a-596c6cbfc5-8nxdj2/2 Running 0 4m57s 10.42.240.5 yiqi-rancher-worker5 <none> <none>rook-ceph-mon-b-6f9c6f46c9-g69w82/2 Running 0 4m33s 10.42.128.13yiqi-rancher-worker2 <none> <none>rook-ceph-mon-c-5c889df47f-488cm2/2 Running 0 4m20s 10.42.65.7yiqi-rancher-worker3 <none> <none>rook-ceph-operator-6c9669dcbd-k5qmz 1/1 Running 0 25m 10.42.65.4yiqi-rancher-worker3 <none> <none>rook-ceph-osd-0-6846c64444-jv7k42/2 Running 0 3m25s 10.42.128.18yiqi-rancher-worker2 <none> <none>rook-ceph-osd-1-7dbcd4bdc-w42tw 2/2 Running 0 3m24s 10.42.65.11 yiqi-rancher-worker3 <none> <none>rook-ceph-osd-10-69cd6c5b7-l7s7b2/2 Running 0 3m22s 10.42.240.14yiqi-rancher-worker5 <none> <none>rook-ceph-osd-11-646d597b-m6ptn 2/2 Running 0 3m21s 10.42.53.138yiqi-rancher-worker4 <none> <none>rook-ceph-osd-12-7f4458595b-cdpsr 2/2 Running 0 3m4s10.42.208.139 yiqi-rancher-worker1 <none> <none>rook-ceph-osd-13-88b4c74f7-xl6nj2/2 Running 0 3m4s10.42.208.135 yiqi-rancher-worker1 <none> <none>rook-ceph-osd-14-89c7fddd-cgdvw 2/2 Running 0 3m4s10.42.208.137 yiqi-rancher-worker1 <none> <none>rook-ceph-osd-2-659fbf966f-2m8zc2/2 Running 0 3m22s 10.42.240.11yiqi-rancher-worker5 <none> <none>rook-ceph-osd-3-5d5cbcd9f5-w8qv92/2 Running 0 3m22s 10.42.53.137yiqi-rancher-worker4 <none> <none>rook-ceph-osd-4-9f5cb68fb-pp2g6 2/2 Running 0 3m25s 10.42.128.19yiqi-rancher-worker2 <none> <none>rook-ceph-osd-5-59d79d7679-j2h9r2/2 Running 0 3m24s 10.42.65.13 yiqi-rancher-worker3 <none> <none>rook-ceph-osd-6-5799c4b877-gzgdn2/2 Running 0 3m22s 10.42.240.12yiqi-rancher-worker5 <none> <none>rook-ceph-osd-7-6897c7445c-kctmf2/2 Running 0 3m22s 10.42.53.136yiqi-rancher-worker4 <none> <none>rook-ceph-osd-8-796c48c59f-2j5fl2/2 Running 0 3m25s 10.42.128.20yiqi-rancher-worker2 <none> <none>rook-ceph-osd-9-fff5df8c7-sf7j7 2/2 Running 0 3m24s 10.42.65.12 yiqi-rancher-worker3 <none> <none>rook-ceph-osd-prepare-22ca3ed4ba60ff130925b1da1d599303-ndtrc0/1 Completed 0 2m30s 10.42.65.14 yiqi-rancher-worker3 <none> <none>rook-ceph-osd-prepare-49eb3309ba3821b41e4320db43c5f1f1-ktxh70/1 Completed 0 2m37s 10.42.208.140 yiqi-rancher-worker1 <none> <none>rook-ceph-osd-prepare-4d2d5eab315cc094c1f72a4485297888-xg24j0/1 Completed 0 2m27s 10.42.53.141yiqi-rancher-worker4 <none> <none>rook-ceph-osd-prepare-8545b28a9ad22acf59fd2168d50c1a9c-mlj2l0/1 Completed 0 2m24s 10.42.240.16yiqi-rancher-worker5 <none> <none>rook-ceph-osd-prepare-b4a0cdf88b658e7c811ab8a320cbd626-f59kr0/1 Completed 0 2m33s 10.42.128.24yiqi-rancher-worker2 <none> <none>

创建过程如果遇到问题可以查看rook-ceph-operator的Pod的日志。

6. 验证ceph集群

为了验证集群处于健康状态, 需要使用Rook工具箱

kubectl create -f toolbox.yaml检查Pod状态kubectl -n rook-ceph rollout status deploy/rook-ceph-tools通过命令行进入Podkubectl -n rook-ceph exec -it deploy/rook-ceph-tools -- bash#可以通过如下ceph命令查看集群的状态,例如ceph statusceph osd statusceph dfrados df# ceph status显示的当前集群状态bash-4.4$ ceph statuscluster:id: b6c450b1-4406-44f9-8ebd-e0277c8d8f7ehealth: HEALTH_WARN1 daemons have recently crashed services:mon: 3 daemons, quorum a,b,c (age 20m)mgr: a(active, since 18m), standbys: bosd: 15 osds: 15 up (since 18m), 15 in (since 19m) data:pools: 1 pools, 1 pgsobjects: 2 objects, 449 KiBusage: 399 MiB used, 2.9 TiB / 2.9 TiB availpgs: 1 active+clean

7. 使用存储

Ceph提供三种类型的存储接口: 块存储(Block)、共享文件系统(Shared Filesystem)、对象存储(Object)。

下面演示对于使用Rook部署和管理的Ceph集群,如何使用这三种存储。

通过Rook使用Ceph提供的三种存储类型以及它们的用途如下:

  • 块存储(Block)适用于为单个 Pod 提供读写一致性(RWO)的存储
  • CephFS 共享文件系统(Shared Filesystem)适用于多个Pod之间共享读写(RWX)的存储
  • 对象存储(Object)提供了一个可通过内部或外部的Kubernetes集群的S3端点访问的存储
7.1 使用块存储(Block)

块存储允许单个Pod挂载存储。本指南介绍了如何使用Rook启用的持久卷,在Kubernetes上创建一个简单的多层Web应用程序。

1.创建Storage Class
在Rook可以提供存储之前,需要创建StorageClass和CephBlockPool CR。这将使Kubernetes在提供持久卷时与Rook进行交互操作。

这个示例需要每个节点至少有1个 OSD,并且每个 OSD 需要位于3个不同的节点上。每个OSD必须位于不同的节点上,因为 failureDomain 被设置为 host,并且 replicated.size 被设置为 3。这里多说一句,本次案例中使用的Ceph数据高可用方式为多副本。Ceph中还有一种方式是纠错编码Erasure Coding。可以使用“deploy/examples/csi/rbd/storageclass-ec.yaml”这个文件进行部署。

# 在当前路径 /root/rook/deploy/exampleskubectl apply -f ./csi/rbd/storageclass.yaml cephblockpool.ceph.rook.io/replicapool createdstorageclass.storage.k8s.io/rook-ceph-block created

这个storageclass.yaml文件中包含了StorageClass rook-ceph-block和CephBlockPool replicapool的定义。

如果你在一个名为”rook-ceph”以外的命名空间中部署了Rook Operator,请将该文件中的provisioner中的前缀更改为与你使用的命名空间匹配。例如,如果Rook Operator在命名空间”my-namespace”中运行,则provisioner的值应为my-namespace.rbd.csi.ceph.com。

根据Kubernetes的规定,在使用”Retain”回收策略时,任何由PersistentVolume支持的Ceph RBD 镜像将在PersistentVolume被删除后继续存在。这些Ceph RBD镜像需要使用rbd rm命令手动清理。

上面在创建名称为replicapool的CephBlockPool资源时,会自动在Ceph集群中创建名称为replicapool的存储池。这个操作是由Ceph Operator完成的,如果查看发现没有创建这个存储池,可以通过查看Ceph Operator的日志进行问题定位。

以下命令在ToolBox容器中运行的输出说明已经创建了存储池replicapool。

bash-4.4$ ceph osd lspools1 .mgr2 replicapool

通过以下命令可以检查Storage Class的状态(nfs-client是我这个集群之前安装的):

kubectl get scNAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGEnfs-client (default) cluster.local/nfs-subdir-external-provisioner DeleteImmediate true 6d23hrook-ceph-blockrook-ceph.rbd.csi.ceph.comDeleteImmediate true 7m20s

我们创建了一个示例应用程序,使用经由Rook提供的块存储,其中包括经由Rook提供的的WordPress和MySQL应用程序。这些应用程序都将使用Rook提供的块存储卷(block volumes)。

# 在当前路径 /root/rook/deploy/exampleskubectl create -f mysql.yamlkubectl create -f wordpress.yaml

查看PVC

kubectl get pvcNAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASSAGEmysql-pv-claim Boundpvc-3db54f6f-b4b2-4c72-8134-81841ce99178 20Gi RWOrook-ceph-block 3m20swp-pv-claimBoundpvc-5134d1a7-23c5-4bfe-be02-6d204121a127 20Gi RWOrook-ceph-block 3m19skubectl get pvNAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIMSTORAGECLASSREASON AGEpvc-3db54f6f-b4b2-4c72-8134-81841ce99178 20Gi RWODelete Bounddefault/mysql-pv-claim rook-ceph-block3m19spvc-5134d1a7-23c5-4bfe-be02-6d204121a127 20Gi RWODelete Bounddefault/wp-pv-claimrook-ceph-block3m19s

回到ToolBox容器中检查rbd储存池使用状态

bash-4.4$ rbd ls -p replicapoolcsi-vol-ac06bcbf-5c33-42ea-b41f-e46a4a4d9c77csi-vol-be9cd19a-4fff-42b3-85f3-9ea021110da0
7.2 使用文件存储(CephFS)

CephFS文件系统存储(也称为共享文件系统)可以从多个Pod中以读/写权限挂载。这对于可以使用共享文件系统进行集群化的应用程序可能非常有用。

CephFS CSI驱动程序使用配额来强制执行所请求的PVC大小。只有较新的Linux内核支持CephFS配额,至少是4.17版本的内核。

Ceph从自Pacific版本(Ceph 16)开始,支持多个文件系统。

1.创建CephFilesystem
通过在CephFilesystem CRD中指定元数据池(metadata pool)、数据池(data pools)和元数据服务(metadata server)的所需设置来创建文件系统。在这里,我们创建的是3个副本的元数据池和3个副本的单个数据池。有关更多选项,请参阅创建共享文件系统的文档

# 在当前路径 /root/rook/deploy/exampleskubectl create -f filesystem.yaml

查看Pod状态

kubectl -n rook-ceph get pod -l app=rook-ceph-mdsNAMEREADY STATUSRESTARTS AGErook-ceph-mds-myfs-a-795d4c688f-nj92g 2/2 Running 0104srook-ceph-mds-myfs-b-558bb747c7-kpwqd 2/2 Running 0103s

要查看文件系统的详细状态,进入Rook toolbox中,使用ceph status查看, 确认输出中包含MDS服务的状态。在这个示例中,有一个处于活动状态的MDS实例,并且还有一个处于备用MDS实例,以防发生故障切换。

bash-4.4$ ceph -scluster:id: b6c450b1-4406-44f9-8ebd-e0277c8d8f7ehealth: HEALTH_WARN1 daemons have recently crashed services:mon: 3 daemons, quorum a,b,c (age 86m)mgr: a(active, since 84m), standbys: bmds: 1/1 daemons up, 1 hot standby#可以看到相比之前的状态mds服务已经运行起来了osd: 15 osds: 15 up (since 84m), 15 in (since 85m) data:volumes: 1/1 healthypools: 4 pools, 81 pgsobjects: 29 objects, 466 KiBusage: 886 MiB used, 2.9 TiB / 2.9 TiB availpgs: 81 active+clean io:client: 853 B/s rd, 1 op/s rd, 0 op/s wr # 使用ceph osd lspools查看,确认创建了myfs-metadata和myfs-replicated的存储池。 bash-4.4$ ceph osd lspools1 .mgr2 replicapool3 myfs-metadata 4 myfs-replicated #

2.创建StorageClass

# 在当前路径 /root/rook/deploy/exampleskubectl create -f ./csi/cephfs/storageclass.yaml#检查StorageClass的状态,可以看到rook-cephfs已经建立起来了。kubectl get scNAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGEnfs-client (default) cluster.local/nfs-subdir-external-provisioner DeleteImmediate true 7drook-ceph-blockrook-ceph.rbd.csi.ceph.comDeleteImmediate true 48mrook-cephfsrook-ceph.cephfs.csi.ceph.com DeleteImmediate true 19s

创建一个测试用的Deployment和PVC挂载

vi testcephps.yamlapiVersion: v1kind: PersistentVolumeClaimmetadata:name: busybox-data-pvcspec:accessModes:- ReadWriteManyresources:requests:storage: 2GistorageClassName: rook-cephfs---apiVersion: apps/v1kind: Deploymentmetadata:name: busyboxspec:replicas: 2selector:matchLabels:app: busyboxtemplate:metadata:labels:app: busyboxspec:containers:- name: busybox-containerimage: busybox:stable-glibccommand: ["sleep", "3600"]volumeMounts:- name: data-volumemountPath: /datavolumes:- name: data-volumepersistentVolumeClaim:claimName: busybox-data-pvc#创建相关的资源kubectl apply -f testcephfs.yaml#检查资源的创建情况kubectl get pvcNAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGEbusybox-data-pvc Boundpvc-647ecb9f-1a18-484a-9536-ac26cb0a8a03 2GiRWXrook-cephfs9skubectl get poNAME READY STATUSRESTARTS AGEbusybox-86c4ffc4b6-q6lzn 1/1 Running 041sbusybox-86c4ffc4b6-ttxgz 1/1 Running 041s
7.3 使用对象存储(Object)

对象存储为应用程序提供了一个使用S3 API存储和获取数据的接口。

1.配置一个Object Store
Rook具有在Kubernetes中部署对象存储或连接到外部RGW服务的能力。通常情况下,对象存储将由Rook在本地进行配置。或者,如果你有一个现有的带有Rados Gateways的Ceph集群,请参阅external section文档以从Rook中使用它。

以下示例将创建一个CephObjectStore,该对象存储在集群中启动RGW服务,并提供S3 API。

注意: 这个示例至少需要3个bluestore OSD,每个OSD位于不同的节点上。OSDs必须位于不同的节点上,因为failureDomain设置为host,并且erasureCoded块设置要求至少有3个不同的OSD(2个dataChunks + 1个codingChunks)。

# 在当前路径 /root/rook/deploy/exampleskubectl apply -f object.yamlcephobjectstore.ceph.rook.io/my-store created

创建CephObjectStore后,Rook Ceph Operator将创建所有必要的池和其他资源以启动服务。这可能需要几分钟来完成。

要确认对象存储已配置完成,请等待RGW pod启动:

kubectl -n rook-ceph get pod -l app=rook-ceph-rgwNAMEREADY STATUSRESTARTS AGErook-ceph-rgw-my-store-a-5c9fcc5674-j85lv 2/2 Running 0109s

通过Toolbox程序检查Ceph集群的状态:

bash-4.4$ ceph osd lspools1 .mgr2 replicapool3 myfs-metadata4 myfs-replicated5 my-store.rgw.buckets.non-ec6 my-store.rgw.buckets.index7 my-store.rgw.log8 my-store.rgw.control9 my-store.rgw.otp10 .rgw.root11 my-store.rgw.meta12 my-store.rgw.buckets.data

Rook Ceph Operator会在Ceph集群中创建名称为my-store.rgw.*的多个存储池。

再查看一下ceph集群的状态:

bash-4.4$ ceph -scluster:id: b6c450b1-4406-44f9-8ebd-e0277c8d8f7ehealth: HEALTH_WARN1 daemons have recently crashed services:mon: 3 daemons, quorum a,b,c (age 5h)mgr: a(active, since 5h), standbys: bmds: 1/1 daemons up, 1 hot standbyosd: 15 osds: 15 up (since 5h), 15 in (since 5h)rgw: 1 daemon active (1 hosts, 1 zones) data:volumes: 1/1 healthypools: 12 pools, 169 pgsobjects: 245 objects, 753 KiBusage: 1.2 GiB used, 2.9 TiB / 2.9 TiB availpgs: 169 active+clean io:client: 1.3 KiB/s rd, 170 B/s wr, 2 op/s rd, 0 op/s wr

2.创建StorageClass

# 在当前路径 /root/rook/deploy/exampleskubectl create -f storageclass-bucket-delete.yamlstorageclass.storage.k8s.io/rook-ceph-delete-bucket created

检查已创建的StorageClass

kubectl get scNAMEPROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGEnfs-client (default)cluster.local/nfs-subdir-external-provisioner DeleteImmediate true 7d4hrook-ceph-block rook-ceph.rbd.csi.ceph.comDeleteImmediate true 5h26mrook-ceph-delete-bucket rook-ceph.ceph.rook.io/bucket DeleteImmediate false45srook-cephfs rook-ceph.cephfs.csi.ceph.com DeleteImmediate true 4h38m

根据这个存储类,现在可以通过创建对象存储桶声明Object Bucket Claim(OBC)来请求一个存储桶。当创建OBC时,Rook bucket provisioner将创建一个新的存储桶。请注意,OBC引用了上面创建的存储类。将以下内容保存为object-bucket-claim-delete.yaml(示例命名为 delete,因为使用了Delete的回收策略):

# 在当前路径 /root/rook/deploy/exampleskubectl create -f object-bucket-claim-delete.yaml

OBC创建成功后,Rook Ceph Operator将创建存储桶,并生成其他文件以实现对存储桶的访问。将以与OBC相同的名称和在相同的命名空间中创建一个密钥和ConfigMap。密钥包含应用程序Pod用于访问存储桶的凭据。ConfigMap包含存储桶端点信息,也会被Pod使用。有关CephObjectBucketClaims的更多详细信息,请参阅对象存储桶声明文档

#查看相关的资源Configmapkubectl get cmNAME DATA AGEceph-delete-bucket 510m#查看Configmap的具体信息kubectl get cm ceph-delete-bucket -o yamlapiVersion: v1data:BUCKET_HOST: rook-ceph-rgw-my-store.rook-ceph.svcBUCKET_NAME: ceph-bkt-2e22eaf9-a577-45b2-94ed-e96c04670637BUCKET_PORT: "80"BUCKET_REGION: ""BUCKET_SUBREGION: ""kind: ConfigMapmetadata:creationTimestamp: "2023-12-30T09:42:56Z"finalizers:- objectbucket.io/finalizerlabels:bucket-provisioner: rook-ceph.ceph.rook.io-bucketname: ceph-delete-bucketnamespace: defaultownerReferences:- apiVersion: objectbucket.io/v1alpha1blockOwnerDeletion: truecontroller: truekind: ObjectBucketClaimname: ceph-delete-bucketuid: ae670efd-0db9-4019-b0c3-6fa66aafcefbresourceVersion: "32176508"uid: 820df543-bc37-41ba-b777-425093cf20d8#查看Secret的具体信息,可以看到存储桶的访问ID和密码kubectl get secret ceph-delete-bucket -o yamlapiVersion: v1data:AWS_ACCESS_KEY_ID: RjFEWlhFTTQxQThBUENGOFcxNzY=AWS_SECRET_ACCESS_KEY: VGxhZTlRcFJESWU2U3N3OW91MXYyWGxVUFFCUEhuallhVWVCTGZreA==

3.使用s5cmd工具访问对象存储
因为这里的k8s集群使用的calico网络,可以直接在Node节点上使用svc ip,这里简单起见直接在K8S集群的控制节点上安装s5cmd命令行工具。

wget https://github.com/peak/s5cmd/releases/download/v2.2.2/s5cmd_2.2.2_Linux-64bit.tar.gztar -xvf s5cmd_2.2.2_Linux-64bit.tar.gzCHANGELOG.mdLICENSEREADME.mds5cmdsudo mv s5cmd /usr/local/bin/#最后通过 --help 既可以查看帮助命令s5cmd --helpNAME: s5cmd - Blazing fast S3 and local filesystem execution toolUSAGE: s5cmd [global options] command [command options] [arguments...]

接下来配置s5cmd工具访问对象存储凭据:

export AWS_ACCESS_KEY_ID=$(kubectl -n default get secret ceph-delete-bucket -o jsonpath='{.data.AWS_ACCESS_KEY_ID}' | base64 --decode)export AWS_SECRET_ACCESS_KEY=$(kubectl -n default get secret ceph-delete-bucket -o jsonpath='{.data.AWS_SECRET_ACCESS_KEY}' | base64 --decode)mkdir ~/.awscat > ~/.aws/credentials << EOF[default]aws_access_key_id = ${AWS_ACCESS_KEY_ID}aws_secret_access_key = ${AWS_SECRET_ACCESS_KEY}EOF

查看rook-ceph-rgw-my-store这个Service的IP:

k get svc rook-ceph-rgw-my-store-n rook-cephNAME TYPECLUSTER-IP EXTERNAL-IP PORT(S) AGErook-ceph-rgw-my-store ClusterIP 10.43.65.160 <none>80/TCP103m

使用s5cmd访问存储桶,列出当前凭据可以访问的所有桶:

s5cmd --endpoint-urlhttp://10.43.65.160 ls2023/12/30 09:42:56s3://ceph-bkt-2e22eaf9-a577-45b2-94ed-e96c04670637

注这里使用Service IP 访问rook-ceph-rgw-my-store只是为了测试。生产环境中如果从K8S集群内访问的话,使用Service的DNS名称,如果从集群外部访问推荐使用Ingress将其暴露到集群外部。

8. 访问Ceph Dashboard

通过使用Ceph Dashboard可以查看集群的状态。使用Rook部署的Ceph集群已经默认启用了Ceph Dashboard。

创建一个拥有NodePort对外暴露方式的Service

kubectl apply -f dashboard-external-https.yamlservice/rook-ceph-mgr-dashboard-external-https created#可以看到当前NodePort对外的端口为57482kg svc -n rook-cephNAME TYPECLUSTER-IPEXTERNAL-IP PORT(S) AGErook-ceph-exporter ClusterIP 10.43.179.89<none>9926/TCP7h38mrook-ceph-mgrClusterIP 10.43.11.237<none>9283/TCP7h38mrook-ceph-mgr-dashboardClusterIP 10.43.234.132 <none>8443/TCP7h38mrook-ceph-mgr-dashboard-external-https NodePort10.43.207.88<none>8443:57482/TCP11mrook-ceph-mon-aClusterIP 10.43.205.40<none>6789/TCP,3300/TCP 7h39mrook-ceph-mon-bClusterIP 10.43.180.30<none>6789/TCP,3300/TCP 7h39mrook-ceph-mon-cClusterIP 10.43.166.149 <none>6789/TCP,3300/TCP 7h38mrook-ceph-rgw-my-store ClusterIP 10.43.65.160<none>80/TCP148m

Ceph Dashboard admin用户的命名可以通过下面的命令查看:

kubectl -n rook-ceph get secret rook-ceph-dashboard-password -o jsonpath="{['data']['password']}" | base64 --decode && echo

登录图形化界面