Ceph-iSCSI-Cli会安装一个类似于targetcli的接口,它允许基于一个接口管理多个Ceph/iSCSI网关。Cli基于rbd-target-gw公开的API接口实现,每个节点上都会运行rbd-target-gw守护进程,并且支持Cli接口。
下面是gwcli工具提供的shell接口的示例:
/> ls
o- / .................................................................................. [...]
o- clusters ................................................................. [Clusters: 1]
| o- ceph ..................................................................... [HEALTH_OK]
| o- pools ................................................................... [Pools: 3]
| | o- ec ........................................ [(2+1), Commit: 0b/40G (0%), Used: 0b]
| | o- iscsi ..................................... [(x3), Commit: 0b/20G (0%), Used: 18b]
| | o- rbd ....................................... [(x3), Commit: 8G/20G (40%), Used: 5K]
| o- topology ......................................................... [OSDs: 3,MONs: 3]
o- disks ................................................................... [8G, Disks: 5]
| o- rbd.disk_1 ............................................................. [disk_1 (1G)]
| o- rbd.disk_2 ............................................................. [disk_2 (2G)]
| o- rbd.disk_3 ............................................................. [disk_3 (2G)]
| o- rbd.disk_4 ............................................................. [disk_4 (1G)]
| o- rbd.disk_5 ............................................................. [disk_5 (2G)]
o- iscsi-target .............................................................. [Targets: 1]
o- iqn.2003-01.com.redhat.iscsi-gw:ceph-gw ................................ [Gateways: 2]
o- gateways ..................................................... [Up: 2/2, Portals: 2]
| o- rh7-gw1 .................................................... [192.168.122.69 (UP)]
| o- rh7-gw2 ................................................... [192.168.122.104 (UP)]
o- hosts ................................................................... [Hosts: 2]
o- iqn.1994-05.com.redhat:myhost1 ........................ [Auth: None, Disks: 1(1G)]
| o- lun 0 ......................................... [rbd.disk_1(1G), Owner: rh7-gw2]
o- iqn.1994-05.com.redhat:rh7-client .......... [LOGGED-IN, Auth: CHAP, Disks: 1(2G)]
o- lun 0 ......................................... [rbd.disk_5(2G), Owner: rh7-gw2]
rbd-target-api守护进程利用Flask来提供REST API。rbd-target-api通常不会使用在生产环境中,但是考虑到这个特定的用例,它提供了一种提供管理界面的简单方法--至少在第一个版本中是这样的!
Rest API已经在Firefox 的RESTClient插件中使用https进行了测试(基于一个通用的自签名证书):在每个网关上设置证书,添加基本的auth凭据,以匹配RESTClient中的本地API配置。按如下方式使用该客户端:
Add aHeader content type for application/x-www-form-urlencoded
METHOD:PUT URL: https://192.168.122.69:5001/api/gateway/rh7-gw1
selectthe urlencoded content type and the basic auth credentials
add therequired variables to the body section in the client ui
eg. ip_address=192.168.122.69
Click'SEND'
Curl示例:
如果只是后端开发工作(不负责UI开发),可以使用CURL:创建一个网关节点
curl--insecure --user admin:admin -d "ip_address=192.168.122.104" \
-X PUT https://192.168.122.69:5001/api/gateway/rh7-gw2
1 目录组织
ceph-iscsi-cli的文件组织结构如下:
2 工具与接口解析
2.1 工具gwcli
Ceph-iSCSI网关的命令行管理程序gwcli,其结构如下:
逻辑流程如下:
2.2 API接口(rbd-target-api.py)
Ceph-iSCSI网关的RestFUL API。列表如下:
对象 | 类型 | 说明 |
api_info | GET | 获取支持的API信息 |
sys_info | GET | 获取指定类型的系统信息:ipv4_addresses, checkconf, checkversions |
target | PUT | 配置中添加target,同步各网关节点 |
config | GET | 获取配置信息 |
gateways | GET | 获取网络列表 |
gateway | PUT | 新增网关节点 |
_gateway | GET/PUT/DELETE | 本地网关管理 |
disks | GET | 获取定义给网关的RBD列表 |
disk | GET/PUT/DELETE | RBD管理(each gateway) |
_disk | GET/PUT/DELETE | RBD管理(local gateway),内部使用 |
clients | GET | 获取客户端iqn列表 |
clientauth | PUT | 新增客户端CHAP(each gateway) |
_clientauth | PUT | 新增客户端授权(local gateway),内部使用 |
clientlun | PUT/DELETE | Iscsi lun管理 |
_clientlun | GET/PUT | 在本地网关lun的列表和新增 |
client | PUT/DELETE | 客户端IQN的新增和删除(each gateway) |
_client | GET/PUT/DELETE | 客户端IQN的管理(local gateway) ,内部使用 |
hostgroups | GET | 获取配置中定义的主机组 |
hostgroup | GET/PUT/DELETE | 主机组的管理(each gateway) |
_hostgroup | GET/PUT/DELETE | 主机组的管理(local gateway) ,内部使用 |
iscsi_active | GET | 判断iscsi网关是否active |
3 Gwcli库分析
3.1 utils.py
utils.py定义了一些通用函数,支持其他类的实现,其结构如下:
3.2 node.py
node.py定义了一些UI显示函数,支持其他类的实现,其结构如下:
3.3 ceph.py
实现与ceph集群的对接,其结构如下:
3.4 hostgroup.py
实现主机组管理,其结构如下:
HostGroups
提供了一种更方便的方法来管理需要访问同一组LUN的多个主机。主机组“策略”定义了应该关联在一起的客户机和LUN(rbd映像)。
有两个命令用于管理主机组
create <group_name>
delete <group_name>
由于相同的磁盘将被多个系统看到,所以应该只对集群感知的主机使用此功能。如果不遵守此约束,则可能导致**数据丢失**。
一旦创建了一个组,您就可以将客户端与组的“主机”、和“磁盘”相关联。
注意,一个客户端只能属于一个主机组,但磁盘可以跨几个主机组。
hostgroup
主机组提供了一种简单的方法,可以将许多iSCSI客户端的LUN作为一个单元来管理。主机组包含主机(iSCSI客户端)和磁盘(rbd映像)。
一旦一个主机被定义为一个组,它的LUN (masking)必须通过这个组来管理。实际上,直接管理客户端磁盘的尝试会被阻止。
以下命令使您能够管理主机组的成员资格。
host add|remove iqn.1994-05.com.redhat:rh7-client
disk add|remove rbd.disk_1
HostGroupMember
显示了在特定主机组定义中保存的主机和磁盘。在从主机组中删除磁盘时应注意,因为删除操作将在组内的每个客户端执行。
3.5 client.py
实现客户端的管理,其结构如下:
3.6 storage.py
实现rbd镜像的管理,其结构如下:
3.7 gateway.py
实现网关的管理,其结构如下:
4 UML类图关系
5 参考文献
[01] https://github.com/ceph/ceph-iscsi-cli
[02] http://docs.ceph.com/docs/master/rbd/iscsi-target-cli/
本作品采用知识共享署名-非商业性使用-相同方式共享 3.0 未本地化版本许可协议进行许可。