Glanceの次は、CinderのストレージとしてCephを利用してみます。
ボリュームの保守性・拡張性を得ることができ、気に入ればSwiftが不要となって1つのコンポーネントの運用を減らせるため、ぼちぼちな破壊力の功績となること間違いなしです。
リンク
Glance+Ceph と同じページを参考にしています。パッケージのインストール
とりあえずCinderが欲するパッケージを入れておきます。
1 |
apt-get install ceph-common cinder-volume tgt open-iscsi sysfsutils |
sysfsutils がないと
systool is not installed
とコマンドが無いと怒られます。
systool is not installed
とコマンドが無いと怒られます。
Ceph設定
pool作成
volumes という名前でpoolを作成します。この名前は cinder.conf で設定できます。
1 |
ceph osd pool create volumes 128 |
keyingの作成
ユーザを作成し、取得します。Glanceイメージを読み込めるように images のRead権限を与えています。
1 2 3 4 5 6 7 8 9 10 11 12 |
# ユーザ作成 ceph auth get-or-create client.volumes \ mon 'allow r' \ osd 'allow class-read object_prefix rbd_children, allow rwx pool=volumes, allow rx pool=images' # 確認 ceph auth list # ローカルファイルに鍵を保存 ceph auth get-or-create client.volumes | tee /etc/ceph/keyring.volumes chmod 744 /etc/ceph/keyring.volumes chown cinder:cinder /etc/ceph/keyring.volumes |
Ceph設定
ceph.conf にユーザと鍵ファイルの設定を追記します。/etc/ceph/ceph.conf
1 2 |
[client.volumes] keyring = /etc/ceph/keyring.volumes |
設定コピー
他サーバにも ceph.conf をコピーします。
1 2 |
scp /etc/ceph/ceph.conf 192.168.0.12:/etc/ceph/ceph.conf scp /etc/ceph/ceph.conf 192.168.0.13:/etc/ceph/ceph.conf |
libvirtに鍵を登録
ComputeNode全てに鍵を送って、全て1台目と同じuuidでlibvirtにvirshで登録します。1台目でUUIDの取得まで行います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
# 鍵取得 cd ceph auth get-key client.volumes | tee client.volumes.key # 他サーバへコピー scp client.volumes.key 192.168.0.12: scp client.volumes.key 192.168.0.13: # XML作成 cat > secret.xml <<EOF <secret ephemeral='no' private='no'> <usage type='ceph'> <name>client.volumes secret</name> </usage> </secret> EOF # UUID取得 UUID=$(virsh secret-define --file secret.xml | cut -d " " -f 2) echo $UUID |
全ComputeNodeで、libvirtに鍵ファイルとUUIDを登録します。
2台目以降では $UUID は値に書き換えてください。
1 2 3 4 |
virsh secret-set-value \ --secret $UUID \ --base64 $(cat client.volumes.key) \ && rm client.volumes.key secret.xml |
注意点
CephAuth と libvirt の鍵が一致していないと、VMへのattachに失敗し、libvirtのデバッグログに CommandNotFound drive_add といったエラーが出ます。エラーログから推測しづらいので確実に設定してください。
1 2 3 4 5 |
# 鍵の一致を確認するには、この値と ceph auth get-key client.volumes # この値が一致していればOKです virsh secret-get-value --secret $UUID |
Cinder設定
cinder.conf
Cinderの設定にRBDを追加します。rbd_secret_uuid の値は適宜変更してください。/etc/cinder/cinder.conf
1 2 3 4 |
volume_driver=cinder.volume.driver.RBDDriver rbd_pool=volumes rbd_user=volumes rbd_secret_uuid=b15b9ad1-5c7d-57e0-d329-191fd1f9e2ad |
環境変数
上記設定 rbd_user で指定した値は、バグによって無視されてしまいます。このようなエラーが出て cinder-volumes が起動しません。
1 2 3 |
couldn't connect to cluster! error -2 monclient(hunting): ERROR: missing keyring, cannot use cephx for authentication librados: client.admin initialization error (2) No such file or directory |
このエラーを回避するために環境変数を設定します。
/etc/default/cinder-common
1 |
export CEPH_ARGS="--id volumes" |
再起動
Cinderを再起動します。
1 |
for init in /etc/init.d/cinder-*; do $init restart; done |
iscsiの設定
もしCinderがCephを利用する時に、NovaComputeがこのようなエラーで怒る場合、
12
Could not determine iscsi initiator name get_volume_connectorNo Volume Connector found.
1 2 |
Could not determine iscsi initiator name get_volume_connector No Volume Connector found. |
iscsiから値を取得し、
1 2 |
iscsi-iname iqn.2005-03.org.open-iscsi:4a98638d9c8 |
設定に追記します。
/etc/iscsi/initiatorname.iscsi
1 |
InitiatorName=iqn.2005-03.org.open-iscsi:4a98638d9c8 |
動作確認
一連の流れが成功すれば、Horizonからでも成功するはずです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
# Cinderボリュームの作成 cinder create --display_name test-01 2 # 確認 rbd --pool volumes ls -l # VMは作成済みとして、idを確認 nova list cinder list # VMにアタッチ # - nova volume-attach <nova id> <cinder id> <auto|/dev/vdb> nova volume-attach 1707ef7d-b448-4cef-8d4c-5b4f85d1efe9 19044769-bdb5-4390-b75e-494ca4e7fd0a /dev/vdb # VMにSSHやVNC/SPICEコンソールでログインして確認 ssh 172.31.0.11 fdisk -l mkfs.ext4 /dev/vdb mkdir /data mount /dev/vdb /data touch /data/test.txt umount /data exit # VMからデタッチ nova volume-detach 1707ef7d-b448-4cef-8d4c-5b4f85d1efe9 19044769-bdb5-4390-b75e-494ca4e7fd0a # ボリューム削除 cinder delete test-01 |
まとめてみると案外手順は少ないのですが、私はDebianでやっているせいか、動くまでにかなりの時間を要してしまいました。
それもこれもコンポーネントがいっぱいあったり、ログの内容が原因とほど遠いものだったりして、悪いやつ探しに困ったからなのですが、次回はその中でも一番困ったことについて書きたいと思います。