| Rook版本 | Ceph版本 | K8S版本 |
|---|---|---|
| Rook Ceph v1.8 | Ceph Pacific v16.2.7 stable | kubernetes v1.20.4 |
1 Rook介绍#
- Rook是一个自管理的分布式存储编排系统,可以为Kubernetes提供便利的存储解决方案,Rook本身并不提供存储,而是在Kubernetes和存储之间
- 提供适配层,简化存储系统的部署和维护工作。目前,主要支持存储系统包括但不限于Ceph(主推)、Cassandra、NFS。
- Rook复用了k8s集群节点用于自动化部署Ceph集群,优点是部署Ceph集群方便,缺点是如果Ceph集群出现故障,很难排查错误,我个人还是倾向于
- 使用独立的Ceph集群为k8s提供存储服务。
-
- 官网: https://rook.io
- 项目地址: https://github.com/rook
2 Rook架构图#
官方文档: https://rook.io/docs/rook/v1.8/ceph-storage.html
https://rook.io/docs/rook/v1.8/ceph-storage.html

3 Rook在Kubernetes中部署Ceph#
官方文档: Ceph Docs
(1) 先决条件
- 1) K8s集群,1.16版本+
- 2) K8s至少3个工作节点
- 3) 每个工作节点有一块未使用的硬盘
- 4) Rook仅支持部署Ceph Nautilus(14.2.22)以上版本
-
- 注:
- 我这里k8s集群有4个节点,分别是k8s-master1、k8s-master2、k8s-node1、k8s-node2,四个节点各挂载一块20GB的未使用的
- 硬盘作为osd提供存储服务。k8s-master2节点需要去污点,允许pod调度,命令如下。
- # kubectl taint node k8s-master2 node-role.kubernetes.io/master-
(2) 部署Ceph集群
- 1) 下载包并解压
- [root@k8s-master1 ~]# wget https://github.com/rook/rook/archive/refs/tags/v1.8.0.zip
- [root@k8s-master1 ~]# unzip v1.8.0.zip
- [root@k8s-master1 ~]# cd rook-1.8.0/deploy/examples/
-
- 2) 部署所用到的镜像如下
- [root@k8s-master1 examples]# cat images.txt
- k8s.gcr.io/sig-storage/csi-attacher:v3.3.0
- k8s.gcr.io/sig-storage/csi-node-driver-registrar:v2.3.0
- k8s.gcr.io/sig-storage/csi-provisioner:v3.0.0
- k8s.gcr.io/sig-storage/csi-resizer:v1.3.0
- k8s.gcr.io/sig-storage/csi-snapshotter:v4.2.0
- quay.io/ceph/ceph:v16.2.7
- quay.io/cephcsi/cephcsi:v3.4.0
- quay.io/csiaddons/volumereplication-operator:v0.1.0
- rook/ceph:v1.8.0
-
- 注:
- 由于以上镜像的镜像源在国外,国内无法下载,前五个镜像源我修改为阿里官方同步国外的镜像源
- (registry.aliyuncs.com/google_containers/
:),后四个镜像我FQ下 - 载后上传到阿里个人账号的镜像仓库下了(registry.cn-hangzhou.aliyuncs.com/rook_image/
:)。 -
- # grep <镜像名> crds.yaml common.yaml operator.yaml cluster.yaml toolbox.yaml dashboard-external-https.yaml

- 3) 应用yaml文件
- [root@k8s-master1 examples]# kubectl create -f crds.yaml -f common.yaml -f operator.yaml
-
- # 开始部署集群,有些镜像比较大(大于1G),pod完全启动大概1个小时左右
- [root@k8s-master1 examples]# kubectl create -f cluster.yaml
(3) 部署Rook Ceph 工具
[root@k8s-master1 examples]# kubectl create -f toolbox.yaml
(4) 部署Ceph Dashboard
- [root@k8s-master1 examples]# kubectl apply -f dashboard-external-https.yaml
-
- # 获取 dashboard admin密码
- [root@k8s-master1 examples]# kubectl -n rook-ceph get secret rook-ceph-dashboard-password -o \
- jsonpath="{['data']['password']}" | base64 -d
- 输出 admin 用户的密码为: *Pfl:f_6FDSLZVO)*-,7
(5) 查看pod、svc
- [root@k8s-master1 examples]# kubectl get pod -o wide -n rook-ceph
- [root@k8s-master1 examples]# kubectl get svc -n rook-ceph

(6) 通过ceph-tool工具pod查看ceph集群状态
[root@k8s-master1 examples]# kubectl exec -it pod/rook-ceph-tools-6979f5784f-84jpw -n rook-ceph -- bash

4 通过Ceph Dashboard查看Ceph集群状态#
- 从svc状态中可以看到dashboard的svc类型为NodePort,对外暴露的端口为30493
- https://
:30493/ 为172.16.1.81、82、83、84
(1) 登录界面

(2) 集群状态UI

(3) 主机UI

(4) pool UI

5 测试#
(1) RBD测试
- [root@k8s-master1 examples]# kubectl apply -f csi/rbd/storageclass.yaml # 创建一个名为replicapool的rbd pool
- [root@k8s-master1 examples]# kubectl get sc
- NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
- rook-ceph-block rook-ceph.rbd.csi.ceph.com Delete Immediate true 12m
-
- [root@k8s-master1 examples]# kubectl apply -f mysql.yaml # 在default命名空间下
- [root@k8s-master1 examples]# kubectl apply -f wordpress.yaml # 在default命名空间下
- [root@k8s-master1 examples]# kubectl get pv,pvc -n default
- [root@k8s-master1 examples]# kubectl get pod,svc -n default
(2) CephFS测试
- [root@k8s-master1 examples]# kubectl apply -f filesystem.yaml
- [root@k8s-master1 examples]# kubectl apply -f csi/cephfs/storageclass.yaml
6 总结#
- 通过rook复用k8s节点部署的ceph集群虽然部署方便,但是由于rook部署ceph时全程自动化且服务全部为pod导致后期维护ceph集群比较困难,我个人
- 并不建议在生产环境中使用rook部署ceph集群,生产中应独立部署ceph集群比较方便维护。还有一点是,当你重启k8s节点后,该节点上osd对应的磁盘
- ceph集群会识别不到,这可能是一个bug吧,社区应该后期还会再改进。