Metonymical Deflection

ゆるく日々のコト・たまにITインフラ

CentOS7でCephブロックデバイスの構築

CentOS7上でCephブロックデバイスを構築しました。
Cephは、オブジェクト、ブロック、ファイルストレージを1つの統一されたシステムで独自に提供してくれます。今回はこのうちブロックデバイスの構築を実施します。

Windows版VMWareWorkstation12上でCentOS7.5を3台稼働させて構築しましたが、同様の手順でベアメタルサーバ上にも構築できます。

1.環境

1-1.VMWare
筐体                             : 自作PC
CPU                           : Intel(R) Core(TM) i7-2600 CPU @ 3.40GHz
VMWare              : VMware(R) Workstation 12 Pro 12.5.9 build-7535481  
OS                               : CentOS7.5(1804)
Kernel                           : 3.10.0-862.el7.x86_64
Installed Environment Groups     : Server with GUI

WinおよびVMWare環境は以下の画像で確認してもらった方が良いかもしれません。
Win環境
f:id:metonymical:20180529200243j:plain
VMWare環境
f:id:metonymical:20180707151258p:plain
50GBのOS用とは別に100GB×2のHDDを追加しています。
これをマスター(ceph00)として、クローンを3台分(ceph01,ceph02,ceph03)作成しておきます。

1-3.全体の流れ

各ノード共通設定
cephのインストール
cephブロックデバイス設定

2.各ノード共通設定

3台のノード全てに同一の設定を行っていきます。

2-1.セキュリティ設定の無効化

firewalldとSELinuxを無効化します。

systemctl disable firewalld

vi /etc/selinux/config
で開いて
SELINUX=disabled
にして保存。

また、ここでは触れませんが、chronyなどで時刻同期を行ってください。

2-2.パスワード無しsshログイン設定
#ssh-keygen -N "" -t rsa

Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):  #そのままEnter
Created directory '/root/.ssh'.
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:oaQzt0YznhT9W2ZjSQtqSNgT8+OE2y5zUp7J9++aCeM root@ceph01.md.jp
The key's randomart image is:
+---[RSA 2048]----+
|      o          |
|     o *         |
|    . B * . .    |
|     + X = o o   |
|    + X S . O    |
|     B @ o * .   |
|      O B =      |
|     . = o + o   |
|          E =+o  |
+----[SHA256]-----+

次に3台のノードにそれぞれ鍵をコピーしていきます。
このとき、ホスト名もしくはFQDNで各ノードにアクセスできるようにhostsファイルもしくはDNSサーバの設定を実施しておいてください。

#ssh-copy-id root@ceph01.md.jp

/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
The authenticity of host 'ceph01.md.jp (192.168.11.121)' can't be established.
ECDSA key fingerprint is SHA256:nC6u8EYKElp2okhoYNCqJatrYlCzWi8ZtRudjt9VHQA.
ECDSA key fingerprint is MD5:6e:45:af:09:1a:be:10:af:8f:31:b9:f1:81:2a:2a:58.
Are you sure you want to continue connecting (yes/no)? yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@ceph01.md.jp's password:  #パスワードを入力

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh 'root@ceph01.md.jp'"
and check to make sure that only the key(s) you wanted were added.

上記と同様に他2台分のカギもコピー
#ssh-copy-id root@ceph02.md.jp
#ssh-copy-id root@ceph03.md.jp
2-4.ceph-deployのインストール

ceph-deployをインストールしておくことにより、3台のノードを1台のadminノードから全てコントロールすることが可能となるようです。

# mkdir /root/ceph
# cd /root/ceph/

# yum -y install ceph-deploy

3.cephのインストール

ここからはadminノード(ceph01)のみで操作を行います。

3-1.OSDとして登録

OSDノードとして登録

# ceph-deploy new ceph01.md.jp ceph02.md.jp ceph03.md.jp
3-2.ceph.confの設定

各ノード間通信を行うNWアドレスを追加

# vi ceph.conf

[global]
fsid = fad4e572-b6cb-47e7-b38e-ed41fa1545c0
mon_initial_members = ceph01, ceph02, ceph03
mon_host = 192.168.11.121,192.168.11.122,192.168.11.123
auth_cluster_required = cephx
auth_service_required = cephx
auth_client_required = cephx
public network = 192.168.11.0/24
3-3.cephのインストール

何も問題がなければ、以下のコマンド一発でインストール可能なのですが、途中で止まる時がちょいちょいありました。なので、エラー吐いて止まった場合は、「5.トラブルシュート」を参照してください。

# ceph-deploy install --release mimic ceph01.md.jp ceph02.md.jp ceph03.md.jp
3-4.インストール後の設定

監視ノードの初期化
設定とadminキーを各ノードに展開
各ノードのディスクをOSDとして登録

# ceph-deploy mon create-initial

# ceph-deploy admin ceph01.md.jp ceph02.md.jp ceph03.md.jp

# ceph-deploy osd create ceph01.md.jp --data /dev/sdb && \
ceph-deploy osd create ceph01.md.jp --data /dev/sdc && \
ceph-deploy osd create ceph02.md.jp --data /dev/sdb && \
ceph-deploy osd create ceph02.md.jp --data /dev/sdc && \
ceph-deploy osd create ceph03.md.jp --data /dev/sdb && \
ceph-deploy osd create ceph03.md.jp --data /dev/sdc
3-5.管理マネージャの起動

ディレクトリと空ファイル作成
mgr.adminのキー生成
空ファイルにキーを追記
管理マネージャ起動

# mkdir /var/lib/ceph/mgr/ceph-admin
# touch /var/lib/ceph/mgr/ceph-admin/keyring
# ceph --cluster ceph auth get-or-create mgr.admin mon 'allow profile mgr' osd 'allow *' mds 'allow *'
[mgr.admin]
        key = AQAXT0BbUiPaCRAAwqwc/7UEzfzB8Ts9qDNf2g==

#上記の鍵を空ファイルに追記して保存
# vi /var/lib/ceph/mgr/ceph-admin/keyring

[mgr.admin]
        key = AQAXT0BbUiPaCRAAwqwc/7UEzfzB8Ts9qDNf2g==

# ceph-mgr -i admin
3-6.起動確認
#ps -C ceph-mgr
    PID TTY          TIME CMD
  58425 ?        00:00:00 ceph-mgr

# ceph -s
  cluster:
    id:     fad4e572-b6cb-47e7-b38e-ed41fa1545c0
    health: HEALTH_OK
 
  services:
    mon: 3 daemons, quorum ceph01,ceph02,ceph03
    mgr: admin(active)
    osd: 6 osds: 6 up, 6 in
 
  data:
    pools:   0 pools, 0 pgs
    objects: 0 objects, 0 bytes
    usage:   6163 MB used, 593 GB / 599 GB avail
    pgs:     
 

4.cephブロックデバイス設定

4-1.プール作成およびイメージ作成

poolの作成
poolの初期化
イメージの作成
イメージとブロックデバイスマッピング

# ceph osd pool create pool01 128
pool 'pool01' created

# rbd pool init pool01

# rbd create vol01 -p pool01 --size 10G --image-feature layering

# rbd map vol01 -p pool01
/dev/rbd0 

pool01という名前のプール作成
pool01を初期化
pool01上にvol01という名前の10GB空イメージを作成
pool01上のvol01をブロックデバイスとしてマッピングすることで、/dev/rbd0というデバイスが追加される。
あとは、通常のディスク(ブロックデバイス)と同様にfdiskやmkfsを構成することが可能です。

4-2.各種情報の確認

プールの確認
プール内イメージの確認
イメージの情報(容量など)確認
ブロックデバイスの確認

# rados lspools
pool01
# rbd ls pool01
vol01
# rbd info pool01/vol01
rbd image 'vol01':
	size 10240 MB in 2560 objects
	order 22 (4096 kB objects)
	block_name_prefix: rbd_data.103f74b0dc51
	format: 2
	features: layering
	flags: 
	create_timestamp: Sat Jul  7 13:35:56 2018

# lsblk
NAME                                                                   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda                                                                      8:0    0   50G  0 disk 
tqsda1                                                                   8:1    0    1G  0 part /boot
mqsda2                                                                   8:2    0   49G  0 part 
  tqcentos-root                                                        253:0    0   47G  0 lvm  /
  mqcentos-swap                                                        253:1    0    2G  0 lvm  [SWAP]
sdb                                                                      8:16   0  100G  0 disk 
mqceph--fab7c5a8--f170--4a59--93b4--68948d9c91a1-osd--block--9024dc2b--ef0e--403b--bbd1--eec740127c24
                                                                       253:2    0  100G  0 lvm  
sdc                                                                      8:32   0  100G  0 disk 
mqceph--4fc60b45--ac73--470f--beac--ea58fcb809ee-osd--block--ecff0a57--aee5--4119--9769--0156b634ad34
                                                                       253:3    0  100G  0 lvm  
sr0                                                                     11:0    1 1024M  0 rom  
rbd0                                                                   252:0    0   10G  0 disk 
4-3.プールやイメージの削除方法

Default設定ではプール削除などができないようになっているため少々厄介です。

イメージのアンマップ
イメージの削除(1つのプールに複数のイメージがある場合は全イメージを削除)
pool削除の許可設定を追加
ceph-monのリスタート
poolの削除禁止設定を無効化
プールの削除

# rbd unmap -p pool01 --image vol01

# rbd remove -p pool01 --image vol01
Removing image: 100% complete...done.

#vi /etc/ceph/ceph.conf
最終行に以下を追記

[mon]
mon allow pool delete = true

# systemctl restart ceph-mon.target

# for pool in $(rados lspools); do ceph osd pool set $pool nodelete false; done
set pool 1 nodelete to false

# ceph osd pool delete pool01 pool01 --yes-i-really-really-mean-it

5.トラブルシュート

私の場合、なぜか?土日にインストールコマンドを実行すると、YumのDL時に途中で止まる事象を確認しました。
途中で止まってしまう箇所は以下の通り。

以下、抜粋
[ceph01.md.jp][DEBUG ] Dependencies Resolved
[ceph01.md.jp][DEBUG ] 
[ceph01.md.jp][DEBUG ] ================================================================================
[ceph01.md.jp][DEBUG ]  Package                 Arch     Version                        Repository
[ceph01.md.jp][DEBUG ]                                                                            Size
[ceph01.md.jp][DEBUG ] ================================================================================
[ceph01.md.jp][DEBUG ] Installing:
[ceph01.md.jp][DEBUG ]  ceph                    x86_64   2:12.2.5-0.el7                 Ceph     3.0 k
[ceph01.md.jp][DEBUG ]  ceph-radosgw            x86_64   2:12.2.5-0.el7                 Ceph     3.8 M
[ceph01.md.jp][DEBUG ] Installing for dependencies:
[ceph01.md.jp][DEBUG ]  ceph-base               x86_64   2:12.2.5-0.el7                 Ceph     3.9 M
[ceph01.md.jp][DEBUG ]  ceph-common             x86_64   2:12.2.5-0.el7                 Ceph      15 M
[ceph01.md.jp][DEBUG ]  ceph-mds                x86_64   2:12.2.5-0.el7                 Ceph     3.6 M
[ceph01.md.jp][DEBUG ]  ceph-mgr                x86_64   2:12.2.5-0.el7                 Ceph     3.6 M
[ceph01.md.jp][DEBUG ]  ceph-mon                x86_64   2:12.2.5-0.el7                 Ceph     5.0 M
[ceph01.md.jp][DEBUG ]  ceph-osd                x86_64   2:12.2.5-0.el7                 Ceph      13 M
[ceph01.md.jp][DEBUG ]  ceph-selinux            x86_64   2:12.2.5-0.el7                 Ceph      20 k
[ceph01.md.jp][DEBUG ]  leveldb                 x86_64   1.12.0-11.el7                  epel     161 k
[ceph01.md.jp][DEBUG ]  libbabeltrace           x86_64   1.2.4-3.el7                    epel     147 k
[ceph01.md.jp][DEBUG ]  libcephfs2              x86_64   2:12.2.5-0.el7                 Ceph     432 k
[ceph01.md.jp][DEBUG ]  libradosstriper1        x86_64   2:12.2.5-0.el7                 Ceph     330 k
[ceph01.md.jp][DEBUG ]  librgw2                 x86_64   2:12.2.5-0.el7                 Ceph     1.7 M
[ceph01.md.jp][DEBUG ]  lttng-ust               x86_64   2.4.1-4.el7                    epel     176 k
[ceph01.md.jp][DEBUG ]  mailcap                 noarch   2.1.41-2.el7                   base      31 k
[ceph01.md.jp][DEBUG ]  pyOpenSSL               x86_64   0.13.1-3.el7                   base     133 k
[ceph01.md.jp][DEBUG ]  python-babel            noarch   0.9.6-8.el7                    base     1.4 M
[ceph01.md.jp][DEBUG ]  python-beaker           noarch   1.5.4-10.el7                   base      80 k
[ceph01.md.jp][DEBUG ]  python-cephfs           x86_64   2:12.2.5-0.el7                 Ceph      82 k
[ceph01.md.jp][DEBUG ]  python-cherrypy         noarch   3.2.2-4.el7                    base     422 k
[ceph01.md.jp][DEBUG ]  python-flask            noarch   1:0.10.1-4.el7                 extras   204 k
[ceph01.md.jp][DEBUG ]  python-itsdangerous     noarch   0.23-2.el7                     extras    24 k
[ceph01.md.jp][DEBUG ]  python-jinja2           noarch   2.7.2-2.el7                    base     515 k
[ceph01.md.jp][DEBUG ]  python-mako             noarch   0.8.1-2.el7                    base     307 k
[ceph01.md.jp][DEBUG ]  python-markupsafe       x86_64   0.11-10.el7                    base      25 k
[ceph01.md.jp][DEBUG ]  python-paste            noarch   1.7.5.1-9.20111221hg1498.el7   base     866 k
[ceph01.md.jp][DEBUG ]  python-pecan            noarch   0.4.5-2.el7                    epel     255 k
[ceph01.md.jp][DEBUG ]  python-prettytable      noarch   0.7.2-3.el7                    base      37 k
[ceph01.md.jp][DEBUG ]  python-rados            x86_64   2:12.2.5-0.el7                 Ceph     172 k
[ceph01.md.jp][DEBUG ]  python-rbd              x86_64   2:12.2.5-0.el7                 Ceph     105 k
[ceph01.md.jp][DEBUG ]  python-requests         noarch   2.6.0-1.el7_1                  base      94 k
[ceph01.md.jp][DEBUG ]  python-rgw              x86_64   2:12.2.5-0.el7                 Ceph      73 k
[ceph01.md.jp][DEBUG ]  python-simplegeneric    noarch   0.8-7.el7                      epel      12 k
[ceph01.md.jp][DEBUG ]  python-singledispatch   noarch   3.4.0.2-2.el7                  epel      18 k
[ceph01.md.jp][DEBUG ]  python-tempita          noarch   0.5.1-6.el7                    base      33 k
[ceph01.md.jp][DEBUG ]  python-urllib3          noarch   1.10.2-5.el7                   base     102 k
[ceph01.md.jp][DEBUG ]  python-webob            noarch   1.2.3-7.el7                    base     202 k
[ceph01.md.jp][DEBUG ]  python-webtest          noarch   1.3.4-6.el7                    base     102 k
[ceph01.md.jp][DEBUG ]  python-werkzeug         noarch   0.9.1-2.el7                    extras   562 k
[ceph01.md.jp][DEBUG ]  userspace-rcu           x86_64   0.7.16-1.el7                   epel      73 k
[ceph01.md.jp][DEBUG ] Updating for dependencies:
[ceph01.md.jp][DEBUG ]  librados2               x86_64   2:12.2.5-0.el7                 Ceph     2.9 M
[ceph01.md.jp][DEBUG ]  librbd1                 x86_64   2:12.2.5-0.el7                 Ceph     1.1 M
[ceph01.md.jp][DEBUG ] 
[ceph01.md.jp][DEBUG ] Transaction Summary
[ceph01.md.jp][DEBUG ] ================================================================================
[ceph01.md.jp][DEBUG ] Install  2 Packages (+39 Dependent packages)
[ceph01.md.jp][DEBUG ] Upgrade             (  2 Dependent packages)
[ceph01.md.jp][DEBUG ] 
[ceph01.md.jp][DEBUG ] Total download size: 60 M
[ceph01.md.jp][DEBUG ] Downloading packages:
[ceph01.md.jp][DEBUG ] No Presto metadata available for Ceph

ここで5分待たされて、以下の表示で止まる。

[ceph01.md.jp][WARNIN] No data was received after 300 seconds, disconnecting...
[ceph01.md.jp][INFO  ] Running command: ceph --version
[ceph01.md.jp][ERROR ] Traceback (most recent call last):
[ceph01.md.jp][ERROR ]   File "/usr/lib/python2.7/site-packages/ceph_deploy/lib/vendor/remoto/process.py", line 119, in run
[ceph01.md.jp][ERROR ]     reporting(conn, result, timeout)
[ceph01.md.jp][ERROR ]   File "/usr/lib/python2.7/site-packages/ceph_deploy/lib/vendor/remoto/log.py", line 13, in reporting
[ceph01.md.jp][ERROR ]     received = result.receive(timeout)
[ceph01.md.jp][ERROR ]   File "/usr/lib/python2.7/site-packages/ceph_deploy/lib/vendor/remoto/lib/vendor/execnet/gateway_base.py", line 704, in receive
[ceph01.md.jp][ERROR ]     raise self._getremoteerror() or EOFError()
[ceph01.md.jp][ERROR ] RemoteError: Traceback (most recent call last):
[ceph01.md.jp][ERROR ]   File "/usr/lib/python2.7/site-packages/ceph_deploy/lib/vendor/remoto/lib/vendor/execnet/gateway_base.py", line 1036, in executetask
[ceph01.md.jp][ERROR ]     function(channel, **kwargs)
[ceph01.md.jp][ERROR ]   File "", line 12, in _remote_run
[ceph01.md.jp][ERROR ]   File "/usr/lib64/python2.7/subprocess.py", line 711, in __init__
[ceph01.md.jp][ERROR ]     errread, errwrite)
[ceph01.md.jp][ERROR ]   File "/usr/lib64/python2.7/subprocess.py", line 1327, in _execute_child
[ceph01.md.jp][ERROR ]     raise child_exception
[ceph01.md.jp][ERROR ] OSError: [Errno 2] No such file or directory
[ceph01.md.jp][ERROR ] 
[ceph01.md.jp][ERROR ] 
[ceph_deploy][ERROR ] RuntimeError: Failed to execute command: ceph --version

よくよく動きを観察していると、ceph-radosgwやceph-osdのDLが遅すぎてタイムアウトするような状態となっている事象でした。一台目のノードで引っ掛かると、他のノードにおいても同様に上記の箇所で都度停止してしまいます。
このため、少々ダサい方法ですが各ノードに対して手動でインストールします。

5-1.各ノードでインストールの実行

各ノード(ceph01,ceph02,ceph03)にsshでログインしてください。

ceph01

yumが動作したままになっている可能性が高いのでKillしてください。
# ps -aux | grep yum
root       2038  0.7  7.2 1020036 135832 pts/0  S    12:51   0:02 /usr/bin/python /usr/bin/yum -y install ceph ceph-radosgw
root       2109  0.0  0.0 112704   972 pts/0    R+   12:57   0:00 grep --color=auto yum

# kill -9 2038

再度、Yum実行
# yum -y install ceph ceph-radosgw

さらに、以下のように停止する場合があるため、再々度、Yum実行
Trying other mirror.

Error downloading packages:
  2:ceph-osd-12.2.5-0.el7.x86_64: [Errno 256] No more mirrors to try.

# yum -y install ceph-osd

最初に抜粋した箇所で止まった場合、ceph02やceph03は、まだceph-deploy installが行われていません。このため、一度個別にceph-deploy installを実行し、エラーは吐かせた後で、ceph01と同様の対処を行います。この作業はceph02とceph03で並行して行っても構いません。

ceph02

# ceph-deploy install --release mimic ceph02.md.jp

# ps -aux | grep yum
# kill -9 {PID}

# yum -y install ceph ceph-radosgw

ceph03

# ceph-deploy install --release mimic ceph03.md.jp

# ps -aux | grep yum
# kill -9 {PID}

# yum -y install ceph ceph-radosgw

ceph01

# ceph-deploy install --release mimic ceph01.md.jp ceph02.md.jp ceph03.md.jp

~略~
[ceph01.md.jp][DEBUG ] Complete!
[ceph01.md.jp][INFO  ] Running command: ceph --version
[ceph01.md.jp][DEBUG ] ceph version 13.2.0 (79a10589f1f80dfe21e8f9794365ed98143071c4) mimic (stable)
~略~
[ceph02.md.jp][DEBUG ] Complete!
[ceph02.md.jp][INFO  ] Running command: ceph --version
[ceph02.md.jp][DEBUG ] ceph version 13.2.0 (79a10589f1f80dfe21e8f9794365ed98143071c4) mimic (stable)
~略~
[ceph03.md.jp][DEBUG ] Complete!
[ceph03.md.jp][INFO  ] Running command: ceph --version
[ceph03.md.jp][DEBUG ] ceph version 13.2.0 (79a10589f1f80dfe21e8f9794365ed98143071c4) mimic (stable)

最後にceph01にて再度同じコマンドを実行します。
正常に完了すると、上記の通り各ノードごとにComplete!のメッセージが表示されます。

以上です。

6.最後に

以下のサイトを参考にさせて頂きました。
Ceph(luminous)のインストール方法
删除pool error的解决方法 - sisimi_2017 - 博客园
Protecting your Ceph pools against removal or property changes – Widodh

今回はCephをブロックデバイスとして使う場合の構築方法でしたが、これ以外にもオブジェクトストレージやファイルシステムとして使う場合の構築方法もあるため、一つのストレージシステムで全てをまかなえるのが良いなと思っています。
というのもありますが、一番の理由としてCephはspdkのTargetとして使えるためです。