概述
在上一篇文章 中介绍了如何通过Rook在Kubernetes上部署Ceph集群,如何提供PV服务。
下面进一步的从Ceph集群的配置和维护角度,讲解下如何根据实际需求来部署、修改、升级Ceph集群。
下面实践基于Rook v0.8.0版本,最新的Rook v0.9.0版本相差不大。
Ceph OSD配置
默认通过cluster.yaml
创建Ceph集群时,使用的是filestore,并且使用的是/var/lib/rook/osd-<id>
目录,这明显不是我们通常的使用方式,下面介绍如何配置Ceph OSD使用bluestore和具体磁盘。
使用所有可用磁盘
如下,若我们配置具体节点上Ceph OSD使用所有可以使用的Devices,并且指定都使用bluestore的方式,则可以类似如下配置:
1 | ... |
使用指定磁盘
若指定具体节点使用的磁盘,storage的部分配置如下:
1 | storage: |
指定磁盘必须有GPT header!
不支持指定分区!(查看log,配置分区的信息并没有传递到ceph-osd-prepare这一步)
Ceph集群修改
在部署完Ceph集群后,若想修改Ceph集群的部署配置,比如增加/删除OSDs等,可以通过下面命令执行:
1 | # kubectl -n rook-ceph edit cluster rook-ceph |
根据需要修改后,直接保存退出即可;
遇到的问题
部署中出现问题后,可以通过下面方法查看log,分析原因:
- 查看
rook-ceph-operator
pod的log kubectl describe <pod>
查看pod的输出- 查看组件对应pod的log
ceph-mon状态一直不为running
遇到两种情况下会出现ceph-mon一直能为running的状态:
- 节点之前部署过ceph-mon pod,遗留的
/var/lib/rook/
下有数据,清除掉即可。 - 节点存储mon data的磁盘剩余空间不够,ceph-mon启动失败,清除节点对应磁盘空间即可。
配置osd指定磁盘无效
若cluster.yaml
的storage做如下配置时,并不能找到按照配置的设备来部署OSD:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17storage:
useAllNodes: false
useAllDevices: false
deviceFilter:
location:
config:
storeType: bluestore
nodes:
- name: "ke-dev1-worker1"
devices:
- name: "vde"
- name: "ke-dev1-worker3"
devices:
- name: "vde"
- name: "ke-dev1-worker4"
devices:
- name: "vdf"
查看rook-ceph-operator
pod的log,发现是识别了配置的vde/vdf
信息:
1 | # kubectl -n rook-ceph-systemm log rook-ceph-operator-5dc97f5c79-vq7xs |
查看ceph-osd-prepare
job的log:
1 | # kubectl -n rook-ceph get pods -a -o wide |
从log里找到了设备vde没有被识别的原因:invalid main GPT header
。
这个盘是新添加的,并没有创建GPT分区信息,手动给各个盘创建GPT header后,部署OSD正常!
扩展功能
记录下使用Rook部署Ceph系统的扩展功能需求。
如何配置分区?
Rook现在不支持配置OSD的devices为分区,代码中检测配置磁盘分区这块有待改善!
Operator discover检查
File: pkg/operator/ceph/cluster/osd/osd.go
1 | func (c *Cluster) startProvisioning(config *provisionConfig) { |
File: pkg/operator/discover/discover.go
1 | // GetAvailableDevices conducts outer join using input filters with free devices that a node has. It marks the devices from join result as in-use. |
ListDevices函数返回的disk格式如下:{Name:sdk ... Partitions:[{Name:sdk1 Size:4000785964544 Label: Filesystem:}] ...}
1 | // ListDevices lists all devices discovered on all nodes or specific node if node name is provided. |
OSD Daemon检查
当磁盘通过了Ceph Operator Discover的相关检查后,会通过参数传递给OSD Prepare Job,如下所示:
File:rook-ceph-osd-prepare-ceph0-bphlv-ceph0.log
1 | 2018-12-04 10:18:51.959163 I | rookcmd: starting Rook v0.8.0-320.g3135b1d with arguments '/rook/rook ceph osd provision' |
上述指定了--data-devices=sdk,sdl
。
File: pkg/daemon/ceph/osd/daemon.go
1 | func getAvailableDevices(context *clusterd.Context, desiredDevices string, metadataDevice string, usingDeviceFilter bool) (*DeviceOsdMapping, error) { |
所以现在通过任何方式无法配置Ceph OSD指定磁盘分区!
如何配置HDD+SSD的BlueStore?
配置节点OSD使用HDD+SSD的方式,可以修改cluster.yaml如下:
1 | storage: |
部署中可以通过获取ceph-osd-prepare的log来查看是否配置正确:
1 | # kubectl -n rook-ceph log rook-ceph-osd-prepare-ke-dev1-worker4-456nj provision |
如上述log,传进来的正确参数应该为:
- –data-devices=vdf,vdg
- –metadata-device=vdh
若要指定SSD提供的wal/db分区的大小,可以加如下配置:
1 | ... |
如何自定义ceph.conf?
默认创建Ceph集群的配置参数在Rook代码里是固定的,在创建Cluster
的时候生成Ceph集群的配置参数,参考上面章节的:Ceph默认配置
如果用户想自定义Ceph集群的配置参数,可以通过修改rook-config-override
的方法。
如下是默认的rook-config-override
:
1 | # kubectl -n rook-ceph get configmap rook-config-override -o yaml |
修改已有Ceph集群配置参数
1、修改rook-config-override
:
1 | # kubectl -n rook-ceph edit configmap rook-config-override -o yaml |
2、依次重启ceph组件
1 | # kubectl -n rook-ceph get pods |
ceph-mon, ceph-osd的delete最后是one-by-one的,等待ceph集群状态为HEALTH_OK后再delete另一个
3、检查ceph组件的配置
1 | # cat /var/lib/rook/osd2/rook-ceph.config |
创建Ceph集群前指定配置参数
若用户想在创建Ceph集群前指定配置参数,可以通过先手动创建名为:rook-config-override
的ConfigMap
,然后再创建Ceph集群。
1、创建ConfigMap后创建
1 | # cat ceph-override-conf.yaml |
2、检查启动的Ceph组件配置
1 | # cat /var/lib/rook/mon-a/rook-ceph.config |
如何自定义crush rule?
Rook没有提供kind为crush rule
的API,所以这里没法类似创建Pool那样创建一个crush rule
,crush rule
的定制化也比较多,可以通过CLI或者修改CRUSHMAP的方式操作。
如何升级Ceph集群?
如下,创建Ceph版本为v12的Cluster:
1 | # vim cluster.yaml |
创建后查看Ceph版本为:12.2.9
1 | [root@rook-ceph-mgr-a-558d49cf8c-dk49n /]# ceph -v |
通过edit来修改Cluster,指定image的Ceph版本为v13,如下:
1 | # kubectl -n rook-ceph edit cluster rook-ceph |
之后查看Ceph OSD组件会逐个删除重建,升级到指定的Ceph版本:
1 | # kubectl -n rook-ceph get pods -o wide |
升级过程中,会发现会自动设置上flag:noscrub,nodeep-scrub
1 | [root@ceph0 /]# ceph -s |
待所有的OSD升级完成后,集群状态为HEALTH_OK
,Ceph mgr,mon,mds组件不会自动升级:
1 | # kubectl -n rook-ceph get pods -o wide |
Rook V0.9.0版本里,mgr和mon会自动升级
之后单独升级Ceph的其他组件:
1 | # kubectl -n rook-ceph delete pod rook-ceph-mgr-a-558d49cf8c-dk49n |
但发现这些pod重启后,还是使用旧的Ceph版本!!!!
可以通过修改deployment的方法来升级Ceph mgr,mon,mds组件:
1 | # kubectl -n rook-ceph get deployment |
升级Ceph MDS组件时候要全部升级,不同Ceph版本的MDSs不能组成多Active MDSs集群
总结
Rook的定位
从Rook的官方文档中看出,它的定位是Kubernetes上的存储提供框架,提供基于Kubernetes的多种存储部署,比如:Ceph,Minio,CockroachDB,Cassandra,NFS等。
Ceph只是作为其第一个提供的beta版的存储方案。
Rook的优势
- 与Kubernetes集成,一键部署
- Rook支持通过yaml文件创建pool,cephfs,radosgw,监控等
- 简单扩容和小版本升级比较方便,kuberctl edit
即可
Rook的不足
- Rook项目时间还短,代码不够完善
- 不支持分区配置OSD,不能准确定制OSD的磁盘使用
- Rook可以一键删除Ceph pool / cephfs / radosgw和Ceph集群,没有确认,有些危险
- 基于容器化技术,Ceph的各个组件的IO栈又多了一层,性能会有所损耗
- Ceph运维增加了Kubernetes一层,对Ceph运维人员的知识栈要求又提高了
使用场景总结
所以总体来说如下:
适合使用Rook的场景
- POC环境,测试环境
- Kubernetes + Ceph混合部署环境
- 对Ceph性能没强要求环境
- 不需要经常随社区升级Ceph版本的环境
不适合使用Rook的场景
- Ceph集群单独部署环境
- Ceph性能强需求环境
- 跟随Ceph社区升级版本的环境