背景

  我们通过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. php date函数

    PHP星期几获取代码: 1 date("l"); 2 //data就可以获取英文的星期比如Sunday 3 date("w"); 4 //这个可以获取数字星期比 ...

  2. [编织消息框架][JAVA核心技术]动态代理应用11-水平扩展实现

    由于示例,远程服务地址配置在properties文件,通过QMConfig类加载,最优方式是上节介绍过,放在共享内存上,只需要维护一份数据即可,如放在redis上 /** 服务地址<servic ...

  3. 砸黑板! 正则表达式!!!re 模块

    模块是什么? 一个模块就是一个包含了 python 定义和声明的文件,文件名就是模块名字加上.py 的后缀. 但其实 import 加载的模块分为四个通用类别: 1:使用 python 编写的代码(. ...

  4. Head First设计模式之责任链模式

    一.定义 避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止. 主要解决:职责链上的处理者负责处理请求,客户只需要将请求 ...

  5. SQL Server CPU

    解决数据库系统的性能问题可能是一项艰巨的任务.了解如何找到问题很重要,但是了解系统对特定请求作出特定反应的原因更加重要.影响数据库服务器上的 CPU 利用率 的因素有很多:SQL 语句的编译和重新编译 ...

  6. MacOS 安装 Jenkins

    jenkins 官网安装教程:https://jenkins.io/doc/ 参考博文:http://blog.csdn.net/taishanduba/article/details/5045260 ...

  7. C#WinCE程序(.NET Compact Framework 3.5)项目重构面向抽象设计

    重构关注点 遵循开闭原则 面向抽象设计 实现设备程序端可动态配置 重构的需求 领导想省事提出需求,将现有PDA程序修改为支持PC端由电器工程师根据实际的生产流程可配置,PDA程序在读取配置文件后动态生 ...

  8. Python 数据科学系列 の Numpy、Series 和 DataFrame介绍

    本課主題 Numpy 的介绍和操作实战 Series 的介绍和操作实战 DataFrame 的介绍和操作实战 Numpy 的介绍和操作实战 numpy 是 Python 在数据计算领域里很常用的模块 ...

  9. 骗子网站,X毛都没有,骗我九十九

    前言 这几天在A市和B市奔波着,眼瞅着自己就要毕业了,必须得出来找份工作了. 和小伙伴在A市兜兜转转了几天,要不就是不合适没下文,要不就是给了offer,工资是在太低.心很累,然后就下B市了,看看B市 ...

  10. 深入理解JVM(五)——垃圾回收器

    轻松学习JVM(五)——垃圾回收器 上一篇我们介绍了常见的垃圾回收算法,不同的算法各有各的优缺点,在JVM中并不是单纯的使用某一种算法进行垃圾回收,而是将不同的垃圾回收算法包装在不同的垃圾回收器当中, ...