CephをOpenStackのバックエンドにする
前回の記事でCephのインストールを行いましたが、今回はCephをOpenStackのバックエンドに接続してみました。Nova ehpemeral、Cinder volume、Glande image storeにCeph RBDを使えるようにしました。基本的にはceph.comの設定手順に従っていますが、一部ドキュメントに書いていない設定が必要だったりして結構悩みました。
当方、OpenStackはまだまだ初心者で、かつ構築した環境はPC1台(Ceph) + PC1台(OpenStack)のミニマム環境ですので、参考程度にして下さい(全部の動作を確認できていないので、商用システムに適用する場合は十分な試験が必要です)。
動作環境
- ホストマシン: Intel NUC D54250WYKH(CPU Core i5-4250U)
- ディスク: 1TB HDD
- メモリー: 16GB
- Linuxディストリビューション: CentOS 7.2.1511
- OpenStackバージョン: Kilo(RDO Packstackを使ってAll-In-One構成でインストール済み)
ネットワーク構成
構築手順
1) Cephプロトコルパケットが疎通できるようにする
デフォルトのFirewall設定があるとCephのパケットが疎通しません。Cephノード(NUC2)側は面倒 なのでfirewallをdisable。 [root@nuc1 ~]# iptables -A INPUT -i br-ex -p tcp -s 192.168.0.0/24 --dport 6789 -j ACCEPT [root@nuc2 ~]# systemctl disable firewalls
2) Cephプールの生成
CephドキュメントではPG数を128にしていますが、当方の環境ではOSDが2つしかなく、PG数の合計が超過 してしまうので32に減らしました。PG数の値は適当なので、本来は最適化が必要です。 [cephadmin@nuc2 ~]$ ceph osd pool create volumes 32 [cephadmin@nuc2 ~]$ ceph osd pool create images 32 [cephadmin@nuc2 ~]$ ceph osd pool create backups 32 [cephadmin@nuc2 ~]$ ceph osd pool create vms 32
3) OpenStackノード(NUC1)の環境設定
[root@nuc1 ~]# mkdir /etc/ceph [cephadmin@nuc2 ~]$ scp /etc/ceph/ceph.conf root@nuc1:/etc/ceph [cephadmin@nuc2 ~]$ scp /etc/yum.repos.d/ceph.repo root@nuc1:/etc/yum.repos.d [root@nuc1 ~] visudoで次の行をコメントアウト→ # Defaults requiretty [root@nuc1 ~]# yum install python-rbd [root@nuc1 ~]# wget ftp://ftp.pbone.net/mirror/ftp5.gwdg.de/pub/opensuse/repositories/home:/dalgaaf:/ceph/CentOS_CentOS-6/x86_64/libleveldb1-1.9-6.1.x86_64.rpm [root@nuc1 ~]# rpm -ivh libleveldb1-1.9-6.1.x86_64.rpm [root@nuc1 ~]# yum install ceph [root@nuc1 ~]# yum install libvirt [root@nuc2 ~]# yum install qemu-img.x86_64 [root@nuc2 ~]# yum install libvirt-daemon-driver-qemu.x86_64
4) Cephの認証とアクセス権の設定
[cephadmin@nuc2 ~]$ ceph auth get-or-create client.cinder mon 'allow r' osd 'allow class-read object_prefix rbd_children, allow rwx pool=volumes, allow rwx pool=vms, allow rx pool=images' [cephadmin@nuc2 ~]$ ceph auth get-or-create client.glance mon 'allow r' osd 'allow class-read object_prefix rbd_children, allow rwx pool=images' [cephadmin@nuc2 ~]$ ceph auth get-or-create client.cinder-backup mon 'allow r' osd 'allow class-read object_prefix rbd_children, allow rwx pool=backups' [cephadmin@nuc2 ~]$ ceph auth list
5) キーリングをOpenStackノードに転送
[cephadmin@nuc2 ~]$ ceph auth get-or-create client.glance | ssh root@nuc1 sudo tee /etc/ceph/ceph.client.glance.keyring [cephadmin@nuc2 ~]$ ssh root@nuc1 sudo chown glance:glance /etc/ceph/ceph.client.glance.keyring [cephadmin@nuc2 ~]$ ceph auth get-or-create client.cinder | ssh root@nuc1 sudo tee /etc/ceph/ceph.client.cinder.keyring [cephadmin@nuc2 ~]$ ssh root@nuc1 sudo chown cinder:cinder /etc/ceph/ceph.client.cinder.keyring [cephadmin@nuc2 ~]$ ceph auth get-or-create client.cinder-backup | ssh root@nuc1 sudo tee /etc/ceph/ceph.client.cinder-backup.keyring [cephadmin@nuc2 ~]$ ssh root@nuc1 sudo chown cinder:cinder /etc/ceph/ceph.client.cinder-backup.keyring
6) OpenStackノードにlibvirtのシークレットキーを設定
[cephadmin@nuc2 ~]$ ceph auth get-key client.cinder | ssh root@nuc1 tee client.cinder.key [root@nuc1 ~]# uuidgen 28c8fcca-5cc3-4ba6-961c-01e617474e1a cat > secret-cinder.xml << EOF <secret ephemeral='no' private='no'> <uuid>28c8fcca-5cc3-4ba6-961c-01e617474e1a</uuid> <usage type='ceph'> <name>client.cinder secret</name> </usage> </secret> EOF [root@nuc1 ~]# virsh secret-define --file secret-cinder.xml [root@nuc1 ~]# virsh secret-set-value --secret 28c8fcca-5cc3-4ba6-961c-01e617474e1a --base64 $(cat client.cinder.key) [root@nuc1 ~]# virsh secret-list [root@nuc1 ~]# virsh secret-get-value 28c8fcca-5cc3-4ba6-961c-01e617474e1a
7) OpenStackノードで /etc/glance/glance-api.conf を編集
default_store = rbd stores = rbd rbd_store_pool = images rbd_store_user = glance rbd_store_ceph_conf = /etc/ceph/ceph.conf rbd_store_chunk_size = 8 show_image_direct_url = True
8) OpenStackノードで /etc/cinder/cinder.conf を編集
[ceph] volume_driver = cinder.volume.drivers.rbd.RBDDriver volume_backend_name = ceph enabled_backends = ceph rbd_pool = volumes rbd_ceph_conf = /etc/ceph/ceph.conf rbd_flatten_volume_from_snapshot = false rbd_max_clone_depth = 5 rbd_store_chunk_size = 4 rados_connect_timeout = -1 glance_api_version = 2 rbd_user = cinder rbd_secret_uuid = 28c8fcca-5cc3-4ba6-961c-01e617474e1a backup_driver = cinder.backup.drivers.ceph backup_ceph_conf = /etc/ceph/ceph.conf backup_ceph_user = cinder-backup backup_ceph_chunk_size = 134217728 backup_ceph_pool = backups backup_ceph_stripe_unit = 0 backup_ceph_stripe_count = 0 restore_discard_excess_bytes = true #enabled_backends=lvm —> コメントアウト [lvm] —> 以下をコメントアウト #iscsi_helper=lioadm #volume_group=cinder-volumes #iscsi_ip_address=192.168.0.110 #volume_driver=cinder.volume.drivers.lvm.LVMVolumeDriver #volumes_dir=/var/lib/cinder/volumes #iscsi_protocol=iscsi #volume_backend_name=lvm
9) OpenStackノードで /etc/nova/nova.conf を編集
[libvirt] images_type = rbd images_rbd_pool = vms images_rbd_ceph_conf = /etc/ceph/ceph.conf ユーザーがcinderになっていますが、client.cinderにvms(nova ephmeral用のプール)への アクセス権を設定しているためこの指定で問題ありません。 rbd_user = cinder rbd_secret_uuid = 28c8fcca-5cc3-4ba6-961c-01e617474e1a disk_cachemodes="network=writeback" inject_password = false inject_key = false inject_partition = -2 cephのドキュメントにはKiloでは次の設定を追加するように記載がありますが、CentOS 7のqemu バージョンではこの設定があるとVM起動時にNo valid hostのエラーが発生します。 #hw_disk_discard = unmap ==> コメントアウトが必要
10) OpenStackノードでのCephの設定
/etc/ceph/ceph.conf に以下を追記 [client] rbd cache = true rbd cache write through until flush = true admin socket = /var/run/ceph/guests/$cluster-$type.$id.$pid.$cctid.asok log file = /var/log/qemu/qemu-guest-$pid.log rbd concurrent management ops = 20 [client.cinder] keyring=/etc/ceph/ceph.client.cinder.keyring [client.cinder-backup] keyring=/etc/ceph/ceph.client.cinder-backup.keyring [client.glance] keyring=/etc/ceph/ceph.client.glance.keyring 以下のコマンドを実行 [root@nuc1 ~]# mkdir -p /var/run/ceph/guests/ /var/log/qemu/ [root@nuc1 ~]# groupadd libvirtd [root@nuc1 ~]# chown qemu:libvirtd /var/run/ceph/guests /var/log/qemu/
11) 各プロセスを再起動
sudo systemctl restart openstack-glance-api sudo systemctl restart openstack-nova-compute sudo systemctl restart openstack-cinder-volume sudo systemctl restart openstack-cinder-backup
12) Cinderでcephを使えるようにする設定(これは必要ないかもしれません)
[Openstack admin]# cinder type-create ceph [Openstack admin]# cinder type-key ceph set volume_backend_name=ceph
ハマったところ
当初以下の設定が抜けており、CinderのVolumeからVMをブートできるのですが、ブート後Cinder volumeの状態がVMからdetach(切り離し)になりNovaとCinderでvolumeの状態がアンマッチになってしまいました。この状態になるとNovaでVMを削除できなくなり、mysqlコマンドで強制的にDBを削除する羽目になりました。
volume_backend_name = ceph
enabled_backends = ceph
NovaのephemeralをcephにするとNo valid hostのエラーになり起動できない問題にずいぶん悩みました。社内の有識者から、"hw_disk_discard = umap”の設定をコメントアウトすると良いと教えてもらいやっと解決。ドキュメント通りの設定では上手くいかない罠でした。
Glanceイメージが削除できなくなる。当初の設定誤りでCinder volumeから起動したVMを削除できなくなった際にDBを強制的にクリアしたのですが、cephのimageファイルはロックされたままになったようでcephのコマンドでも削除ができず、仕方なくceph poolを削除して再設定しました。
OpenStackはDB間のリンクが結構複雑で相互のアンマッチが起きるとリカバリーができなくなる危険があることが分かりました。本番システムで使う場合はしっかりと試験をしないと危険ですね。
Cephのパフォーマンス
当方の環境では、HDD 1台を 2パーティションに分割してOSD x 2の構成で運用しているため書き込み速度は遅いです。ddを使って書き込み速度を図ると、普通に書き込んだ場合に比べて約半分の速度しか出ていません。これは同一HDDに対してレプリカを書き込むためにライトが2回発生しているためだと思います。OSD用のサーバーを複数設置しないと本来のパフォーマンスは出ないのだと思います。
参考情報
最近のコメント