溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

rexray在CentOS上不能創(chuàng)建ceph rbd的docker volume問題怎么辦

發(fā)布時(shí)間:2021-11-15 16:49:43 來源:億速云 閱讀:142 作者:小新 欄目:云計(jì)算

這篇文章主要介紹了rexray在CentOS上不能創(chuàng)建ceph rbd的docker volume問題怎么辦,具有一定借鑒價(jià)值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

背景

  我們通過docker的rexray插件來創(chuàng)建ceph rbd設(shè)備的docker volume,但總提示創(chuàng)建失敗。

# 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

分析

  之前我們?cè)趗buntu 16.04的環(huán)境中,也搭建過docker+ceph+rexray的環(huán)境,使用docker命令創(chuàng)建volume并沒有報(bào)錯(cuò)。正常的流程是:

1. 創(chuàng)建docker volume:rexray會(huì)使用rbd create命令創(chuàng)建一個(gè)rbd設(shè)備;
2. 使用該volume創(chuàng)建docker 容器:rexray會(huì)將rbd 設(shè)備map到docker host上成為一個(gè)/dev/rbd設(shè)備,再使用mount命令將/dev/rbd設(shè)備掛載到/var/lib/libstorage/volumes/目錄,供容器使用;
3. 刪除該容器時(shí):先umount掉/dev/rbd設(shè)備在/var/lib/libstorage/volumes/目錄的掛載,再rbd unmap掉rbd設(shè)備在docker host上的映射;
4. 刪除docker volume:rexray會(huì)使用rbd rm命令刪除該rbd設(shè)備;

  在我們的實(shí)際使用情況中,發(fā)現(xiàn)只有第一步會(huì)出錯(cuò),后面的三步都并未出現(xiàn)任何異常。而且,如果我們不使用docker volume create命令創(chuàng)建rbd設(shè)備,而是直接使用“rbd create”命令來創(chuàng)建rbd設(shè)備,也并未出現(xiàn)任何錯(cuò)誤,且該rbd設(shè)備也可以正常使用。這是很奇怪的一個(gè)地方。
  查看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中沒有更有價(jià)值的日志,那么就嘗試看下rexray的日志,這里需要打開rexray的debug選項(xiàng)(打開方法參考),從而可以看到更多的日志。

# 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="    }"

  通過日志可以看到,每次發(fā)送docker volume create命令時(shí),實(shí)際發(fā)送了兩次http請(qǐng)求,第一次是列出當(dāng)前的rbd設(shè)備,第二次才是發(fā)出post請(qǐng)求來創(chuàng)建一個(gè)rbd設(shè)備。而這里的日志,則給出了更多的信息“rbd: strict_strtoll: garbage at end of string. got: '5G'”。也就是說,很可能就是在rexray調(diào)用rbd create命令時(shí)發(fā)生了錯(cuò)誤。這里,我們打開rexray源碼繼續(xù)跟蹤,具體的源碼文件為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
}

  根據(jù)上面的代碼可以大致看出,rexray就是直接調(diào)用rbd create命令來創(chuàng)建rbd設(shè)備,和我們直接調(diào)用命令不同的是它這里是把rbd的大小轉(zhuǎn)化成GB,然后再字符串拼接了一個(gè)“G”。這里我們就按照它這里的方法,組裝了一個(gè)新的rbd命令,然后在CentOS上測(cè)試:

# rbd create cephrbd-test --size 5G
rbd: strict_strtoll: garbage at end of string. got: '5G'

  果然,還是報(bào)錯(cuò)了,我們?cè)偈褂迷撁钤趗buntu上測(cè)試:

# rbd create cephrbd-test --size 5G

  在ubuntu上運(yùn)行,沒有報(bào)錯(cuò)。同一條命令,在不同的環(huán)境下結(jié)果不同。那么最大的可能就是rbd(ceph)的版本不一致了。在ubuntu下獲取ceph版本。

# ceph version
ceph version 10.2.7

  而CentOS上默認(rèn)安裝的ceph版本只是0.94.5(Hammer版),而Ubuntu上默認(rèn)安裝的卻是更高的10.2.7(jewel版本)。而0.94.5 ceph版本的rbd命令無法解析“G”,“M”等描述rbd大小的參數(shù)。這就是問題出現(xiàn)的原因。

解決方法

  在CentOS上安裝更新的Ceph版本(jewel或更新的版本)即可。

感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“rexray在CentOS上不能創(chuàng)建ceph rbd的docker volume問題怎么辦”這篇文章對(duì)大家有幫助,同時(shí)也希望大家多多支持億速云,關(guān)注億速云行業(yè)資訊頻道,更多相關(guān)知識(shí)等著你來學(xué)習(xí)!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI