« Cephストレージの構築 | トップページ | mbed TY51822r3でmbed OSを使う »

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構成でインストール済み)

ネットワーク構成


201602210741.jpg

構築手順

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用のサーバーを複数設置しないと本来のパフォーマンスは出ないのだと思います。

参考情報


« Cephストレージの構築 | トップページ | mbed TY51822r3でmbed OSを使う »

クラウド」カテゴリの記事

コメント

この記事へのコメントは終了しました。

2018年10月
  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 30 31      
無料ブログはココログ