rexray在CentOS上不能创建ceph rbd的docker volume问题定位
背景
我们通过docker的rexray插件来创建ceph rbd设备的docker volume,但总提示创建失败。
# docker volume create --driver=rexray --opt=size=5 --name=cephrbd-book
Error response from daemon: create test_cephrbd_volume: VolumeDriver.Create: {"Error":"Failed to create new volume"}
OS版本:
# lsb_release -a
LSB Version: :core-4.1-amd64:core-4.1-noarch
Distributor ID: CentOS
Description: CentOS Linux release 7.4.1708 (Core)
Release: 7.4.1708
Codename: Core
Ceph版本:
# ceph version
ceph version 0.94.5
rexray版本:
# rexray version
REX-Ray
-------
Binary: /usr/bin/rexray
Flavor: client+agent+controller
SemVer: 0.9.0
OsArch: Linux-x86_64
Branch: (detached from 2a7458d
Commit: 2a7458dd90a79c673463e14094377baf9fc8695e
Formed: Wed, 26 Jul 2017 14:35:37 CST
libStorage
----------
SemVer: 0.6.0
OsArch: Linux-x86_64
Branch: (detached from fa055d6
Commit: fa055d6da595602715bdfd5541b4aa6d4dcbcbd9
Formed: Wed, 26 Jul 2017 14:35:11 CST
分析
之前我们在ubuntu 16.04的环境中,也搭建过docker+ceph+rexray的环境,使用docker命令创建volume并没有报错。正常的流程是:
1. 创建docker volume:rexray会使用rbd create命令创建一个rbd设备;
2. 使用该volume创建docker 容器:rexray会将rbd 设备map到docker host上成为一个/dev/rbd设备,再使用mount命令将/dev/rbd设备挂载到/var/lib/libstorage/volumes/目录,供容器使用;
3. 删除该容器时:先umount掉/dev/rbd设备在/var/lib/libstorage/volumes/目录的挂载,再rbd unmap掉rbd设备在docker host上的映射;
4. 删除docker volume:rexray会使用rbd rm命令删除该rbd设备;
在我们的实际使用情况中,发现只有第一步会出错,后面的三步都并未出现任何异常。而且,如果我们不使用docker volume create命令创建rbd设备,而是直接使用“rbd create”命令来创建rbd设备,也并未出现任何错误,且该rbd设备也可以正常使用。这是很奇怪的一个地方。
查看docker日志,也只是提示“Failed to create new volume”,并没有其他有用的信息。
# journalctl -xu docker
...
Jan 22 10:45:13 dcos-agent2 dockerd[66886]: time="2018-01-22T10:45:13.937645601+08:00" level=error msg="Handler for POST /v1.29/volumes/create returned error: create cephrbd-book: VolumeDri
ver.Create: {\"Error\":\"Failed to create new volume\"}\n"
既然docker中没有更有价值的日志,那么就尝试看下rexray的日志,这里需要打开rexray的debug选项(打开方法参考),从而可以看到更多的日志。
# vim /var/log/rexray/rexray.log
...
time="2018-01-19T19:12:32+08:00" level=info msg=" -------------------------- HTTP REQUEST (CLIENT) -------------------------"
time="2018-01-19T19:12:32+08:00" level=info msg=" GET /volumes/rbd?attachments=0 HTTP/1.1"
time="2018-01-19T19:12:32+08:00" level=info msg=" Host: libstorage-server"
time="2018-01-19T19:12:32+08:00" level=info msg=" Libstorage-Instanceid: rbd=109.105.115.73"
time="2018-01-19T19:12:32+08:00" level=info msg=" Libstorage-Localdevices: rbd="
time="2018-01-19T19:12:32+08:00" level=info msg=" Libstorage-Tx: txID=b9fb044b-d47a-4ac5-7533-5824b8dc737a, txCR=1516360352"
time="2018-01-19T19:12:32+08:00" level=info msg=" "
time="2018-01-19T19:12:33+08:00" level=info
time="2018-01-19T19:12:33+08:00" level=info msg=" -------------------------- HTTP RESPONSE (CLIENT) -------------------------"
time="2018-01-19T19:12:33+08:00" level=info msg=" HTTP/1.1 200 OK"
time="2018-01-19T19:12:33+08:00" level=info msg=" Content-Length: 228"
time="2018-01-19T19:12:33+08:00" level=info msg=" Content-Type: application/json"
time="2018-01-19T19:12:33+08:00" level=info msg=" Date: Fri, 19 Jan 2018 11:12:33 GMT"
time="2018-01-19T19:12:33+08:00" level=info msg=" Libstorage-Servername: jade-chopper-ky"
time="2018-01-19T19:12:33+08:00" level=info msg=" "
time="2018-01-19T19:12:33+08:00" level=info msg=" {"
time="2018-01-19T19:12:33+08:00" level=info msg=" \"rbd.test_fs_device2\": {"
time="2018-01-19T19:12:33+08:00" level=info msg=" \"name\": \"test_fs_device2\","
time="2018-01-19T19:12:33+08:00" level=info msg=" \"size\": 16,"
time="2018-01-19T19:12:33+08:00" level=info msg=" \"id\": \"rbd.test_fs_device2\","
time="2018-01-19T19:12:33+08:00" level=info msg=" \"type\": \"rbd\""
time="2018-01-19T19:12:33+08:00" level=info msg=" },"
time="2018-01-19T19:12:33+08:00" level=info msg=" \"rbd.test_majk\": {"
time="2018-01-19T19:12:33+08:00" level=info msg=" \"name\": \"test_majk\","
time="2018-01-19T19:12:33+08:00" level=info msg=" \"id\": \"rbd.test_majk\","
time="2018-01-19T19:12:33+08:00" level=info msg=" \"type\": \"rbd\""
time="2018-01-19T19:12:33+08:00" level=info msg=" }"
time="2018-01-19T19:12:33+08:00" level=info msg=" }"
time="2018-01-19T19:12:33+08:00" level=info
time="2018-01-19T19:12:33+08:00" level=info msg=" -------------------------- HTTP REQUEST (CLIENT) -------------------------"
time="2018-01-19T19:12:33+08:00" level=info msg=" POST /volumes/rbd HTTP/1.1"
time="2018-01-19T19:12:33+08:00" level=info msg=" Host: libstorage-server"
time="2018-01-19T19:12:33+08:00" level=info msg=" Libstorage-Instanceid: rbd=109.105.115.73"
time="2018-01-19T19:12:33+08:00" level=info msg=" Libstorage-Localdevices: rbd="
time="2018-01-19T19:12:33+08:00" level=info msg=" Libstorage-Tx: txID=b1565614-1b5f-4de2-5756-b74fb99887aa, txCR=1516360353"
time="2018-01-19T19:12:33+08:00" level=info msg=" "
time="2018-01-19T19:12:33+08:00" level=info msg=" {\"name\":\"cephrbd-book\",\"availabilityZone\":\"\",\"iops\":0,\"size\":5,\"type\":\"\",\"opts\":{\"size\":\"5\"}}"
time="2018-01-19T19:12:33+08:00" level=info
time="2018-01-19T19:12:33+08:00" level=info msg=" -------------------------- HTTP RESPONSE (CLIENT) -------------------------"
time="2018-01-19T19:12:33+08:00" level=info msg=" HTTP/1.1 500 Internal Server Error"
time="2018-01-19T19:12:33+08:00" level=info msg=" Content-Length: 319"
time="2018-01-19T19:12:33+08:00" level=info msg=" Content-Type: application/json"
time="2018-01-19T19:12:33+08:00" level=info msg=" Date: Fri, 19 Jan 2018 11:12:33 GMT"
time="2018-01-19T19:12:33+08:00" level=info msg=" Libstorage-Servername: jade-chopper-ky"
time="2018-01-19T19:12:33+08:00" level=info msg=" "
time="2018-01-19T19:12:33+08:00" level=info msg=" {"
time="2018-01-19T19:12:33+08:00" level=info msg=" \"message\": \"Failed to create new volume\","
time="2018-01-19T19:12:33+08:00" level=info msg=" \"status\": 500,"
time="2018-01-19T19:12:33+08:00" level=info msg=" \"error\": {"
time="2018-01-19T19:12:33+08:00" level=info msg=" \"driverName\": \"rbd\","
time="2018-01-19T19:12:33+08:00" level=info msg=" \"inner\": {"
time="2018-01-19T19:12:33+08:00" level=info msg=" \"inner\": \"Error running command: [rbd: strict_strtoll: garbage at end of string. got: '5G'\\n]\","
time="2018-01-19T19:12:33+08:00" level=info msg=" \"msg\": \"unable to create rbd\""
time="2018-01-19T19:12:33+08:00" level=info msg=" },"
time="2018-01-19T19:12:33+08:00" level=info msg=" \"opts.Size\": 5,"
time="2018-01-19T19:12:33+08:00" level=info msg=" \"volumeName\": \"cephrbd-book\""
time="2018-01-19T19:12:33+08:00" level=info msg=" }"
time="2018-01-19T19:12:33+08:00" level=info msg=" }"
通过日志可以看到,每次发送docker volume create命令时,实际发送了两次http请求,第一次是列出当前的rbd设备,第二次才是发出post请求来创建一个rbd设备。而这里的日志,则给出了更多的信息“rbd: strict_strtoll: garbage at end of string. got: '5G'”。也就是说,很可能就是在rexray调用rbd create命令时发生了错误。这里,我们打开rexray源码继续跟踪,具体的源码文件为rexray/blob/master/libstorage/drivers/storage/rbd/utils/utils.go。
//RBDCreate creates a new RBD volume on the cluster
func RBDCreate(
ctx types.Context,
pool *string,
image *string,
sizeGB *int64,
objectSize *string,
features []*string) error {
cmd := exec.Command(
rbdCmd, "create", poolOpt, *pool,
"--object-size", *objectSize,
"--size", strconv.FormatInt(*sizeGB, 10)+"G",
)
for _, feature := range features {
cmd.Args = append(cmd.Args, "--image-feature")
cmd.Args = append(cmd.Args, *feature)
}
cmd.Args = append(cmd.Args, *image)
_, _, err := RunCommand(ctx, cmd)
if err != nil {
return goof.WithError("unable to create rbd", err)
}
return nil
}
根据上面的代码可以大致看出,rexray就是直接调用rbd create命令来创建rbd设备,和我们直接调用命令不同的是它这里是把rbd的大小转化成GB,然后再字符串拼接了一个“G”。这里我们就按照它这里的方法,组装了一个新的rbd命令,然后在CentOS上测试:
# rbd create cephrbd-test --size 5G
rbd: strict_strtoll: garbage at end of string. got: '5G'
果然,还是报错了,我们再使用该命令在ubuntu上测试:
# rbd create cephrbd-test --size 5G
在ubuntu上运行,没有报错。同一条命令,在不同的环境下结果不同。那么最大的可能就是rbd(ceph)的版本不一致了。在ubuntu下获取ceph版本。
# ceph version
ceph version 10.2.7
而CentOS上默认安装的ceph版本只是0.94.5(Hammer版),而Ubuntu上默认安装的却是更高的10.2.7(jewel版本)。而0.94.5 ceph版本的rbd命令无法解析“G”,“M”等描述rbd大小的参数。这就是问题出现的原因。
解决方法
在CentOS上安装更新的Ceph版本(jewel或更新的版本)即可。
ps:后面的博客会介绍如何在CentOS上安装更新的Ceph版本。
rexray在CentOS上不能创建ceph rbd的docker volume问题定位的更多相关文章
- 在CentOS上为Docker开启SELinux
a { color: #4183C4; text-decoration: none } a:hover { text-decoration: underline } ul,ol { padding-l ...
- docker创建ceph集群
背景 Ceph官方现在提供两类镜像来创建集群,一种是常规的,每一种Ceph组件是单独的一个镜像,如ceph/daemon.ceph/radosgw.ceph/mon.ceph/osd等:另外一种是最新 ...
- 在 CentOS 7.0 上安装配置 Ceph 存储
来自: https://linux.cn/article-6624-1.html Ceph 是一个将数据存储在单一分布式计算机集群上的开源软件平台.当你计划构建一个云时,你首先需要决定如何实现你的存储 ...
- 理解 OpenStack + Ceph (3):Ceph RBD 接口和工具 [Ceph RBD API and Tools]
本系列文章会深入研究 Ceph 以及 Ceph 和 OpenStack 的集成: (1)安装和部署 (2)Ceph RBD 接口和工具 (3)Ceph 物理和逻辑结构 (4)Ceph 的基础数据结构 ...
- Ceph RBD CephFS 存储
Ceph RBD CephFS 存储 环境准备: (这里只做基础测试, ceph-manager , ceph-mon, ceph-osd 一共三台) 10.6.0.140 = ceph-manag ...
- CentOS7 下安装 iSCSI Target(tgt) ,使用 Ceph rbd
目录 一.iSCSI 介绍 1. iSCSI 定义 2. 几种常见的 iSCSI Target 3. 优缺点比较 二.安装步骤 1. 关闭防火墙 2. 关闭selinux 3. 通过 yum 安装 t ...
- kubernetes挂载ceph rbd和cephfs的方法
目录 k8s挂载Ceph RBD PV & PVC方式 创建secret 创建PV 创建PVC 创建deployment挂载PVC StorageClass方式 创建secret 创建Stor ...
- CentOS 6.8安装Ceph
机器规划 IP 主机名 角色 10.101.0.1 ceph01 mon admin mds 10.101.0.2 ceph02 ods 10.101.0.3 ceph03 ods 10.101.0. ...
- Kubernetes配置Ceph RBD StorageClass
1. 在Ceph上为Kubernetes创建一个存储池 # ceph osd pool create k8s 2. 创建k8s用户 # ceph auth get-or-create client.k ...
随机推荐
- nova创建虚拟机源码分析系列之四 nova代码模拟
在前面的三篇博文中,介绍了restful和SWGI的实现.结合restful和WSGI配置就能够简单的实现nova服务模型的最简单的操作. 如下的内容是借鉴网上博文,因为写的很巧妙,将nova管理虚拟 ...
- lesson - 6 Linux下磁盘管理
1. 查看磁盘或者目录的容量df 查看磁盘各分区使用情况 不加参数以k为单位 df -i inode数,df -h 以G或者T或者M df -m 以M单位显示 du 查看目录或者文 ...
- dubbo源码—service export
在应用编写好服务并进行之后,dubbo负责将服务export出去,dubbo export服务的时候主要做了以下几件事: 将服务export到本地(根据scope的配置) 创建Invoker(启动本地 ...
- Use Zabbix Monitor Find ‘DBCC CheckDB’ Problem
下面是修改前后的对比截图: 如下图: 下图是确定问题并修改后对比图,左边圈是修改前,右边圈是修改后对比截图:当看到周期性的性能指数,一般是计划性任务引起:通过DMV视图,找到引起等待的原因检查数据库完 ...
- mysql如何执行关联查询与优化
mysql如何执行关联查询与优化 一.前言 在数据库中执行查询(select)在我们工作中是非常常见的,工作中离不开CRUD,在执行查询(select)时,多表关联也非常常见,我们用的也比较多,那么m ...
- eclipse常用快捷设置
1.代码自动提示 在我们忘记方法名或者想偷懒时,代码自动提示很管用.不过Eclipse默认是输入"."后才会出现包或类成员的提示,也就意味着我们必须先输入一个完整的类名,提示才能出 ...
- 微信小程序实现简易留言板
微信小程序现在很火,于是也就玩玩,做了一个简易的留言板,让大家看看,你们会说no picture you say a j8 a,好吧先上图. 样子就是的,功能一目了然,下面我们就贴实现的代码,首先是H ...
- mysql之数据操作
一 介绍 MySQL数据操作: DML 在MySQL管理软件中,可以通过SQL语句中的DML语言来实现数据的操作,包括 使用INSERT实现数据的插入 UPDATE实现数据的更新 使用DELETE实现 ...
- 局域网中间人:MITMf使用
系统环境:kali 安装流程参考github官方地址:https://github.com/byt3bl33d3r/MITMf/wiki/Installation 安装相关依赖: apt--dev l ...
- 在树莓派上编译安装golang环境
请看我在掘金的文章