« 2016年1月 | トップページ | 2016年4月 »

2016年2月の記事

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ストレージの構築

自宅のLinux環境にCephストレージを構築してみました。備忘録を兼ねて構築手順を記載します。

Cephは汎用サーバーを使った分散ストレージを構築するためのオープンソースソフトウェアです(アーキテクチャーの解説はこちら)。複数サーバーにデーターをレプリケーションする(3つのレプリケーションが推奨されています)ことで耐障害性を確保しながらペタバイトスケールの大規模ストレージが構築できます。今回は自宅のPCを使用しているので1台のサーバーで構築しており、分散ストレージにはなっていません^^;。

動作環境

  • ホストマシン:Intel NUC D34010WYKH(CPU Core i3-4010U)
  • ディスク: 起動用 256GB SSD (/dev/sdb), データー用 1TB HDD (/dev/sda)
  • メモリー: 16GB
  • NICは1ポートのみ(しかありません…)→ IPアドレス: 192.168.0.111/24
  • Linuxディストリビューション: CentOS 7.2.1511

IMG_0912.jpg

事前準備

  • ホスト名はnuc2としています。ホスト名でIPアドレス(ループバックではないアドレス)が解決できるよう /etc/hostsファイルを設定しておきます(我が家の環境では、Raspberry PiでDNSを構築しているためDNSで名前解決ができるようにしています)
  • データー用HDDをOSD(Object Storage Daemon)の数分にパーティション分割します。今回の例では2つのパーティションを作り/var/local/osd0, /var/local/osd1にマウントしています(一般的には3つのOSDにデーターをレプリケーションするのですが、所詮HDDが1台しかないので2つのOSDで済ませています)
  • ntpを設定します(chronydをインストール)

パーティションの作成は以下のイメージ(フォーマットはXFSを使っています)

# parted /dev/sda
(parted) mklabel gpt
(parted) mkpart primary xfs 0% 50%
(parted) mkpart primary xfs 51% 100%
(parted) quit

# mkfs.xfs /dev/sda1
# mkfs.xfs /dev/sda2

# mkdir /var/local/osd0  -> sda1をマウント
# mkdir /var/local/osd1  -> sda2をマウント

# lsblk
NAME            MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda               8:0    0 931.5G  0 disk 
├─sda1            8:1    0 465.8G  0 part /var/local/osd0
└─sda2            8:2    0 456.5G  0 part /var/local/osd1
sdb               8:16   0 238.5G  0 disk 
├─sdb1            8:17   0   200M  0 part /boot/efi
├─sdb2            8:18   0   500M  0 part /boot
└─sdb3            8:19   0 237.8G  0 part 
  ├─centos-root 253:0    0   180G  0 lvm  /
  ├─centos-swap 253:1    0   7.8G  0 lvm  [SWAP]
  └─centos-home 253:2    0    50G  0 lvm  /home

Cephのインストール

基本的には公式サイトのQuick Start手順に従っていますが、一部うまくいかない部分がありましたので手直しをしています。インストールしたバージョンは最新のinfernalis(9.2.0)です。当初、LTS版のhummerをインストールしようとしたのですが、yumレポジトリーにhummerを設定してもinfernalisが降ってくるので、infernalisでインストールを進めました。

以下の設定は、cephをインストールするマシン(今回の例ではhost名nuc2)で行っています。Storageノードに加えてAdminノードを立てるケースが一般的ですが、StorageノードとAdminノードを兼用しています。

1) パッケージマネージャの設定

# sudo yum install -y yum-utils && sudo yum-config-manager --add-repo https://dl.fedoraproject.org/pub/epel/7/x86_64/ && sudo yum install --nogpgcheck -y epel-release && sudo rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7 && sudo rm /etc/yum.repos.d/dl.fedoraproject.org*

2) yumレポジトリーの設定。/etc/yum.repos.d/ceph.repoに以下を設定

[ceph-noarch]
name=Ceph no arch packages
baseurl=http://ceph.com/rpm-infernalis/el7/noarch
enabled=1
gpgcheck=1
type=rpm-md
gpgkey=https://ceph.com/git/?p=ceph.git;a=blob_plain;f=keys/release.asc

3) ceph-deployのインストール

# sudo yum update && sudo yum install ceph-deploy

4) cephインストールノードにceph用アカウントを作成

ユーザー名にcephは使ってはいけません(cephデーモンが使用するため)
# useradd -d /home/cephuser -m cephuser
# passwd cephuser
# echo "cephuser ALL = (root) NOPASSWD:ALL" | sudo tee /etc/sudoers.d/cephuser
# chmod 0440 /etc/sudoers.d/cephuser

# useradd -d /home/cephadmin -m cephadmin
# passwd cephadmin

cephadminアカウントでもsudoができるように、visudoで以下を追加しておきます
cephadmin   ALL=(ALL) ALL

sudoresのrequirettyをコメントアウト
# sudo sed -i s'/Defaults    requiretty/#Defaults    requiretty'/g /etc/sudoers

5) SSH鍵の生成と配布

cephadminアカウントで実施 (passphraseはempty)
$ ssh-keygen
$ ssh-copy-id cephuser@nuc2

6) cephのインストール

以下はcephadminアカウントで実施します。

$ sudo set enforce 0

$ mkdir my-cluster
$ cd my-cluster

$ ceph-deploy new nuc2
NICカードを複数使っている場合はpublic側のnetworkをceph.confに記載する必要がありますが
今回はNICは1ポートのため設定は割愛できます。

以下の行をceph.confに追加(OSDを2つにするための設定。defaultは3なので設定が必要)
osd pool default size = 2

以下の行をceph.confに追加(OSDを複数サーバーに分散せず、シングルノードにインストールする際に必要)
osd crush chooseleaf type = 0

infernalisリリースからosdデーモンがrootではなく、osdユーザー権限で実行されるようになったため、
osdをマウントするディレクトリのオーナーをrootからosdに変更します(rootのままではインストールが
エラーになってしまいました)
$ sudo chown ceph:ceph /var/local/osd0
$ sudo chown ceph:ceph /var/local/osd1

firewallにcephが使用するポートを許可設定
$ sudo firewall-cmd --zone=public --add-port=6789/tcp --permanent

以下のcephインストールコマンドはsudoで行う必要はありません(マニュアルにはsudoは使うなと書いてあります)
$ ceph-deploy install nuc2
$ ceph-deploy mon create-initial

コマンドパラメーターにnode名:osdのディレクトリを指定します。osdのディレクトリに加えてジャーナル
ディスクを指定することができる(高速アクセスのためにはジャーナルディスクを分けることが推奨されて
いる)のですが今回はosdディスク内にジャーナルファイルを作ります(ジャーナルの指定は省略)
$ ceph-deploy osd prepare nuc2:/var/local/osd0 nuc2:/var/local/osd1
$ ceph-deploy osd activate nuc2:/var/local/osd0 nuc2:/var/local/osd1

$ ceph-deploy admin nuc2
$ sudo chmod +r /etc/ceph/ceph.client.admin.keyring

以下のコマンドでstatusがHELTH_OKと表示されれば正常に動作しています。

[cephadmin@nuc2 ~]$ ceph status
    cluster 29e648d2-a75e-4e74-a0d0-41c41bd1c300
     health HEALTH_OK
     monmap e1: 1 mons at {nuc2=192.168.0.111:6789/0}
            election epoch 1, quorum 0 nuc2
     osdmap e12: 2 osds: 2 up, 2 in
            flags sortbitwise
      pgmap v27: 64 pgs, 1 pools, 0 bytes data, 0 objects
            10306 MB used, 911 GB / 921 GB avail
                  64 active+clean

[cephadmin@nuc2 ~]$ ceph osd tree
ID WEIGHT  TYPE NAME     UP/DOWN REWEIGHT PRIMARY-AFFINITY 
-1 0.90009 root default                                    
-2 0.90009     host nuc2                                   
 0 0.45459         osd.0      up  1.00000          1.00000 
 1 0.44550         osd.1      up  1.00000          1.00000 

これだけではデーモンが起動しただけでストレージとしては使えないので、次回はOpenStackのバックエンドとしてcephを使えるようにしてみます。

アンイストールの方法

インストールに失敗した場合などは以下の手順でアンインストールができます(インストール中にエラーが出て何回かお世話になりました)。

$ ceps-deploy purge nuc2
$ ceph-deploy purgedata nuc2
$ ceps-deploy forgetkeys

参考情報


« 2016年1月 | トップページ | 2016年4月 »

2017年2月
      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        
無料ブログはココログ