OpenStackの新機能、Cinderを使う 2ページ

LVMをバックエンドストレージとしてCinderを使う

 以下ではまずCinderのストレージとしてLVM(Logical Volume Manager)を利用する場合の設定例を紹介し、続いてNFSを使用する方法についても解説していく。

 なお、LVMをバックエンドストレージとして利用する場合、ボリュームはLVMの論理ボリューム(LV)として確保され、ボリューム1つごとに1つの論理ボリュームが作成される。また、仮想マシンインスタンスとの接続はiSCSIプロトコルを使って行われる。

Cinderのインストール

 CinderはOpenStackのほかのコンポーネントと同様、MySQLデータベースやRESTベースのAPI、AMQP(Advanced Message Queuing Protocol)によるメッセージングを利用してコンポーネント間通信を行う。それぞれのコンポーネントを異なるサーバーにインストールできる点も同じだ。基本的なインストール方法は変わらないが、構成によって設定ファイルに記述するホスト名などが変わる点には注意したい。

 CinderはEPELの「openstack-cinder」パッケージで提供されている。このパッケージをインストールすると、Cinderの利用に必要な関連パッケージなどがまとめてインストールされる。また、OpenStackの各コンポーネントで共通の各種ユーティリティが含まれる「openstack-utils」パッケージもインストールしておこう。

# sudo yum --enablerepo=epel install openstack-cinder openstack-utils

 なお、本記事で利用しているopenstack-cinderパッケージのバージョンは次のとおりだ。

# rpm -q openstack-cinder
openstack-cinder-2012.2.1-1.el6.noarch

データベースの作成

 CinderはOpenStackのほかのコンポーネントと同様、データベースに各種設定やサービスの状態を保存する。OpenStackでは使用するデータベースとしてMySQLやPostgreSQL、SQLiteを利用できるが、以下ではMySQLを利用することとする。

 MySQLを利用する場合、openstack-utilsパッケージに含まれるopenstack-dbコマンドを使用してデータベースの初期設定が可能だ。openstack-dbコマンドはNovaおよびGlance、Keystone、Cinder用のデータベース設定を行うもので、以下のようなオプションを指定できる。

openstack-db --service <サービス名> --init|--drop --password <データベース接続に使用するパスワード>

 サービス名には「nova」および「glance」、「keystone」、「cinder」が指定できる。また、データベースを作成する場合は「–init」オプションを、削除する場合は「–drop」オプションを選択する。なお、openstack-dbはローカルで稼働しているMySQLサーバーに接続してデータベースを作成する点に注意したい。つまり、MySQLサーバーが稼働しているホスト上で実行する必要がある。また、実行時にはMySQLサーバーのrootパスワードが必要だ。

 たとえばCinder用のデータベースを作成し、そのパスワードを「cinder」とするには次のように実行する。

# openstack-db --service cinder --init --password cinder
Please enter the password for the 'root' MySQL user:
Verified connectivity to MySQL.
Creating 'cinder' database.
Asking openstack-cinder to sync the database.

 なお、Cinderを稼働させているサーバーとは別のホストでMySQLを実行させている場合下記のようなエラーメッセージが表示される。これはそのホスト上にCinderの設定ファイルが存在しないために発生するエラーなので、無視しても問題ない。

runuser: user cinder does not exist
ERROR 1146 (42S02) at line 1: Table 'cinder.migrate_version' doesn't exist
Final sanity check failed.
Please file a bug report on bugzilla.redhat.com against the openstack-cinder package.

設定ファイルの編集

 Cinderの設定ファイルは/etc/cinderディレクトリ内に格納されている。主に編集が必要なのはCinder関連サービスの設定を記述したcinder.confと、CinderのAPI関連の設定が記述されたapi-paste.iniだ。

 まずcinder.confだが、変更が必要なのは下記の太字で示した部分だ。

[DEFAULT]
logdir = /var/log/cinder
state_path = /var/lib/cinder
lock_path = /var/lib/cinder/tmp
volumes_dir = /etc/cinder/volumes
iscsi_helper = tgtadm

# MySQLサーバーが稼働しているホスト名と接続に使用するユーザー名およびパスワード、データベース名を指定する
sql_connection = mysql://<ユーザー名>:<パスワード>@<ホスト名>/<データベース名>

# 使用するAMQPクライアントライブラリを指定する
rpc_backend = cinder.openstack.common.rpc.impl_kombu

# AMQPサーバー(RabbitMQサーバー)のホスト名などを追加する
rabbit_host = <AMQPサーバーが稼働しているホスト名>
rabbit_port = 5672
rabbit_userid = <接続に使用するユーザー名>
rabbit_password = <接続に使用するパスワード>
rabbit_virtual_host = <使用するバーチャルホスト名>

rootwrap_config = /etc/cinder/rootwrap.conf

# 使用するLVMのボリュームグループ(VG)を指定する設定を追加する
volume_group = <VG名>

# ホストのIPアドレスを指定する
my_ip = <ホストのIPアドレス>

# 認証にkeystoneを使用する設定を追加する
auth_strategy = keystone

[keystone_authtoken]
# keystoneへの接続に使用する情報を追加する
admin_tenant_name = <サービス用のテナント名>
admin_user = <keystoneに登録したcinder用ユーザー名>
admin_password = <keystoneに登録したcinder用パスワード>
auth_host = <keystoneが稼働しているホスト名>
auth_port = 35357
auth_protocol = http
signing_dirname = /tmp/keystone-signing-cinder

 まずデータベース名の設定だが、「mysql://<ユーザー名>:<パスワード>@<ホスト名>/<データベース名>」という形式でデータベースへの接続に使用するアカウントやサーバーなどを指定する。たとえばユーザー名およびパスワードが「cinder」、MySQLサーバーが稼働しているホストが192.168.100.20、データベース名が「cinder」だった場合は以下のようになる。

sql_connection = mysql://cinder:cinder@192.168.100.20/cinder

 続いて、使用するAMQPクライアントを指定する。AMQPサーバーとしてRabbitMQを使用している場合、クライアントライブラリとして「cinder.openstack.common.rpc.impl_kombu」を指定し、rabbit_hostやrabbit_userid、rabbit_password、rabbit_virtual_hostといった項目でRabbitMQサーバーへの接続に使用するアカウント情報を指定する。たとえばRabbitMQが稼働しているホストが192.168.100.20、ユーザー名およびパスワードが「nova」、ヴァーチャルホスト名が「/nova」だった場合、以下のような設定になる。なお、CinderはデフォルトでRabbitMQを使用するようになっており、「rpc_backend」項目が省略された場合は「cinder.openstack.common.rpc.impl_kombu」が指定されたものと見なされる。

rpc_backend = cinder.openstack.common.rpc.impl_kombu
rabbit_host = 192.168.100.20
rabbit_port = 5672
rabbit_userid = nova
rabbit_password = nova
rabbit_virtual_host = /nova

 バックエンドストレージとしてLVMを使用する場合、volume_groupおよびvolume_name_template項目で使用するLVMのボリュームグループ名を指定しておく。デフォルトでは「cinder-volume」となっているが、別のものを指定することも可能だ。

volume_group = cinder-volumes

 また、Cinderや関連サービスがほかのOpenStackコンポーネントと通信するのに使用するNICに割り当てられているIPアドレスをmy_ip項目で指定しておく。ほかのホストがCinderやストレージサービスにアクセスする際はこのIPに向けて接続が行われる。たとえば192.168.100.21というIPアドレスを利用する場合、以下のようになる。

my_ip = 192.168.100.21

 最後に、認証に使用するKeystoneの情報などを追加する。たとえば「service」テナントにCinderサービスを登録し、ユーザー名およびパスワードがともに「cinder」、Keystoneが稼働しているホストが192.168.100.20だった場合、以下のようになる。

auth_strategy = keystone

[keystone_authtoken]
admin_tenant_name = service
admin_user = cinder
admin_password = cinder
auth_host = 192.168.100.20
auth_port = 35357
auth_protocol = http

 以上でcinder.confの設定は完了だ。続いて、api-paste.iniも環境に応じて変更しておく。api-paste.iniで変更が必要なのは下記の個所だ。

[filter:authtoken]
paste.filter_factory = keystone.middleware.auth_token:filter_factory

# cinder APIを提供するホスト名およびポートを指定する
service_protocol = http
service_host = <keystoneが稼働しているホスト名>
service_port = 5000

# keystoneへの接続に使用する情報を追加する
auth_protocol = http
auth_host = <keystoneが稼働しているホスト名>
auth_port = 35357
admin_tenant_name = <サービス用のテナント名>
admin_user = <keystoneに登録したcinder用ユーザー名>
admin_password = <keystoneに登録したcinder用パスワード>

 たとえばkeystoneの「service」テナントにCinderサービスを登録し、ユーザー名およびパスワードがともに「cinder」、keystoneが稼働しているホストが192.168.100.20だった場合以下のようになる。

[filter:authtoken]
paste.filter_factory = keystone.middleware.auth_token:filter_factory
service_protocol = http
service_host = 192.168.100.20
service_port = 5000

auth_protocol = http
auth_host = 192.168.100.20
auth_port = 35357
admin_tenant_name = service
admin_user = cinder
admin_password = cinder

 以上の設定が完了したら、以下のようにcinder-manageコマンドを実行して設定をデータベースに反映させておく。

# cinder-manage db sync