Kubernetes集群部署Rook Ceph实现文件存储,对象存储,块存储

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-master1 v1.26.8 CentOS Linux release 7.9 5.4.242-1.el7 x86_64
yiqi-rancher-master2 v1.26.8 CentOS Linux release 7.9 5.4.242-1.el7 x86_64
yiqi-rancher-master3 v1.26.8 CentOS Linux release 7.9 5.4.242-1.el7 x86_64
yiqi-rancher-worker1 v1.26.8 CentOS Linux release 7.9 5.4.242-1.el7 x86_64
yiqi-rancher-worker2 v1.26.8 CentOS Linux release 7.9 5.4.242-1.el7 x86_64
yiqi-rancher-worker3 v1.26.8 CentOS Linux release 7.9 5.4.242-1.el7 x86_64
yiqi-rancher-worker4 v1.26.8 CentOS Linux release 7.9 5.4.242-1.el7 x86_64
yiqi-rancher-worker5 v1.26.8 CentOS Linux release 7.9 5.4.242-1.el7 x86_64

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

bash 复制代码
lsblk -f
NAME            FSTYPE      LABEL UUID                                   MOUNTPOINT
vdd                                                                      
vdb                                                                      
vdc                                                                      
vda                                                                      
├─vda2          LVM2_member       rgicKt-MO6U-rHDf-W7YC-VbCS-Rcl8-XU1vQE 
│ ├─centos-swap swap              3f2904bc-792e-4606-b0af-51bcaee5779c   
│ └─centos-root xfs               0dabeafe-43fe-4f98-9846-eeb2b66dadaa   /
└─vda1          xfs               fecac8e2-cde0-4e2a-86ac-5135aaba25b3   /boot

安装git:

bash 复制代码
yum install git -y

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

bash 复制代码
git clone https://github.com/rook/rook.git

切换标签带V1.13.1版本:

bash 复制代码
git checkout v1.13.1

4. 安装Operator

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

bash 复制代码
cd rook/deploy/examples/

kubectl create -f crds.yaml -f common.yaml -f operator.yaml

完成后检查Pod的运行状态

bash 复制代码
kubectl -n rook-ceph get pod
NAME                                  READY   STATUS    RESTARTS   AGE
rook-ceph-operator-7c9659dcab-fh3ui   1/1     Running   0          42s

5. 创建ceph集群

bash 复制代码
kubectl create -f cluster.yaml

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

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

bash 复制代码
kubectl get po -n rook-ceph -o wide
NAME                                                              READY   STATUS      RESTARTS        AGE     IP              NODE                   NOMINATED NODE   READINESS GATES
csi-cephfsplugin-bf5vp                                            2/2     Running     1 (4m ago)      4m34s   9.30.247.102    yiqi-rancher-worker5   <none>           <none>
csi-cephfsplugin-j9k5q                                            2/2     Running     1 (4m ago)      4m34s   9.30.211.215    yiqi-rancher-worker1   <none>           <none>
csi-cephfsplugin-k6c75                                            2/2     Running     1 (4m ago)      4m34s   9.30.161.76     yiqi-rancher-worker3   <none>           <none>
csi-cephfsplugin-nxmdh                                            2/2     Running     0               4m34s   9.30.246.169    yiqi-rancher-worker4   <none>           <none>
csi-cephfsplugin-provisioner-56956bc974-8vvfk                     5/5     Running     0               4m34s   10.42.53.134    yiqi-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-tv5kw                                            2/2     Running     1 (4m ago)      4m34s   9.30.160.224    yiqi-rancher-worker2   <none>           <none>
csi-rbdplugin-fnqst                                               2/2     Running     1 (4m ago)      4m34s   9.30.160.224    yiqi-rancher-worker2   <none>           <none>
csi-rbdplugin-mvvrf                                               2/2     Running     0               4m34s   9.30.246.169    yiqi-rancher-worker4   <none>           <none>
csi-rbdplugin-pjltf                                               2/2     Running     1 (4m ago)      4m34s   9.30.247.102    yiqi-rancher-worker5   <none>           <none>
csi-rbdplugin-provisioner-cc97cf4b9-k5frj                         5/5     Running     1 (4m ago)      4m34s   10.42.65.6      yiqi-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.215    yiqi-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               3m4s    10.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.21    yiqi-rancher-worker2   <none>           <none>
rook-ceph-crashcollector-yiqi-rancher-worker3.fyre.ibm.comc5cdq   1/1     Running     0               3m50s   10.42.65.8      yiqi-rancher-worker3   <none>           <none>
rook-ceph-crashcollector-yiqi-rancher-worker4.fyre.ibm.comjrv75   1/1     Running     0               3m21s   10.42.53.139    yiqi-rancher-worker4   <none>           <none>
rook-ceph-crashcollector-yiqi-rancher-worker5.fyre.ibm.comqbf4n   1/1     Running     0               3m22s   10.42.240.13    yiqi-rancher-worker5   <none>           <none>
rook-ceph-exporter-yiqi-rancher-worker1.fyre.ibm.com-54bddqm5mb   1/1     Running     0               3m4s    10.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.22    yiqi-rancher-worker2   <none>           <none>
rook-ceph-exporter-yiqi-rancher-worker3.fyre.ibm.com-6fdfdkwlth   1/1     Running     0               3m50s   10.42.65.9      yiqi-rancher-worker3   <none>           <none>
rook-ceph-exporter-yiqi-rancher-worker4.fyre.ibm.com-5ddb5zk9xg   1/1     Running     0               3m21s   10.42.53.140    yiqi-rancher-worker4   <none>           <none>
rook-ceph-exporter-yiqi-rancher-worker5.fyre.ibm.com-5d4b7gn2ch   1/1     Running     0               3m18s   10.42.240.15    yiqi-rancher-worker5   <none>           <none>
rook-ceph-mgr-a-85945fd8d4-m2sbg                                  3/3     Running     0               4m6s    10.42.128.14    yiqi-rancher-worker2   <none>           <none>
rook-ceph-mgr-b-7f95644479-6xqhr                                  3/3     Running     0               4m6s    10.42.240.7     yiqi-rancher-worker5   <none>           <none>
rook-ceph-mon-a-596c6cbfc5-8nxdj                                  2/2     Running     0               4m57s   10.42.240.5     yiqi-rancher-worker5   <none>           <none>
rook-ceph-mon-b-6f9c6f46c9-g69w8                                  2/2     Running     0               4m33s   10.42.128.13    yiqi-rancher-worker2   <none>           <none>
rook-ceph-mon-c-5c889df47f-488cm                                  2/2     Running     0               4m20s   10.42.65.7      yiqi-rancher-worker3   <none>           <none>
rook-ceph-operator-6c9669dcbd-k5qmz                               1/1     Running     0               25m     10.42.65.4      yiqi-rancher-worker3   <none>           <none>
rook-ceph-osd-0-6846c64444-jv7k4                                  2/2     Running     0               3m25s   10.42.128.18    yiqi-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-l7s7b                                  2/2     Running     0               3m22s   10.42.240.14    yiqi-rancher-worker5   <none>           <none>
rook-ceph-osd-11-646d597b-m6ptn                                   2/2     Running     0               3m21s   10.42.53.138    yiqi-rancher-worker4   <none>           <none>
rook-ceph-osd-12-7f4458595b-cdpsr                                 2/2     Running     0               3m4s    10.42.208.139   yiqi-rancher-worker1   <none>           <none>
rook-ceph-osd-13-88b4c74f7-xl6nj                                  2/2     Running     0               3m4s    10.42.208.135   yiqi-rancher-worker1   <none>           <none>
rook-ceph-osd-14-89c7fddd-cgdvw                                   2/2     Running     0               3m4s    10.42.208.137   yiqi-rancher-worker1   <none>           <none>
rook-ceph-osd-2-659fbf966f-2m8zc                                  2/2     Running     0               3m22s   10.42.240.11    yiqi-rancher-worker5   <none>           <none>
rook-ceph-osd-3-5d5cbcd9f5-w8qv9                                  2/2     Running     0               3m22s   10.42.53.137    yiqi-rancher-worker4   <none>           <none>
rook-ceph-osd-4-9f5cb68fb-pp2g6                                   2/2     Running     0               3m25s   10.42.128.19    yiqi-rancher-worker2   <none>           <none>
rook-ceph-osd-5-59d79d7679-j2h9r                                  2/2     Running     0               3m24s   10.42.65.13     yiqi-rancher-worker3   <none>           <none>
rook-ceph-osd-6-5799c4b877-gzgdn                                  2/2     Running     0               3m22s   10.42.240.12    yiqi-rancher-worker5   <none>           <none>
rook-ceph-osd-7-6897c7445c-kctmf                                  2/2     Running     0               3m22s   10.42.53.136    yiqi-rancher-worker4   <none>           <none>
rook-ceph-osd-8-796c48c59f-2j5fl                                  2/2     Running     0               3m25s   10.42.128.20    yiqi-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-ndtrc      0/1     Completed   0               2m30s   10.42.65.14     yiqi-rancher-worker3   <none>           <none>
rook-ceph-osd-prepare-49eb3309ba3821b41e4320db43c5f1f1-ktxh7      0/1     Completed   0               2m37s   10.42.208.140   yiqi-rancher-worker1   <none>           <none>
rook-ceph-osd-prepare-4d2d5eab315cc094c1f72a4485297888-xg24j      0/1     Completed   0               2m27s   10.42.53.141    yiqi-rancher-worker4   <none>           <none>
rook-ceph-osd-prepare-8545b28a9ad22acf59fd2168d50c1a9c-mlj2l      0/1     Completed   0               2m24s   10.42.240.16    yiqi-rancher-worker5   <none>           <none>
rook-ceph-osd-prepare-b4a0cdf88b658e7c811ab8a320cbd626-f59kr      0/1     Completed   0               2m33s   10.42.128.24    yiqi-rancher-worker2   <none>           <none>

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

6. 验证ceph集群

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

bash 复制代码
kubectl create -f toolbox.yaml

检查Pod状态
kubectl -n rook-ceph rollout status deploy/rook-ceph-tools

通过命令行进入Pod
kubectl -n rook-ceph exec -it deploy/rook-ceph-tools -- bash

#可以通过如下ceph命令查看集群的状态,例如
ceph status
ceph osd status
ceph df
rados df

# ceph status显示的当前集群状态
bash-4.4$ ceph status
  cluster:
	id: 	b6c450b1-4406-44f9-8ebd-e0277c8d8f7e
	health: HEALTH_WARN
        	1 daemons have recently crashed
 
  services:
	mon: 3 daemons, quorum a,b,c (age 20m)
	mgr: a(active, since 18m), standbys: b
	osd: 15 osds: 15 up (since 18m), 15 in (since 19m)
 
  data:
	pools:   1 pools, 1 pgs
	objects: 2 objects, 449 KiB
	usage:   399 MiB used, 2.9 TiB / 2.9 TiB avail
	pgs: 	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"这个文件进行部署。

bash 复制代码
# 在当前路径 /root/rook/deploy/examples
kubectl apply -f ./csi/rbd/storageclass.yaml 
cephblockpool.ceph.rook.io/replicapool created
storageclass.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 复制代码
bash-4.4$ ceph osd lspools
1 .mgr
2 replicapool

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

bash 复制代码
kubectl get sc
NAME                   PROVISIONER                                     RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
nfs-client (default)   cluster.local/nfs-subdir-external-provisioner   Delete          Immediate           true                   6d23h
rook-ceph-block        rook-ceph.rbd.csi.ceph.com                      Delete          Immediate           true                   7m20s

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

bash 复制代码
# 在当前路径 /root/rook/deploy/examples
kubectl create -f mysql.yaml
kubectl create -f wordpress.yaml

查看PVC

bash 复制代码
kubectl get pvc
NAME             STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS      AGE
mysql-pv-claim   Bound    pvc-3db54f6f-b4b2-4c72-8134-81841ce99178   20Gi       RWO            rook-ceph-block   3m20s
wp-pv-claim      Bound    pvc-5134d1a7-23c5-4bfe-be02-6d204121a127   20Gi       RWO            rook-ceph-block   3m19s

kubectl get pv
NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                    STORAGECLASS      REASON   AGE
pvc-3db54f6f-b4b2-4c72-8134-81841ce99178   20Gi       RWO            Delete           Bound    default/mysql-pv-claim   rook-ceph-block            3m19s
pvc-5134d1a7-23c5-4bfe-be02-6d204121a127   20Gi       RWO            Delete           Bound    default/wp-pv-claim      rook-ceph-block            3m19s

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

bash 复制代码
bash-4.4$ rbd ls -p replicapool
csi-vol-ac06bcbf-5c33-42ea-b41f-e46a4a4d9c77
csi-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个副本的单个数据池。有关更多选项,请参阅创建共享文件系统的文档

bash 复制代码
# 在当前路径 /root/rook/deploy/examples
kubectl create -f filesystem.yaml

查看Pod状态

bash 复制代码
kubectl -n rook-ceph get pod -l app=rook-ceph-mds
NAME                                	READY   STATUS	RESTARTS   AGE
rook-ceph-mds-myfs-a-795d4c688f-nj92g   2/2 	Running   0      	104s
rook-ceph-mds-myfs-b-558bb747c7-kpwqd   2/2 	Running   0      	103s

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

bash 复制代码
bash-4.4$ ceph -s
  cluster:
	id: 	b6c450b1-4406-44f9-8ebd-e0277c8d8f7e
	health: HEALTH_WARN
        	1 daemons have recently crashed
 
  services:
	mon: 3 daemons, quorum a,b,c (age 86m)
	mgr: a(active, since 84m), standbys: b
	mds: 1/1 daemons up, 1 hot standby  #可以看到相比之前的状态mds服务已经运行起来了
	osd: 15 osds: 15 up (since 84m), 15 in (since 85m)
 
  data:
	volumes: 1/1 healthy
	pools:   4 pools, 81 pgs
	objects: 29 objects, 466 KiB
	usage:   886 MiB used, 2.9 TiB / 2.9 TiB avail
	pgs: 	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 lspools
1 .mgr
2 replicapool
3 myfs-metadata 
4 myfs-replicated #

2.创建StorageClass

bash 复制代码
# 在当前路径 /root/rook/deploy/examples
kubectl create -f ./csi/cephfs/storageclass.yaml

#检查StorageClass的状态,可以看到rook-cephfs已经建立起来了。
kubectl get sc
NAME                   PROVISIONER                                     RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
nfs-client (default)   cluster.local/nfs-subdir-external-provisioner   Delete          Immediate           true                   7d
rook-ceph-block        rook-ceph.rbd.csi.ceph.com                      Delete          Immediate           true                   48m
rook-cephfs            rook-ceph.cephfs.csi.ceph.com                   Delete          Immediate           true                   19s

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

bash 复制代码
vi testcephps.yaml

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: busybox-data-pvc
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 2Gi
  storageClassName: rook-cephfs
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: busybox
spec:
  replicas: 2
  selector:
    matchLabels:
      app: busybox
  template:
    metadata:
      labels:
        app: busybox
    spec:
      containers:
      - name: busybox-container
        image: busybox:stable-glibc
        command: ["sleep", "3600"]
        volumeMounts:
        - name: data-volume
          mountPath: /data
      volumes:
      - name: data-volume
        persistentVolumeClaim:
          claimName: busybox-data-pvc

#创建相关的资源
kubectl apply -f testcephfs.yaml

#检查资源的创建情况
kubectl get pvc
NAME           	STATUS   VOLUME                                 	CAPACITY   ACCESS MODES   STORAGECLASS   AGE
busybox-data-pvc   Bound	pvc-647ecb9f-1a18-484a-9536-ac26cb0a8a03   2Gi    	RWX        	rook-cephfs	9s

kubectl get po
NAME                                           	READY   STATUS	RESTARTS   AGE
busybox-86c4ffc4b6-q6lzn                       	1/1 	Running   0      	41s
busybox-86c4ffc4b6-ttxgz                       	1/1 	Running   0      	41s
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)。

bash 复制代码
# 在当前路径 /root/rook/deploy/examples
kubectl apply -f object.yaml
cephobjectstore.ceph.rook.io/my-store created

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

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

bash 复制代码
kubectl -n rook-ceph get pod -l app=rook-ceph-rgw
NAME                                        READY   STATUS    RESTARTS   AGE
rook-ceph-rgw-my-store-a-5c9fcc5674-j85lv   2/2     Running   0          109s

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

bash 复制代码
bash-4.4$ ceph osd lspools
1 .mgr
2 replicapool
3 myfs-metadata
4 myfs-replicated
5 my-store.rgw.buckets.non-ec
6 my-store.rgw.buckets.index
7 my-store.rgw.log
8 my-store.rgw.control
9 my-store.rgw.otp
10 .rgw.root
11 my-store.rgw.meta
12 my-store.rgw.buckets.data

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

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

bash 复制代码
bash-4.4$ ceph -s
  cluster:
    id:     b6c450b1-4406-44f9-8ebd-e0277c8d8f7e
    health: HEALTH_WARN
            1 daemons have recently crashed
 
  services:
    mon: 3 daemons, quorum a,b,c (age 5h)
    mgr: a(active, since 5h), standbys: b
    mds: 1/1 daemons up, 1 hot standby
    osd: 15 osds: 15 up (since 5h), 15 in (since 5h)
    rgw: 1 daemon active (1 hosts, 1 zones)
 
  data:
    volumes: 1/1 healthy
    pools:   12 pools, 169 pgs
    objects: 245 objects, 753 KiB
    usage:   1.2 GiB used, 2.9 TiB / 2.9 TiB avail
    pgs:     169 active+clean
 
  io:
    client:   1.3 KiB/s rd, 170 B/s wr, 2 op/s rd, 0 op/s wr

2.创建StorageClass

bash 复制代码
# 在当前路径 /root/rook/deploy/examples
kubectl create -f storageclass-bucket-delete.yaml

storageclass.storage.k8s.io/rook-ceph-delete-bucket created

检查已创建的StorageClass

bash 复制代码
kubectl get sc
NAME                      PROVISIONER                                     RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
nfs-client (default)      cluster.local/nfs-subdir-external-provisioner   Delete          Immediate           true                   7d4h
rook-ceph-block           rook-ceph.rbd.csi.ceph.com                      Delete          Immediate           true                   5h26m
rook-ceph-delete-bucket   rook-ceph.ceph.rook.io/bucket                   Delete          Immediate           false                  45s
rook-cephfs               rook-ceph.cephfs.csi.ceph.com                   Delete          Immediate           true                   4h38m

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

bash 复制代码
# 在当前路径 /root/rook/deploy/examples
kubectl create -f object-bucket-claim-delete.yaml

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

bash 复制代码
#查看相关的资源Configmap
kubectl get cm
NAME                 DATA   AGE
ceph-delete-bucket   5      10m

#查看Configmap的具体信息
kubectl get cm ceph-delete-bucket -o yaml
apiVersion: v1
data:
  BUCKET_HOST: rook-ceph-rgw-my-store.rook-ceph.svc
  BUCKET_NAME: ceph-bkt-2e22eaf9-a577-45b2-94ed-e96c04670637
  BUCKET_PORT: "80"
  BUCKET_REGION: ""
  BUCKET_SUBREGION: ""
kind: ConfigMap
metadata:
  creationTimestamp: "2023-12-30T09:42:56Z"
  finalizers:
  - objectbucket.io/finalizer
  labels:
	bucket-provisioner: rook-ceph.ceph.rook.io-bucket
  name: ceph-delete-bucket
  namespace: default
  ownerReferences:
  - apiVersion: objectbucket.io/v1alpha1
	blockOwnerDeletion: true
	controller: true
	kind: ObjectBucketClaim
	name: ceph-delete-bucket
	uid: ae670efd-0db9-4019-b0c3-6fa66aafcefb
  resourceVersion: "32176508"
  uid: 820df543-bc37-41ba-b777-425093cf20d8

#查看Secret的具体信息,可以看到存储桶的访问ID和密码
kubectl get secret ceph-delete-bucket -o yaml
apiVersion: v1
data:
  AWS_ACCESS_KEY_ID: RjFEWlhFTTQxQThBUENGOFcxNzY=
  AWS_SECRET_ACCESS_KEY: VGxhZTlRcFJESWU2U3N3OW91MXYyWGxVUFFCUEhuallhVWVCTGZreA==

3.使用s5cmd工具访问对象存储

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

bash 复制代码
wget https://github.com/peak/s5cmd/releases/download/v2.2.2/s5cmd_2.2.2_Linux-64bit.tar.gz

tar -xvf s5cmd_2.2.2_Linux-64bit.tar.gz
CHANGELOG.md
LICENSE
README.md
s5cmd

sudo mv s5cmd /usr/local/bin/

#最后通过 --help 既可以查看帮助命令
s5cmd --help
NAME:
   s5cmd - Blazing fast S3 and local filesystem execution tool

USAGE:
   s5cmd [global options] command [command options] [arguments...]

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

bash 复制代码
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 ~/.aws
cat > ~/.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:

bash 复制代码
k get svc rook-ceph-rgw-my-store  -n rook-ceph
NAME                     TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)   AGE
rook-ceph-rgw-my-store   ClusterIP   10.43.65.160   <none>        80/TCP    103m

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

bash 复制代码
s5cmd --endpoint-url  http://10.43.65.160 ls
2023/12/30 09:42:56  s3://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

bash 复制代码
kubectl apply -f dashboard-external-https.yaml
service/rook-ceph-mgr-dashboard-external-https created

#可以看到当前NodePort对外的端口为57482
kg svc -n rook-ceph
NAME                                     TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)             AGE
rook-ceph-exporter                       ClusterIP   10.43.179.89    <none>        9926/TCP            7h38m
rook-ceph-mgr                            ClusterIP   10.43.11.237    <none>        9283/TCP            7h38m
rook-ceph-mgr-dashboard                  ClusterIP   10.43.234.132   <none>        8443/TCP            7h38m
rook-ceph-mgr-dashboard-external-https   NodePort    10.43.207.88    <none>        8443:57482/TCP      11m
rook-ceph-mon-a                          ClusterIP   10.43.205.40    <none>        6789/TCP,3300/TCP   7h39m
rook-ceph-mon-b                          ClusterIP   10.43.180.30    <none>        6789/TCP,3300/TCP   7h39m
rook-ceph-mon-c                          ClusterIP   10.43.166.149   <none>        6789/TCP,3300/TCP   7h38m
rook-ceph-rgw-my-store                   ClusterIP   10.43.65.160    <none>        80/TCP              148m

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

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

登录图形化界面

相关推荐
Serverless社区1 分钟前
探秘 AgentRun|基于 Serverless 的 AI Agent 沙箱工程化之路
运维·阿里云·云原生·serverless·函数计算
阿里云云原生1 小时前
Nacos 生产级安全实践:精细化鉴权、灰度平滑过渡与全量操作审计
安全·阿里云·云原生·nacos
Ashmcracker1 小时前
导入Azure AKS集群到Rancher
microsoft·kubernetes·rancher·azure
码农小卡拉2 小时前
Docker Compose部署EMQX集群详细教程(Ubuntu环境优化版)
mqtt·ubuntu·docker·容器·emqx
WilliamHu.3 小时前
Windows 环境下使用 Docker 成功部署 Dify(完整实战记录)
运维·docker·容器
叫致寒吧4 小时前
Kubernetes 安全机制
安全·容器·kubernetes
Cyber4K4 小时前
【Kubernetes专项】零故障升级之Pod健康探测
云原生·容器·kubernetes
能不能别报错4 小时前
企业级生产级K8s平台
云原生·容器·kubernetes
幼稚园的山代王4 小时前
从 0 到 1,读懂 Kubernetes 核心概念
云原生·容器·kubernetes
秋天枫叶356 小时前
【k8s集群Docker + cri-dockerd】服务器重启或关机后 apiserver/controller/scheduler 无法自动恢复
linux·运维·服务器·容器·kubernetes·bug