Proxmox VE 4.1では、クラスタを構成する各ノードにオブジェクトストレージである「Ceph」をインストールし、OSDとして動作させることが出来る。
つまり、Proxmoxのクラスタノードが10台以上とかいても、共通アクセスするストレージ機器を用意することなく動作を継続することが出来るということになる。イメージ的には、vSANに似たように利用することが可能となる。

Cephそのものの動作については、以下のページを参考にするとよいだろう。

今回は、このCephをProxmox VE 4.1クラスタにインストールし、各ノードにマウントさせる。
こちらを参考に作業を行い、以下の前提条件をクリアしていることとする。

  • Proxmoxクラスタのノードは3台以上
  • 各ノードに追加ディスク(ここでは/dev/sdb)がある
  • 各ノードにクラスタで利用するため専用の物理NIC(ここではeth1)を増設している

Cephの仕組みから3多重となるため、Proxmox クラスタも3台以上必要なので注意。
それではやってみよう。

1.クラスタ用ネットワークの設定

まず、Cephクラスタが利用する専用のネットワーク設定を行う。
「/etc/network/interfaces」を編集し、ブリッジとしてではなく、物理ノードで直接使うよう設定を編集する。

●例

auto lo
iface lo inet loopback

auto eth1
iface eth1 inet static
        address  クラスタ用IPアドレス
        netmask  255.255.255.0

auto vmbr0
iface vmbr0 inet static
        address ブリッジ用IPアドレス
        netmask 255.255.255.0
        gateway ブリッジ用ゲートウェイ
        bridge_ports eth0
        bridge_stp off
        bridge_fd 0

これを各ノードで行い、念のため再起動を行う。

2.Cephのインストール・設定

次に、各ノードにCephをインストールするため、以下のコマンドを実行する。

pveceph install -version hammer
root@BS-PUB-MICROSERVER-01:~# pveceph install -version hammer
download and import ceph repository keys
update available package list
Reading package lists...
Building dependency tree...
Reading state information...
gdisk is already the newest version.
The following extra packages will be installed:
  binutils cryptsetup-bin libbabeltrace-ctf1 libbabeltrace1
  libboost-program-options1.55.0 libleveldb1 liblttng-ust-ctl2 liblttng-ust0
  librados2 librbd1 libsnappy1 liburcu2 python-ceph python-cephfs python-rados
  python-rbd uuid-runtime
Suggested packages:
  binutils-doc
Recommended packages:
  btrfs-tools ceph-mds libradosstriper1
The following NEW packages will be installed:
  binutils ceph cryptsetup-bin libbabeltrace-ctf1 libbabeltrace1
  libboost-program-options1.55.0 libleveldb1 liblttng-ust-ctl2 liblttng-ust0
  libsnappy1 liburcu2 python-cephfs python-rados python-rbd uuid-runtime
The following packages will be upgraded:
  ceph-common librados2 librbd1 python-ceph
4 upgraded, 15 newly installed, 0 to remove and 124 not upgraded.
Need to get 30.6 MB of archives.
After this operation, 109 MB of additional disk space will be used.
Get:1 http://ftp.jp.debian.org/debian/ jessie/main libboost-program-options1.55.0 amd64 1.55.0+dfsg-3 [143 kB]
Get:2 http://ftp.jp.debian.org/debian/ jessie/main libsnappy1 amd64 1.1.2-3 [40.4 kB]
Get:3 http://ftp.jp.debian.org/debian/ jessie/main libleveldb1 amd64 1.17-1 [137 kB]
Get:4 http://ftp.jp.debian.org/debian/ jessie/main uuid-runtime amd64 2.25.2-6 [74.3 kB]
Get:5 http://ftp.jp.debian.org/debian/ jessie/main libbabeltrace1 amd64 1.2.3-2 [46.2 kB]
Get:6 http://ftp.jp.debian.org/debian/ jessie/main libbabeltrace-ctf1 amd64 1.2.3-2 [101 kB]
Get:7 http://download.ceph.com/debian-hammer/ jessie/main python-ceph amd64 0.94.6-1~bpo80+1 [788 kB]
Get:8 http://ftp.jp.debian.org/debian/ jessie/main liburcu2 amd64 0.8.5-1 [53.6 kB]
Get:9 http://ftp.jp.debian.org/debian/ jessie/main liblttng-ust-ctl2 amd64 2.5.0-1 [83.0 kB]
Get:10 http://ftp.jp.debian.org/debian/ jessie/main liblttng-ust0 amd64 2.5.0-1 [132 kB]
Get:11 http://ftp.jp.debian.org/debian/ jessie/main binutils amd64 2.25-5 [3516 kB]
Get:12 http://ftp.jp.debian.org/debian/ jessie/main cryptsetup-bin amd64 2:1.6.6-5 [175 kB]
Get:13 http://download.ceph.com/debian-hammer/ jessie/main librbd1 amd64 0.94.6-1~bpo80+1 [2482 kB]
Get:14 http://download.ceph.com/debian-hammer/ jessie/main ceph-common amd64 0.94.6-1~bpo80+1 [6358 kB]
Get:15 http://download.ceph.com/debian-hammer/ jessie/main librados2 amd64 0.94.6-1~bpo80+1 [2371 kB]
Get:16 http://download.ceph.com/debian-hammer/ jessie/main python-rados amd64 0.94.6-1~bpo80+1 [799 kB]
Get:17 http://download.ceph.com/debian-hammer/ jessie/main python-cephfs amd64 0.94.6-1~bpo80+1 [791 kB]
Get:18 http://download.ceph.com/debian-hammer/ jessie/main python-rbd amd64 0.94.6-1~bpo80+1 [795 kB]
Get:19 http://download.ceph.com/debian-hammer/ jessie/main ceph amd64 0.94.6-1~bpo80+1 [11.7 MB]
Reading changelogs...
Fetched 30.6 MB in 7s (3970 kB/s)
Selecting previously unselected package libboost-program-options1.55.0:amd64.
(Reading database ... 38442 files and directories currently installed.)
Preparing to unpack .../libboost-program-options1.55.0_1.55.0+dfsg-3_amd64.deb ...
Unpacking libboost-program-options1.55.0:amd64 (1.55.0+dfsg-3) ...
Selecting previously unselected package libsnappy1.
Preparing to unpack .../libsnappy1_1.1.2-3_amd64.deb ...
Unpacking libsnappy1 (1.1.2-3) ...
Selecting previously unselected package libleveldb1:amd64.
Preparing to unpack .../libleveldb1_1.17-1_amd64.deb ...
Unpacking libleveldb1:amd64 (1.17-1) ...
Selecting previously unselected package uuid-runtime.
Preparing to unpack .../uuid-runtime_2.25.2-6_amd64.deb ...
Unpacking uuid-runtime (2.25.2-6) ...
Selecting previously unselected package libbabeltrace1:amd64.
Preparing to unpack .../libbabeltrace1_1.2.3-2_amd64.deb ...
Unpacking libbabeltrace1:amd64 (1.2.3-2) ...
Selecting previously unselected package libbabeltrace-ctf1:amd64.
Preparing to unpack .../libbabeltrace-ctf1_1.2.3-2_amd64.deb ...
Unpacking libbabeltrace-ctf1:amd64 (1.2.3-2) ...
Selecting previously unselected package liburcu2:amd64.
Preparing to unpack .../liburcu2_0.8.5-1_amd64.deb ...
Unpacking liburcu2:amd64 (0.8.5-1) ...
Selecting previously unselected package liblttng-ust-ctl2:amd64.
Preparing to unpack .../liblttng-ust-ctl2_2.5.0-1_amd64.deb ...
Unpacking liblttng-ust-ctl2:amd64 (2.5.0-1) ...
Selecting previously unselected package liblttng-ust0:amd64.
Preparing to unpack .../liblttng-ust0_2.5.0-1_amd64.deb ...
Unpacking liblttng-ust0:amd64 (2.5.0-1) ...
Selecting previously unselected package binutils.
Preparing to unpack .../binutils_2.25-5_amd64.deb ...
Unpacking binutils (2.25-5) ...
Preparing to unpack .../python-ceph_0.94.6-1~bpo80+1_amd64.deb ...
Unpacking python-ceph (0.94.6-1~bpo80+1) over (0.80.7-2) ...
Preparing to unpack .../librbd1_0.94.6-1~bpo80+1_amd64.deb ...
Unpacking librbd1 (0.94.6-1~bpo80+1) over (0.80.7-2) ...
Preparing to unpack .../ceph-common_0.94.6-1~bpo80+1_amd64.deb ...
Unpacking ceph-common (0.94.6-1~bpo80+1) over (0.80.7-2) ...
Preparing to unpack .../librados2_0.94.6-1~bpo80+1_amd64.deb ...
Unpacking librados2 (0.94.6-1~bpo80+1) over (0.80.7-2) ...
Selecting previously unselected package python-rados.
Preparing to unpack .../python-rados_0.94.6-1~bpo80+1_amd64.deb ...
Unpacking python-rados (0.94.6-1~bpo80+1) ...
Selecting previously unselected package python-cephfs.
Preparing to unpack .../python-cephfs_0.94.6-1~bpo80+1_amd64.deb ...
Unpacking python-cephfs (0.94.6-1~bpo80+1) ...
Selecting previously unselected package python-rbd.
Preparing to unpack .../python-rbd_0.94.6-1~bpo80+1_amd64.deb ...
Unpacking python-rbd (0.94.6-1~bpo80+1) ...
Selecting previously unselected package cryptsetup-bin.
Preparing to unpack .../cryptsetup-bin_2%3a1.6.6-5_amd64.deb ...
Unpacking cryptsetup-bin (2:1.6.6-5) ...
Selecting previously unselected package ceph.
Preparing to unpack .../ceph_0.94.6-1~bpo80+1_amd64.deb ...
Unpacking ceph (0.94.6-1~bpo80+1) ...
Processing triggers for systemd (215-17+deb8u2) ...
Processing triggers for man-db (2.7.0.2-5) ...
Setting up libboost-program-options1.55.0:amd64 (1.55.0+dfsg-3) ...
Setting up libsnappy1 (1.1.2-3) ...
Setting up libleveldb1:amd64 (1.17-1) ...
Setting up uuid-runtime (2.25.2-6) ...
Adding group `uuidd' (GID 117) ...
Done.
Warning: The home dir /run/uuidd you specified can't be accessed: No such file or directory
Adding system user `uuidd' (UID 109) ...
Adding new user `uuidd' (UID 109) with group `uuidd' ...
Not creating home directory `/run/uuidd'.
Setting up libbabeltrace1:amd64 (1.2.3-2) ...
Setting up libbabeltrace-ctf1:amd64 (1.2.3-2) ...
Setting up liburcu2:amd64 (0.8.5-1) ...
Setting up liblttng-ust-ctl2:amd64 (2.5.0-1) ...
Setting up liblttng-ust0:amd64 (2.5.0-1) ...
Setting up binutils (2.25-5) ...
Setting up librados2 (0.94.6-1~bpo80+1) ...
Setting up python-rados (0.94.6-1~bpo80+1) ...
Setting up librbd1 (0.94.6-1~bpo80+1) ...
Setting up python-rbd (0.94.6-1~bpo80+1) ...
Setting up python-cephfs (0.94.6-1~bpo80+1) ...
Setting up python-ceph (0.94.6-1~bpo80+1) ...
Setting up ceph-common (0.94.6-1~bpo80+1) ...
Setting up cryptsetup-bin (2:1.6.6-5) ...
Setting up ceph (0.94.6-1~bpo80+1) ...
Processing triggers for libc-bin (2.19-18+deb8u1) ...
Processing triggers for systemd (215-17+deb8u2) ...

各ノードにCephをインストールしたら、Cephの初期設定を行う。ここから先はWEBコンソールからも行えるのだが、ここではコンソールで設定を進めてしまう。
クラスタ構成ノードのうち1台で、以下のコマンドを実行する。

pveceph init --network クラスタ用ネットワークアドレス/ネットマスク(CIDR)
root@BS-PUB-MICROSERVER-01:~# pveceph init --network 10.50.10.0/24
root@BS-PUB-MICROSERVER-01:~#

各ノードで以下のコマンドを実行し、Cephモニタを作成する。

pveceph createmon
root@BS-PUB-MICROSERVER-01:~# pveceph createmon
creating /etc/pve/priv/ceph.client.admin.keyring
monmaptool: monmap file /tmp/monmap
monmaptool: generated fsid 96985e9d-da2c-4346-81fe-9bf3a31f3eb9
epoch 0
fsid 96985e9d-da2c-4346-81fe-9bf3a31f3eb9
last_changed 2016-04-03 10:51:21.153636
created 2016-04-03 10:51:21.153636
0: 10.50.10.101:6789/0 mon.0
monmaptool: writing epoch 0 to /tmp/monmap (1 monitors)
ceph-mon: set fsid to 8ef6f21a-d2ab-47c5-b8c1-9b64000ffa1e
ceph-mon: created monfs at /var/lib/ceph/mon/ceph-0 for mon.0
=== mon.0 ===
Starting Ceph mon.0 on BS-PUB-MICROSERVER-01...
Running as unit ceph-mon.0.1459648281.649190238.service.
Starting ceph-create-keys on BS-PUB-MICROSERVER-01...

※なお、以下のようなエラーメッセージが出た場合は、「/etc/network/interfaces」の記述を確認すること。(末尾にスペースが入ってるだけでもエラー扱いになるため)

root@BS-PUB-MICROSERVER-03:~# pveceph createmon
unable to find local address within network '10.50.10.0/24'

クラスタモニタを作成したら、OSDの作成を行う。
ここでは、ジャーナル用に別のディスクは用いない事にする。

pveceph createosd /dev/sdb
root@BS-PUB-MICROSERVER-01:~# pveceph createosd /dev/sdb
create OSD on /dev/sdb (xfs)
Caution: invalid backup GPT header, but valid main header; regenerating
backup header from main header.

****************************************************************************
Caution: Found protective or hybrid MBR and corrupt GPT. Using GPT, but disk
verification and recovery are STRONGLY recommended.
****************************************************************************
GPT data structures destroyed! You may now partition the disk using fdisk or
other utilities.
Creating new GPT entries.
The operation has completed successfully.
Setting name!
partNum is 1
REALLY setting name!
The operation has completed successfully.
Setting name!
partNum is 0
REALLY setting name!
The operation has completed successfully.
meta-data=/dev/sdb1              isize=2048   agcount=4, agsize=30196417 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=0        finobt=0
data     =                       bsize=4096   blocks=120785665, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=0
log      =internal log           bsize=4096   blocks=58977, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
Warning: The kernel is still using the old partition table.
The new table will be used at the next reboot.
The operation has completed successfully.

後は、「/etc/pve/storage.cfg」に追記し、cephの鍵ファイルを所定の場所に配置するだけだ。

●/etc/pve/storage.cfg(追記部分のみ抜粋)

rbd: ceph-storage
        monhost 10.50.10.101;10.50.10.102;10.50.10.103
        username admin
        pool rbd
        content images,rootdir

Cephの鍵ファイルを配置する際に気をつけたいのが、鍵ファイル名はストレージID名+.keyringとなる点だ。
つまり、上の例だと「ceph-storage.keyring」が鍵ファイル名となる。

cd /etc/pve/priv/
mkdir ceph
cp /etc/ceph/ceph.client.admin.keyring ceph/ceph-storage.keyring

後は、WEBコンソールで普通にストレージとして利用すれば良い。