简介
从上文我们可知,虽然K8S提供了PVC的方式进行存储的便利性,但是PV的创建还是要手工的,使用起来不是很方便,在k8s 1.4以后,kubernetes提供了一种更加方便的动态创建PV的方式,即StorageClass。使用StorageClass时无需预先创建固定大小的PV来等待使用者创建PVC使用,而是直接创建PVC即可使用。
本文主要使用Rook搭建一个ceph集群,然后使用StorageClass来直接创建PVC。
Rook与ceph
Rook 是基于Kubernetes之上,提供一键部署存储系统的编排系统。Rook 将存储软件转变成自我管理、自我扩展和自我修复的存储服务,通过自动化部署、启动、配置、供应、扩展、升级、迁移、灾难恢复、监控和资源管理来实现。Rook 底层使用云原生容器管理、调度和编排平台提供的能力来提供这些功能。
Rook 使用底层云本机容器管理、调度和编排平台提供的工具来实现它自身的功能。Rook 目前支持Ceph、NFS、Minio Object Store和CockroachDB。
ook使用Kubernetes原语使Ceph存储系统能够在Kubernetes上运行。下图说明了Ceph Rook如何与Kubernetes集成:

随着Rook在Kubernetes集群中运行,Kubernetes应用程序可以挂载由Rook管理的块设备和文件系统,或者可以使用S3 / Swift API提供对象存储。
Rook组件
Rook的主要组件有两个,功能如下:
- Rook Operator:Rook oprerator是一个简单的容器,具有引导和监视存储集群所需的全部功能。oprerator将启动并监控ceph monitor pods和OSDs的守护进程,它提供基本的RADOS存储。oprerator通过初始化运行服务所需的pod和其他组件来管理池,对象存储(S3 / Swift)和文件系统的CRD。
- Rook与Kubernetes交互的组件
- 整个Rook集群只有一个
- Rook Agent
- 与Rook Operator交互,执行命令
- 每个Kubernetes的Node上都会启动一个
- 不同的存储系统,启动的Agent是不同的
Rook & Ceph框架
使用Rook部署Ceph集群的架构图如下:

从上面可以看出,通过Rook部署完Ceph集群后,就可以提供Volume Claim给Kubernetes集群里的App使用了。
ceph简介
Ceph 是一个分布式存储系统,具备大规模、高性能、无单点失败的特点。Ceph 是一种高度可扩展的分布式存储解决方案,用于具有多年生产部署的块存储,对象存储和共享文件系统。
Ceph 包括多个组件:
- Ceph Monitors(MON):负责生成集群票选机制。所有的集群节点都会向 Mon 进行汇报,并在每次状态变更时进行共享信息。
- Ceph Object Store Devices(OSD):负责在本地文件系统保存对象,并通过网络提供访问。通常 OSD 守护进程会绑定在集群的一个物理盘上,Ceph 客户端直接和 OSD 打交道。
- Ceph Manager(MGR):提供额外的监控和界面给外部的监管系统使用。
- Reliable Autonomic Distributed Object Stores:Ceph 存储集群的核心。这一层用于为存储数据提供一致性保障,执行数据复制、故障检测以及恢复等任务。
为了在 Ceph 上进行读写,客户端首先要联系 MON,获取最新的集群地图,其中包含了集群拓扑以及数据存储位置的信息。Ceph 客户端使用集群地图来获知需要交互的 OSD,从而和特定 OSD 建立联系。
而对应的三种存储类型对应的区别如下:
- 共享文件存储:类似我们平时看到的文件,有点类似NFS
- 块存储:硬盘等裸设备的存储方式,ceph创建时,就是创建一个虚拟的硬盘
- 对象存储:用 S3 兼容接口开放存储服务。
Rook部署
本次的测试环境如下:
三台k8s v1.17.2节点
| 主机名 | IP地址 |
| :——: | :—————: |
| master | 192.168.1.60 |
| node1 | 192.168.1.61 |
| node2 | 192.168.1.62 |rook 1.2版本
本次的主要资源列表:
- 官方文档:https://rook.io/docs/rook/v1.2/ceph-quickstart.html
- YAML文件列表:https://github.com/rook/rook/tree/release-1.2/cluster/examples/kubernetes/ceph
Rook Operator部署
克隆rook github仓库到本地,然后运行common.yaml 与 operator.yaml 两个资源清单文件:
1 | git clone --single-branch --branch release-1.2 https://github.com/rook/rook.git |
由于docker镜像比较大,建议先下载以下镜像:
1 | rook/ceph:v1.2.4 |
操作完成之后,必须保证rook-ceph-operator有在正常运行(1.2版本的namespace为rook-ceph):
1 | [root@master Rook]# kubectl get pods -n rook-ceph -o wide -l app=rook-ceph-operator |
部署rook-ceph-operator过程中,会触发以DaemonSet的方式在集群部署Agent和Discoverpods。operator会在集群内的每个主机创建两个pod:rook-discover,rook-ceph-agent。
ceph集群创建
现在 Rook Operator 处于 Running 状态,接下来我们就可以创建 Ceph 集群了。为了使集群在重启后不受影响,请确保设置的 dataDirHostPath 属性值为有效得主机路径,同时要保证有5G以上的空闲空间。
官方提供了3个yaml用来创建集群:
cluster.yaml: 该文件包含生产存储集群的通用设置。至少需要三个节点。cluster-test.yaml: 未配置冗余的测试群集的设置。只需要一个节点。cluster-minimal.yaml: 仅使用一个ceph-mon和一个ceph-mgr创建一个集群,因此Ceph仪表板可用于其余集群配置。
如果你有自定义了dataDirHostPath ,就需要修改。
当检查到Rook operator, agent, and discover pods已经是running状态后,就可以部署rook cluster了。
同时,Ceph 有一个 Dashboard 工具,我们可以在上面查看集群的状态,包括总体运行状态,mgr、osd 和其他 Ceph 进程的状态,查看池和 PG 状态,以及显示守护进程的日志等等。只需要设置dashboard.enable=true即可,这样 Rook Operator 就会启用 ceph-mgr dashboard 模块
就直接 kubectl apply -f cluster.yaml即可。这时就需要漫长的等待了,因为需要下载镜像,必须保证以下pod都是在正常运行:
1 | [root@master Rook]# kubectl get pods -n rook-ceph -o wide |
如果pod运行失败,则需要使用kubectl describe pod -n rook-ceph xxx查看具体失败的原因。
Ceph Dashboard
前文说到,设置dashboard.enable=true即可,这样 Rook Operator 就会启用 ceph-mgr dashboard 模块,并将创建一个 Kubernetes Service 来暴露该服务,将启用端口 7000 进行 https 访问,如果 Ceph 集群部署成功了,我们可以使用下面的命令来查看 Dashboard 的 Service:
1 | [root@master ~]# kubectl get svc -n rook-ceph |
这里的 rook-ceph-mgr 服务用于报告 Prometheus metrics 指标数据的,而后面的的 rook-ceph-mgr-dashboard 服务就是我们的 Dashboard 服务,如果在集群内部我们可以通过 DNS 名称 http://rook-ceph-mgr-dashboard.rook-ceph:7000 或者 CluterIP http://10.104.133.172:7000 来进行访问,如果想要外部访问的话,则使用kubectl edit svc -n rook-ceph rook-ceph-mgr-dashboard将TYPE修改为NodePort即可。
这时就可以使用 http://<NodeIp>:30024 就可以访问到 Dashboard 了。但是在访问的时候需要我们登录才能够访问,Rook 创建了一个默认的用户 admin,并在运行 Rook 的命名空间中生成了一个名为 rook-ceph-dashboard-admin-password 的 Secret,要获取密码,可以运行以下命令:
1 | [root@master ~]# kubectl -n rook-ceph get secret rook-ceph-dashboard-password -o jsonpath="{['data']['password']}" | base64 --decode && echo |
Rook工具箱安装
要验证集群是否处于正常状态,我们可以使用 Rook 工具箱 来运行 ceph status 命令查看。
Rook 工具箱是一个用于调试和测试 Rook 的常用工具容器,该工具基于 CentOS 镜像,所以可以使用 yum 来轻松安装更多的工具包。 我们这里用 Deployment 控制器来部署 Rook 工具箱,kubectl create -f toolbox.yaml;
一旦 toolbox 的 Pod 运行成功后,我们就可以使用下面的命令进入到工具箱内部进行操作:
1 | kubectl -n rook-ceph exec -it $(kubectl -n rook-ceph get pod -l "app=rook-ceph-tools" -o jsonpath='{.items[0].metadata.name}') bash |
工具箱中的所有可用工具命令均已准备就绪,可满足您的故障排除需求。例如:
1 | ceph status |
比如现在我们要查看集群的状态,需要满足下面的条件才认为是健康的:
- 所有 mons 应该达到法定数量
- mgr 应该是激活状态
- 至少有一个 OSD 处于激活状态
- 如果不是 HEALTH_OK 状态,则应该查看告警或者错误信息
以下为实操部分:
1 | [root@master Rook]# kubectl -n rook-ceph exec -it $(kubectl -n rook-ceph get pod -l "app=rook-ceph-tools" -o jsonpath='{.items[0].metadata.name}') bash |
ceph的挂载方法
创建完ceph集群之后,那我们要如何使用呢?
块设备
如果需要挂载ceph的分区,首先需要创建一个POD:kubectl create -f direct-mount.yaml,完成之后,查看且进入POD:
1 | [root@master ~]# kubectl -n rook-ceph get pod -l app=rook-direct-mount |
进入之后,创建一个10MB的RBD:
1 | [root@master /]# rbd create replicapool/test --size 10 |
使用lsblk 就可以看到创建出来的块设备了。这个就可以理解为普通的磁盘分区,我们可以直接格式化且挂载他:
1 | [root@master /]# mkfs.ext4 -m0 /dev/rbd1 |
这样就像使用本地磁盘一样了。
其他的使用方法见:https://rook.io/docs/rook/v1.2/direct-tools.html
实例:wordpress
我们建一个wordpress+mysql+StorageClass的例子,参考了官网的例子:https://rook.io/docs/rook/v1.2/ceph-block.html
1 | apiVersion: ceph.rook.io/v1 |
将上述yaml保存为storageclass.yaml,然后 kubectl create -f storageclass.yaml,再查看创建好的资源:
1 | [root@master Rook]# kubectl -n rook-ceph get cephblockpools.ceph.rook.io |
下载相关的资料:
1 | wget https://raw.githubusercontent.com/rook/rook/release-1.2/cluster/examples/kubernetes/mysql.yaml |
创建成功之后,查看PVC已经成功绑定了2个了。
1 | [root@master ~]# kubectl get pvc |
使用 lsblk |grep rbd 可以看到有一块rbd是挂载在master上面的,也可以看到具体的文件内容,那为什么可看到呢?这是因为wp的pod是运行在master上面。
最后清理掉测试的文件:
1 | kubectl delete -f wordpress.yaml |
参考链接
https://rook.io/docs/rook/v1.2/ceph-quickstart.html