rexray在CentOS上不能创建ceph rbd的docker volume问题定位

2024-02-09 12:18

本文主要是介绍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 CSTlibStorage
----------
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问题定位的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/694212

相关文章

无人叉车3d激光slam多房间建图定位异常处理方案-墙体画线地图切分方案

墙体画线地图切分方案 针对问题:墙体两侧特征混淆误匹配,导致建图和定位偏差,表现为过门跳变、外月台走歪等 ·解决思路:预期的根治方案IGICP需要较长时间完成上线,先使用切分地图的工程化方案,即墙体两侧切分为不同地图,在某一侧只使用该侧地图进行定位 方案思路 切分原理:切分地图基于关键帧位置,而非点云。 理论基础:光照是直线的,一帧点云必定只能照射到墙的一侧,无法同时照到两侧实践考虑:关

如何用Docker运行Django项目

本章教程,介绍如何用Docker创建一个Django,并运行能够访问。 一、拉取镜像 这里我们使用python3.11版本的docker镜像 docker pull python:3.11 二、运行容器 这里我们将容器内部的8080端口,映射到宿主机的80端口上。 docker run -itd --name python311 -p

好题——hdu2522(小数问题:求1/n的第一个循环节)

好喜欢这题,第一次做小数问题,一开始真心没思路,然后参考了网上的一些资料。 知识点***********************************无限不循环小数即无理数,不能写作两整数之比*****************************(一开始没想到,小学没学好) 此题1/n肯定是一个有限循环小数,了解这些后就能做此题了。 按照除法的机制,用一个函数表示出来就可以了,代码如下

hdu1043(八数码问题,广搜 + hash(实现状态压缩) )

利用康拓展开将一个排列映射成一个自然数,然后就变成了普通的广搜题。 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#inclu

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal

购买磨轮平衡机时应该注意什么问题和技巧

在购买磨轮平衡机时,您应该注意以下几个关键点: 平衡精度 平衡精度是衡量平衡机性能的核心指标,直接影响到不平衡量的检测与校准的准确性,从而决定磨轮的振动和噪声水平。高精度的平衡机能显著减少振动和噪声,提高磨削加工的精度。 转速范围 宽广的转速范围意味着平衡机能够处理更多种类的磨轮,适应不同的工作条件和规格要求。 振动监测能力 振动监测能力是评估平衡机性能的重要因素。通过传感器实时监

在cscode中通过maven创建java项目

在cscode中创建java项目 可以通过博客完成maven的导入 建立maven项目 使用快捷键 Ctrl + Shift + P 建立一个 Maven 项目 1 Ctrl + Shift + P 打开输入框2 输入 "> java create"3 选择 maven4 选择 No Archetype5 输入 域名6 输入项目名称7 建立一个文件目录存放项目,文件名一般为项目名8 确定

缓存雪崩问题

缓存雪崩是缓存中大量key失效后当高并发到来时导致大量请求到数据库,瞬间耗尽数据库资源,导致数据库无法使用。 解决方案: 1、使用锁进行控制 2、对同一类型信息的key设置不同的过期时间 3、缓存预热 1. 什么是缓存雪崩 缓存雪崩是指在短时间内,大量缓存数据同时失效,导致所有请求直接涌向数据库,瞬间增加数据库的负载压力,可能导致数据库性能下降甚至崩溃。这种情况往往发生在缓存中大量 k

6.1.数据结构-c/c++堆详解下篇(堆排序,TopK问题)

上篇:6.1.数据结构-c/c++模拟实现堆上篇(向下,上调整算法,建堆,增删数据)-CSDN博客 本章重点 1.使用堆来完成堆排序 2.使用堆解决TopK问题 目录 一.堆排序 1.1 思路 1.2 代码 1.3 简单测试 二.TopK问题 2.1 思路(求最小): 2.2 C语言代码(手写堆) 2.3 C++代码(使用优先级队列 priority_queue)

Java 创建图形用户界面(GUI)入门指南(Swing库 JFrame 类)概述

概述 基本概念 Java Swing 的架构 Java Swing 是一个为 Java 设计的 GUI 工具包,是 JAVA 基础类的一部分,基于 Java AWT 构建,提供了一系列轻量级、可定制的图形用户界面(GUI)组件。 与 AWT 相比,Swing 提供了许多比 AWT 更好的屏幕显示元素,更加灵活和可定制,具有更好的跨平台性能。 组件和容器 Java Swing 提供了许多