Cinderもそれなりにイイ子なのですが、ちょっと原因を人に伝えるのが苦手だったり、よくlibvirtdクンと喧嘩したりするので、ハマらずイケるといいですね!
ここではあえて修羅道であるCeph連携の手順を紹介しています。
パッケージ
ここまでで既に入っているはずですが、念のため見逃しそうな関連パッケージをおさらい。
1 |
apt-get install ceph-common cinder-volume tgt open-iscsi sysfsutils |
Cephの設定
特に指定がない箇所は、ControllerNodeでの作業となります。pool作成
Glance:images と同様、役割を名前にしたので volumes です。
1 |
ceph osd pool create volumes 128 |
keyringの作成
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
# Cephに認証を登録 # images に読み込み権限を与えておくことに注意 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 get-or-create client.volumes | tee /etc/ceph/keyring.volumes chmod 744 /etc/ceph/keyring.volumes chown cinder:cinder /etc/ceph/keyring.volumes # 鍵が一致しているか確認 ceph auth list cat /etc/ceph/keyring.volumes |
Ceph設定
追記して・・・/etc/ceph/ceph.conf
1 2 |
[client.volumes] keyring = /etc/ceph/keyring.volumes |
他のComputeNodeにも送っておきます。
1 2 |
scp /etc/ceph/ceph.conf 10.1.26.12:/etc/ceph/ceph.conf scp /etc/ceph/ceph.conf 10.1.26.13:/etc/ceph/ceph.conf |
libvirtの設定
1台でlibvirtに client.volumes の secret を登録し、UUIDをゲットします。同じUUIDで、他のサーバにも virsh で登録します。
1台目
鍵を取得
鍵を落として、他のサーバにも送っておきます。
1 2 3 4 5 |
cd ceph auth get-key client.volumes | tee client.volumes.key scp client.volumes.key 10.1.26.12: scp client.volumes.key 10.1.26.13: |
secretを登録
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
# XML作成 # <uuid>はつけない cat > secret.xml <<__EOT__ <secret ephemeral='no' private='no'> <usage type='ceph'> <name>client.volumes secret</name> </usage> </secret> __EOT__ # secretを定義&UUID取得 # $UUIDはメモ用に出力しておく UUID=$(virsh secret-define --file secret.xml | cut -d " " -f 2) echo $UUID 7b9017e2-45c3-952b-56d4-697f40effb14 # 鍵を登録 virsh secret-set-value \ --secret $UUID \ --base64 $(cat client.volumes.key) \ && rm client.volumes.key secret.xml |
2台目以降
secretを登録
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
# XML作成 # 1台目で取得したUUIDを値にして<uuid>をつける cat > secret.xml <<__EOT__ <secret ephemeral='no' private='no'> <uuid>7b9017e2-45c3-952b-56d4-697f40effb14</uuid> <usage type='ceph'> <name>client.volumes secret</name> </usage> </secret> __EOT__ # secretを定義&UUID取得 UUID=$(virsh secret-define --file secret.xml | cut -d " " -f 2) # 鍵を登録 virsh secret-set-value \ --secret $UUID \ --base64 $(cat client.volumes.key) \ && rm client.volumes.key secret.xml |
鍵の一致確認
ComputeNode全てにkeyを送って、全て1台目と同じuuidでvirshに登録しました。ここで全台でCephとlibvirtの鍵の値が一致しているか確認しておきます。
値が異なっていると、ボリュームのアタッチに失敗して、CommandNotFound drive_add という一見関係のないエラーになり、原因の特定が難しくなるので確実に設定しておきます。
1 2 |
ceph auth get-key client.volumes virsh secret-get-value --secret $UUID |
Cinderの設定
cinder.conf
Cephをストレージとして設定します。rbd_user は無視されてしまい
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/cinder/cinder.conf
1 2 3 4 5 6 7 8 9 10 11 12 |
verbose = False volume_driver=cinder.volume.drivers.rbd.RBDDriver rbd_pool=volumes rbd_user=volumes rbd_secret_uuid=7b9017e2-45c3-952b-56d4-697f40effb14 rabbit_host = 10.1.26.11 rabbit_port = 5672 rabbit_userid = openstack rabbit_password = Rabbitのパスワード rabbit_virtual_host = /openstack |
api-paste.ini
特に注意点はないです。/etc/cinder/api-paste.ini
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
[filter:authtoken] service_protocol = http service_host = 10.1.26.11 service_port = 5000 auth_host = 10.1.26.11 auth_port = 35357 auth_protocol = http admin_tenant_name = admin admin_user = OpenStackAdmin admin_password = 管理者のパスワード signing_dir = /var/lib/cinder |
環境変数
rbd_user を使ってくれないエラー回避で、環境変数を設定します。/etc/default/cinder-common
1 |
export CEPH_ARGS="--id volumes" |
再起動
反映します。
1 |
for init in /etc/init.d/cinder-*; do $init restart; done |
iscsiの設定
設定しないとComputeが怒るので適当な値を設定します。
1 2 3 |
# 値を取得して iscsi-iname iqn.2005-03.org.open-iscsi:f760f09179d |
設定を追加しておくだけです。
/etc/iscsi/initiatorname.iscsi
1 |
InitiatorName=iqn.2005-03.org.open-iscsi:f760f09179d |
動作確認
Cinder
Cinderでボリュームの作成と削除ができればOKです。
1 2 3 4 5 6 7 8 |
# 2GBのボリュームを作成 cinder create --display_name test-01 2 # 直接RBDを確認 rbd --pool volumes ls -l # 削除 cinder delete test-01 |
インスタンスへのアタッチ
あとは、nova create で作ったインスタンスに、cinder create で作ったボリュームをアタッチできれば完成です。(※Horizonで作成・アタッチしてもOK)手順としては少々先のものになりますが、関連強いので書いておきます。
1 2 |
# ボリュームのアタッチ nova volume-attach instance-name-01 volume-name-01 /dev/vdc |
失敗する場合は、nova, cinder, libvirtd のログを確認してください。
鍵周りなど、ここまでの設定が間違っている可能性もありますし、使っているKVMがRBDに対応していない場合もあります。ここで失敗すると、ログから原因を特定するのが非常に難しいのですが、そこは頑張ってください。
バグっぽい動作
アタッチ時のデバイス指定について2点ほど怪しい動きを確認済みです。私はCephとの連携は非常に手間取りました。ログから推測できないことがほとんどなので、いっぱいソースを眺めに行ってはデバッグを仕込むハメになります。
特に変なストレージを選択すると、かなり苦労すること間違いなしなので、覚悟してから修羅道にお入りくださいませ。