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

news2025/4/23 15:23:36

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 -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:

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 pod
NAME                                  READY   STATUS    RESTARTS   AGE
rook-ceph-operator-7c9659dcab-fh3ui   1/1     Running   0          42s

5. 创建ceph集群

kubectl create -f cluster.yaml

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

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

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工具箱

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”这个文件进行部署。

# 在当前路径 /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-4.4$ ceph osd lspools
1 .mgr
2 replicapool

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

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)。

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

查看PVC

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-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个副本的单个数据池。有关更多选项,请参阅创建共享文件系统的文档

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

查看Pod状态

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-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

# 在当前路径 /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挂载

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)。

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

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

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

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-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-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

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

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

检查已创建的StorageClass

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的回收策略):

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

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

#查看相关的资源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命令行工具。

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工具访问对象存储凭据:

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:

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访问存储桶,列出当前凭据可以访问的所有桶:

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

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用户的命名可以通过下面的命令查看:

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

登录图形化界面
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1345814.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Kubernetes】什么是 kubectl ?

什么是 kubectl &#xff1f; 1.什么是 kubectl &#xff1f;2.Kubernetes 内部结构3.Kubernetes API 的作用 1.什么是 kubectl &#xff1f; 在学习如何更有效地使用 kubectl 之前&#xff0c;您应该对它是什么以及它如何工作有一个基本的了解。从用户的角度来看&#xff0c;…

Vue小练习--任务列表

这是一个非常实用的例子&#xff0c;主要实用的是v-model、v-on、v-for指令&#xff0c;javaScript的数组也会涉及一些&#xff0c;javaScript数组方法有很多&#xff0c;本文使用的添加元素和删除元素非常实用&#xff0c;可以记下来。 设计思路 很多例子看起来很难&#xf…

SpringMVC源码解析——DispatcherServlet的逻辑处理

DispatcherServlet类相关的结构图如下&#xff1a; 其中jakarta.servlet.http.HttpServlet的父类是jakarta.servlet.GenericServlet&#xff0c;实现接口jakarta.servlet.Servlet。我们先看一下jakarta.servlet.Servlet接口的源码如下&#xff1a; /*** 定义所有servlet必须实…

Java EE Servlet之服务器版表白墙

文章目录 1. 准备工作2. 约定前后端交互接口3. 编写提交消息4. 数据存入文件5. 引入数据库 1. 准备工作 我们要把表白墙程序修改成服务器版本 这样即使页面关闭, 表白墙的内容也不会丢失 此处&#xff0c;服务器要实现的功能&#xff0c;主要是两个方面&#xff1a; 页面加载…

CSS 动态提示框

​​ <template> <div class"terminal-loader"><div class"terminal-header"><div class"terminal-title">提示框</div><div class"terminal-controls"><div class"control close"…

Qt 5.9.4 转 Qt 6.6.1 遇到的问题总结(一)

最近公司对大家的开发的硬件环境进行了升级&#xff0c;电脑主机的配置、显示器&#xff08;两台大屏显示器&#xff09;变得的逼格高多了。既然电脑上的开发环境都需要重装&#xff0c;就打算把开发环境也升级到最新版本&#xff0c;要用就用最新版本。下面对升级后的开发环境…

数据库开发之子查询案例的详细解析

1.5 案例 基于之前设计的多表案例的表结构&#xff0c;我们来完成今天的多表查询案例需求。 准备环境 将资料中准备好的多表查询的数据准备的SQL脚本导入数据库中。 分类表&#xff1a;category 菜品表&#xff1a;dish 套餐表&#xff1a;setmeal 套餐菜品关系表&#x…

LeetCode刷题--- 黄金矿工

个人主页&#xff1a;元清加油_【C】,【C语言】,【数据结构与算法】-CSDN博客 个人专栏 力扣递归算法题 http://t.csdnimg.cn/yUl2I 【C】 ​​​​​​http://t.csdnimg.cn/6AbpV 数据结构与算法 ​​​​http://t.csdnimg.cn/hKh2l 前言&#xff1a;这个专栏主要讲述…

2017年喜茶数字营销变化

1. 什么是数字营销&#xff1f;数字化时代&#xff0c;消费者行为模式发生了哪些变化&#xff1f; 数字营销是指使用数字渠道和平台&#xff0c;通过在线手段推广产品或服务&#xff0c;与目标受众进行互动和沟通的一种营销方式。它涵盖了多种在线渠道&#xff0c;包括社交媒…

【赠书第15期】案例学Python(基础篇)

文章目录 前言 1 简介 2 功能列表 3 实现 3.1 学生类 3.2 学生管理系统类 3.3 使用示例 4 推荐图书 5 粉丝福利 前言 当涉及案例学 Python 时&#xff0c;可以选择一个具体的问题或场景&#xff0c;通过编写代码来解决或模拟这个问题。以下是一个例子&#xff0c;通过…

自动化测试系列 之 Python单元测试框架unittest

一、概述 什么是单元测试 单元测试是一种软件测试方法&#xff0c;是测试最小的可测试单元&#xff0c;通常是一个函数或一个方法。 在软件开发过程中&#xff0c;单元测试作为一项重要的测试方法被广泛应用。 为什么需要单元测试 单元测试是软件开发中重要的一环&#xf…

HackTheBox - Medium - Linux - Interface

Interface Interface 是一种中等难度的 Linux 机器&#xff0c;具有“DomPDF”API 端点&#xff0c;该端点通过将“CSS”注入处理后的数据而容易受到远程命令执行的影响。“DomPDF”可以被诱骗在其字体缓存中存储带有“PHP”文件扩展名的恶意字体&#xff0c;然后可以通过从其…

前端开发工具之HBuilder X

HBuilderX&#xff08;简称HX&#xff09;是一款由DCloud开发的集成开发环境&#xff08;IDE&#xff09;&#xff0c;专为前端开发者设计。它不仅是一个编辑器&#xff0c;也可以看作是一个通用的IDE&#xff0c;类似于VSCode、Sublime和WebStorm。HBuilderX支持开发各种Web项…

论文阅读——EfficientViT(cvpr2023)

EfficientViT: Memory Efficient Vision Transformer with Cascaded Group Attention 1、 从三个角度探讨如何提高vision transformers的效率&#xff1a;内存访问、计算冗余和参数使用。 2.1. Memory Efficiency 红色字体表示操作所花费的时间主要由内存访问决定&#xff0c;…

RSA加密解密——用shell加密java解密

功能描述 使用shell opensll对明文进行RSA加密&#xff0c;将密文用java的RSA工具对密文解密。这应该是全网第一个同时用到shell和java的RSA加密解密教程。中间有很多坑&#xff0c;都踩过了&#xff0c;可以放心使用代码。 正确的实现流程 shell端 首先生成公钥私钥 &…

C/C++ 对象、继承和引用

ostream和ofstream类凸现了引用的一个有趣属性。正如ofstream 对象可以使用 ostream类的方法&#xff0c;这使得文件输入/输出的格式与控制台输入/输出相同。使得能够将特性从一个类传递给另一个类的语言特性被称为继承。 简单地说&#xff0c;ostream 是基类&#xff0c;而ofs…

<软考高项备考>《论文专题 - 37 采购管理(1) 》

1 成本管理基础 1.1 写作要点 过程定义、作用写作要点、思路规划采购管理规划采购管理是记录项目采购决策、明确采购方法&#xff0c;及识别潜在卖方的过程。作用:确定是否从项目外部获取货物和服务&#xff0c;如果是&#xff0c;则还要确定将在什么时间、以什么方式获取什么…

OSPF的DR与BDR-新版(16)

目录 整体拓扑 操作步骤 1.基本配置 1.1 配置R1的IP 1.2 配置R2的IP 1.3 配置R3的IP 1.4 配置R4的IP 1.5 检测R1与R4连通性 1.6 检测R1与R2连通性 1.7 检测R1与R3连通性 2.搭建基本的OSPF网络 2.1 配置R1 OSPF 2.2 配置R2 OSPF 2.3 配置R3 OSPF 2.4 配置R4 OSPF…

力扣刷题总结 栈与队列

&#x1f525;博客主页&#xff1a; A_SHOWY&#x1f3a5;系列专栏&#xff1a;力扣刷题总结录 数据结构 云计算 数字图像处理 力扣每日一题_ 一、栈和队列的基础知识 队列是先进先出&#xff0c;栈是先进后出。同时二者都是容器适配器而不是容器。 二、题目实战 232.用栈…

帆软报表如何灵活控制水印的显示

在帆软报表中如果要显示水印,如果要全部都要显示,只需要到决策系统--安装设置中打开水印开关。如果想要某个报表显示水印,可以在设计器的水印设置中为该报表设置水印。 但是如果碰到这种需求,比如某些人或者某些角色需要显示水印,其他人不显示。或者是预览报表需要显示水印…