背景

  我们通过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问题定位的更多相关文章

  1. 在CentOS上为Docker开启SELinux

    a { color: #4183C4; text-decoration: none } a:hover { text-decoration: underline } ul,ol { padding-l ...

  2. docker创建ceph集群

    背景 Ceph官方现在提供两类镜像来创建集群,一种是常规的,每一种Ceph组件是单独的一个镜像,如ceph/daemon.ceph/radosgw.ceph/mon.ceph/osd等:另外一种是最新 ...

  3. 在 CentOS 7.0 上安装配置 Ceph 存储

    来自: https://linux.cn/article-6624-1.html Ceph 是一个将数据存储在单一分布式计算机集群上的开源软件平台.当你计划构建一个云时,你首先需要决定如何实现你的存储 ...

  4. 理解 OpenStack + Ceph (3):Ceph RBD 接口和工具 [Ceph RBD API and Tools]

    本系列文章会深入研究 Ceph 以及 Ceph 和 OpenStack 的集成: (1)安装和部署 (2)Ceph RBD 接口和工具 (3)Ceph 物理和逻辑结构 (4)Ceph 的基础数据结构 ...

  5. Ceph RBD CephFS 存储

    Ceph RBD  CephFS 存储 环境准备: (这里只做基础测试, ceph-manager , ceph-mon, ceph-osd 一共三台) 10.6.0.140 = ceph-manag ...

  6. CentOS7 下安装 iSCSI Target(tgt) ,使用 Ceph rbd

    目录 一.iSCSI 介绍 1. iSCSI 定义 2. 几种常见的 iSCSI Target 3. 优缺点比较 二.安装步骤 1. 关闭防火墙 2. 关闭selinux 3. 通过 yum 安装 t ...

  7. kubernetes挂载ceph rbd和cephfs的方法

    目录 k8s挂载Ceph RBD PV & PVC方式 创建secret 创建PV 创建PVC 创建deployment挂载PVC StorageClass方式 创建secret 创建Stor ...

  8. 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. ...

  9. Kubernetes配置Ceph RBD StorageClass

    1. 在Ceph上为Kubernetes创建一个存储池 # ceph osd pool create k8s 2. 创建k8s用户 # ceph auth get-or-create client.k ...

随机推荐

  1. ES6 let和const命令(2)

    为什么要使用块级作用域 在ES5中只有全局作用域和函数作用域,没有块级作用域,因此带来了这些麻烦 内层变量可能会覆盖外层变量 var tmp = new Date(); console.log(tmp ...

  2. redis资料收集

    http://www.runoob.com/redis/redis-sets.html  redis set 使用 https://www.cnblogs.com/wanzaixiaoxin/p/49 ...

  3. .net 框架

    目录 API 应用框架(Application Frameworks) 应用模板(Application Templates) 人工智能(Artificial Intelligence) 程序集处理( ...

  4. PHP拓展配置redis、phalcon

    PHPinfo查看php信息 标记部分对应下载版本ts和nts和vc版本 window x64 php7.0-ts-vc14拓展地址,下载相应的dll就行https://pecl.php.net/pa ...

  5. 深入设计电子计算器(一)——CPU指令集设计

    版权申明:本文为博主窗户(Colin Cai)原创,欢迎转帖.如要转贴,必须注明原文网址 http://www.cnblogs.com/Colin-Cai/p/8254096.html 作者:窗户 Q ...

  6. centos设置程序开机自启或禁止加载

    1. 可以直接把需要启动的脚本写到/etc/rc.d/rc.local文件里,例如 vim /etc/rc.d/rc.local /usr/local/apache/bin/apachectl sta ...

  7. Django-环境搭建

    django开发环境搭建 环境说明 python django mysql pymysql pycharm 安装过程 安装python3.6.3 64位下载地址: https://www.python ...

  8. pycharm中进行带参数的调试

    之前基本都是用print进行调试的,但今天程序运行完需要等很长时间,就尝试pycharm调试. 但是在运行程序需要传递参数,之前只会点击bug按钮直接运行程序,不知道调试的时候传入参数. 运行---& ...

  9. VFS四大对象之二 struct inode

    继上一篇文章:http://www.cnblogs.com/linhaostudy/p/7427027.html 二.inode结构体:(转自http://blog.csdn.net/shanshan ...

  10. .NET Core:使用ImageSharp跨平台处理图像

    一.简述 ImageSharp是一个新的跨平台2D图形API,旨在处理图像而不使用System.Drawing. 二.安装 目前ImageSharp还是处于alpha版本,所以我们需要在nuget中添 ...