這篇文章主要介紹了rexray在CentOS上不能創(chuàng)建ceph rbd的docker volume問題怎么辦,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
創(chuàng)新互聯(lián)堅持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:網(wǎng)站制作、網(wǎng)站設(shè)計、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時代的點軍網(wǎng)站設(shè)計、移動媒體設(shè)計的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!
我們通過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
之前我們在ubuntu 16.04的環(huán)境中,也搭建過docker+ceph+rexray的環(huán)境,使用docker命令創(chuàng)建volume并沒有報錯。正常的流程是:
1. 創(chuàng)建docker volume:rexray會使用rbd create命令創(chuàng)建一個rbd設(shè)備; 2. 使用該volume創(chuàng)建docker 容器:rexray會將rbd 設(shè)備map到docker host上成為一個/dev/rbd設(shè)備,再使用mount命令將/dev/rbd設(shè)備掛載到/var/lib/libstorage/volumes/目錄,供容器使用; 3. 刪除該容器時:先umount掉/dev/rbd設(shè)備在/var/lib/libstorage/volumes/目錄的掛載,再rbd unmap掉rbd設(shè)備在docker host上的映射; 4. 刪除docker volume:rexray會使用rbd rm命令刪除該rbd設(shè)備;
在我們的實際使用情況中,發(fā)現(xiàn)只有第一步會出錯,后面的三步都并未出現(xiàn)任何異常。而且,如果我們不使用docker volume create命令創(chuàng)建rbd設(shè)備,而是直接使用“rbd create”命令來創(chuàng)建rbd設(shè)備,也并未出現(xiàn)任何錯誤,且該rbd設(shè)備也可以正常使用。這是很奇怪的一個地方。
查看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=" }"
通過日志可以看到,每次發(fā)送docker volume create命令時,實際發(fā)送了兩次http請求,第一次是列出當前的rbd設(shè)備,第二次才是發(fā)出post請求來創(chuàng)建一個rbd設(shè)備。而這里的日志,則給出了更多的信息“rbd: strict_strtoll: garbage at end of string. got: '5G'”。也就是說,很可能就是在rexray調(diào)用rbd create命令時發(fā)生了錯誤。這里,我們打開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”。這里我們就按照它這里的方法,組裝了一個新的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上運行,沒有報錯。同一條命令,在不同的環(huán)境下結(jié)果不同。那么最大的可能就是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大小的參數(shù)。這就是問題出現(xiàn)的原因。
在CentOS上安裝更新的Ceph版本(jewel或更新的版本)即可。
感謝你能夠認真閱讀完這篇文章,希望小編分享的“rexray在CentOS上不能創(chuàng)建ceph rbd的docker volume問題怎么辦”這篇文章對大家有幫助,同時也希望大家多多支持創(chuàng)新互聯(lián),關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,更多相關(guān)知識等著你來學習!