Glanceイメージの保存先は、基本はGlanceが動いているサーバのローカルファイルですが、分散ストレージなどに変更することができます。
今回は分散ストレージSwiftを構築し、Glanceで利用する手順になります。
ただ、Swiftは面倒なわりに、OpenStackにおいてはGlanceの保存場所としてしか利用しないので、VMイメージ/スナップショットの重要性を考慮した上で手がけるとよいと思います。
サーバ構成
Swiftは分散ストレージなので、堅牢性を考慮して最低3台となります。インストールにはPuppetの力を借りるので、ControllerNodeをPuppetMaster+PuppetAgent、他の2台をPuppetAgentのみとします。
Puppetの準備
Wheezy+Folsomでは、公開されているPuppetマニフェストを用いてインストールします。まずは、ControllerNodeにPuppetMasterを用意します。
PuppetMaster+Agentのインストール
1 2 3 |
apt-get install \ libmysql-ruby ruby-activerecord-2.3 sqlite3 ruby-sqlite3 \ puppetmaster puppet |
設定
/etc/puppet/puppet.conf
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 |
[main] logdir=/var/log/puppet vardir=/var/lib/puppet ssldir=/var/lib/puppet/ssl rundir=/var/run/puppet factpath=$vardir/lib/facter templatedir=$confdir/templates prerun_command=/etc/puppet/etckeeper-commit-pre postrun_command=/etc/puppet/etckeeper-commit-post pluginsync=true pluginsource = puppet:///oldplugins/ storeconfigs=true server=192.168.140.3 [master] # These are needed when the puppetmaster is run by passenger # and can safely be removed if webrick is used. ssl_client_header = SSL_CLIENT_S_DN ssl_client_verify_header = SSL_CLIENT_VERIFY storeconfigs=true # Needed for storeconfigs=true dbadapter=mysql dbname=puppet dbuser=puppet dbpassword=password dbserver=localhost dbsocket=/var/run/mysqld/mysqld.sock |
このエラーが出る場合、追記設定します。
/etc/puppet/fileserver.conf
1 2 3 |
[oldplugins] path /var/lib/puppet/lib allow * |
MySQLの設定
既に入っているMySQLを利用するので、DBとユーザだけ作ります。
1 2 |
mysqladmin create puppet -p mysql -p -e "GRANT ALL on puppet.* to 'puppet'@'localhost' identified by 'password';" |
Puppet用OpenStackモジュールのインストール
Gitから落として配置します。
1 2 3 4 5 6 |
cd /etc/puppet git clone git://github.com/fedora-openstack/openstack-puppet.git openstack-puppet && \ cd openstack-puppet && git submodule init && git submodule update mv openstack-puppet/modules ./ cp modules/swift/examples/multi.pp manifests/site.pp rm -R openstack-puppet/ |
マニフェスト編集
/etc/puppet/manifests/site.pp
1 2 3 4 5 6 |
# salt変更 $swift_shared_secret='openstacksalt' # _eth1 を削除 #$swift_local_net_ip = $ipaddress_eth1 $swift_local_net_ip = $ipaddress |
facter -p
で確認できます
あとは好みで名前を変えました。
/etc/puppet/modules/swift/manifests/init.pp
1 |
:%s/openstack-swift/swift/g |
/etc/puppet/modules/swift/manifests/storage.pp
1 |
:%s/openstack-swift/swift/g |
/etc/puppet/modules/swift/manifests/proxy.pp
1 |
:%s/openstack-swift-/swift-/g |
再起動
全ホストのautosignを有効にしておきます。
1 |
echo '*' > /etc/puppet/autosign.conf |
いったん再起動します。
1 |
/etc/init.d/puppetmaster restart |
ControllerNodeでデプロイ
Swift設定をデプロイします。
1 2 3 |
chown -R puppet:puppet /var/lib/puppet/ puppet agent --certname=swift_storage_1 --server=192.168.140.3 --verbose --debug --test /etc/init.d/xinetd reload |
cronでエラー出力されたら
1 |
rm /var/lock/swift-recon-object-cron |
ComputeNodeにデプロイ
残る2台にもPuppetを入れてSwiftをデプロイします。
1 2 3 4 5 6 7 8 9 |
apt-get update apt-get install python2.7 python2.7-minimal libpython2.7 \ puppet ruby-sqlite3 # certnameはサーバごとに変更します # 2台目で puppet agent --certname=swift_storage_2 --server=192.168.140.3 --verbose --debug --test # 3台目で puppet agent --certname=swift_storage_3 --server=192.168.140.3 --verbose --debug --test |
全サーバでSwift設定
Swift用にloopback deviceを用意
ディスクイメージと、マウントディレクトリを作成します。
1 2 3 4 5 |
mkdir -p /data/swift/loopback dd if=/dev/zero of=/data/swift/loopback/01.img bs=1 count=0 seek=100G mkfs.xfs -i size=1024 /data/swift/loopback/01.img mkdir -p /data/swift/volume/01 |
fstabを編集して、
/etc/fstab
1 |
/data/swift/loopback/01.img /data/swift/volume/01 xfs loop,noatime,nodiratime,nobarrier,logbufs=8 0 0 |
マウントしておきます。
1 2 |
mount -a chown -R swift:swift /data/swift/volume |
rsync設定
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 |
mkdir /var/lock/swift /var/log/swift chown swift:swift /var/lock/swift /var/log/swift cat << EOF | tee /etc/rsync.conf > /dev/null uid = swift gid = swift log file = /var/log/swift/rsyncd.log pid file = /var/run/swift/rsyncd.pid address = 0.0.0.0 [account] max connections = 20 path = /data/swift/volume read only = false lock file = /var/lock/swift/account.lock [container] max connections = 20 path = /data/swift/volume read only = false lock file = /var/lock/swift/container.lock [object] max connections = 20 path = /data/swift/volume read only = false lock file = /var/lock/swift/object.lock EOF /etc/init.d/xinetd restart |
Swift設定
devicesを追加します。account server
/etc/swift/account-server.conf
1 2 |
[DEFAULT] devices = /data/swift/volume |
container server
/etc/swift/container-server.conf
1 2 |
[DEFAULT] devices = /data/swift/volume |
object server
/etc/swift/object-server.conf
1 2 |
[DEFAULT] devices = /data/swift/volume |
hashの確認
全台で同じ値になっていること(puppetで配布されています)。/etc/swift/swift.conf
1 |
swift_hash_path_suffix = openstacksalt |
起動
1 2 3 4 5 6 7 8 |
/etc/init.d/swift-account start /etc/init.d/swift-container start /etc/init.d/swift-object start # 確認 lsof -i:6002 lsof -i:6001 lsof -i:6000 |
ControllerNodeでSwift設定
swift proxyの設定
1 2 |
apt-get update puppet agent --certname=swift_proxy --server=192.168.140.3 --verbose --debug --test |
設定は変更箇所のみ記載します。
/etc/swift/proxy-server.conf
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 |
[DEFAULT] workers = 8 [pipeline:main] #pipeline = catch_errors healthcheck cache ratelimit tempauth proxy-logging proxy-server pipeline = healthcheck cache tokenauth keystone proxy-server # 一行追加 [filter:cache] memcache_servers = 192.168.140.3:11211 # 以下、最後尾に追加 [filter:tokenauth] paste.filter_factory = keystone.middleware.auth_token:filter_factory service_port = 5000 service_protocol = http service_host = 192.168.140.3 auth_port = 35357 auth_protocol = http auth_host = 192.168.140.3 admin_token = AuthToken [filter:keystone] paste.filter_factory = keystone.middleware.swift_auth:filter_factory operator_roles = admin, swiftoperator, projectmanager |
再起動します。
1 |
/etc/init.d/swift-proxy restart |
Ringの作成
サーバごとにagentを実行しておきます。
1 2 3 |
puppet agent --certname=swift_storage_1 --server=192.168.140.3 --verbose --debug --test puppet agent --certname=swift_storage_2 --server=192.168.140.3 --verbose --debug --test puppet agent --certname=swift_storage_3 --server=192.168.140.3 --verbose --debug --test |
Ringを作成します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
cd /etc/swift/ swift-ring-builder account.builder create 10 3 1 swift-ring-builder container.builder create 10 3 1 swift-ring-builder object.builder create 10 3 1 swift-ring-builder account.builder add z0-192.168.140.3:6002/01 1 swift-ring-builder account.builder add z1-192.168.140.11:6002/01 1 swift-ring-builder account.builder add z2-192.168.140.15:6002/01 1 swift-ring-builder account.builder rebalance swift-ring-builder container.builder add z0-192.168.140.3:6001/01 1 swift-ring-builder container.builder add z1-192.168.140.11:6001/01 1 swift-ring-builder container.builder add z2-192.168.140.15:6001/01 1 swift-ring-builder container.builder rebalance swift-ring-builder object.builder add z0-192.168.140.3:6000/01 1 swift-ring-builder object.builder add z1-192.168.140.11:6000/01 1 swift-ring-builder object.builder add z2-192.168.140.15:6000/01 1 swift-ring-builder object.builder rebalance # 確認 swift-ring-builder account.builder swift-ring-builder container.builder swift-ring-builder object.builder |
Swift動作確認
tempauth版
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
cd /etc/puppet/modules/swift/ext ruby swift.rb getting credentials: curl -k -v -H 'X-Storage-User: test:tester' -H 'X-Storage-Pass: testing' http://127.0.0.1:8080/auth/v1.0 verifying connection auth: curl -k -v -H 'X-Auth-Token: AUTH_tkd2365b298a464133889e68ee9202de00' http://127.0.0.1:8080/v1/AUTH_test Testing swift: swift -A http://127.0.0.1:8080/auth/v1.0 -U test:tester -K testing stat found containers/objects: 0/0 Uploading file to swift with command: swift -A http://127.0.0.1:8080/auth/v1.0 -U test:tester -K testing upload my_container /tmp/foo1 tmp/foo1 Downloading file with command: swift -A http://127.0.0.1:8080/auth/v1.0 -U test:tester -K testing download my_container tmp/foo1 [headers 0.007s, total 0.007s, 0.001s MB/s] Dude!!!! It actually seems to work, we can upload and download files!!!! cat /tmp/foo1 /tmp/test/downloadtest/tmp/foo1 rm /tmp/foo1 /tmp/test/downloadtest/tmp/foo1 |
pipelineをkeystoneに変更していたら利用できません。
keystone版
Swift用のEndpointをKeystoneに追加します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
keystone endpoint-list keystone service-list function get_id () { echo `"$@" | awk '/ id / { print $4 }'` } SERVICE_HOST=192.168.140.3 SWIFT_SERVICE=$(get_id keystone service-create \ --name=swift \ --type=object-store \ --description="Object Storage Service") keystone endpoint-create \ --region RegionOne \ --service_id $SWIFT_SERVICE \ --publicurl "http://$SERVICE_HOST:8080/v1/AUTH_%(tenant_id)s" \ --adminurl "http://$SERVICE_HOST:8080/v1" \ --internalurl "http://$SERVICE_HOST:8080/v1/AUTH_%(tenant_id)s" |
接続確認します。
1 |
swift -U admin:admin -K root stat |
Glance + Swiftに変更する
Glanceのローカル登録を削除しておきます。
1 2 |
glance index glance image-delete ... |
swiftに変更します。
/etc/glance/glance-api.conf
1 2 3 4 5 6 |
default_store = swift swift_store_auth_address = http://192.168.140.3:5000/v2.0/ swift_store_user = admin:admin swift_store_key = root swift_store_create_container_on_put = True swift_store_large_object_size = 5120 |
再起動します。
1 |
/etc/init.d/glance-api restart |
適当にイメージを再登録してみます。
1 2 3 4 5 6 7 |
cd /data/vmimage/ glance add name=Debian-7.0 is_public=true \ disk_format=qcow2 container_format=ovf < debian-7.0testing.img # 確認 glance index find /data/swift/volume/ -type f -ls | less |
ここまでで、Puppetを使ったにも関わらずこの面倒くささ・・・Swift自体は単発でも使えそうなくらい悪くないと思いますが、ここからさらにデータのバックアップや移行など運用面も検証しなくてはならず、そのわりにGlanceだけという・・・
ならばCephを構築してGlanceとCinder両方で使ってしまえ!というのが理想なのですが、そちらもなかなか難しく。Glanceは別に落ちても致命傷にはなりませんし、あまり追求しないのであれば、GlanceのサーバがミラーリングRAIDならば十分とも思いますがどうなんでしょう・・・
だんだんと書くのが億劫になってきたOpenStack!まだまだ続きます:-)