Basic Installation Guide for Ubuntu 12.04 (LTS) and Debian WheezyをIPも含め、完全コピーして自宅で使っていたOpenStack(Grizzly)を、時間がある年末にHavanaにバージョンアップした。
バージョンアップの手順がないので、とりあえずパッケージをアップグレードして、後はインストールガイドを参考に試行錯誤。ダウンタイムは3日程度?。その間に睡眠や買い出し、窓ふきなどの大掃除とか。それでもなんとかバージョンアップ前のインスタンス、ネットワークは使えた。ボリュームは対応途中で削除してしまったけど、そのままで対応すれば動いたかも。せっかくなので、パッケージアップグレードし、設定ファイルを一通り編集して起動した後におこった障害を記録しておく。(いきあたりばったりで起きたものばかりだけど)
その前に、知っていればよかったこと。
パッケージのアップグレード
sudo add-apt-repository cloud-archive:havana sudo apt-get update sudo apt-get upgrade
とする。このあと保留になったパッケージをインストールするには
sudo apt-get dist-upgrade
とする。
sudo apt-get -s dist-upgrade
でテストできるのでやってみると便利。
データベースマイグレーション
いろいろ調べて直す前に知っておきたかったこととして、nova,cinder,glance,neutronはデータベースのマイグレーションが勝手に動かないので、パッケージインストールしたあと自分でやる必要がある。keystoneはパッケージ入れたら動いていたので、ほかも動くかと思ったら違う。neutronはリリースノートに書いてあり、アップグレードする前に
quantum-db-manage --config-file /path/to/quantum.conf --config-file /path/to/plugin/conf.ini stamp grizzly
アップグレードした後に
neutron-db-manage --config-file /path/to/quantum.conf --config-file /path/to/plugin/conf.ini upgrade havana
と書いてある。neutronだけはデータベースマイグレーションがalembicなので特別らしい。nova,cinder,glanceは
*-manage db sync
みたいなやつを単純に実行すればいい。
それでは以降でパッケージアップグレードし、設定ファイルを一通り編集して起動した後に起こった障害?を書いていく。
コマンドが実行できない
source openrc
したあとコマンド実行すると
'Client' object has no attribute 'service_catalog'
と表示されて、コマンドがいっさい実行できなかった。これはずばり、
http://abhisarswami.blogspot.jp/2013/01/openstack-keystone-client-object-has-no.html
に書いてあり、
export SERVICE_TOKEN= export SERVICE_ENDPOINT=
とするなどして、SERVICE_TOKENとSERVICE_ENDPOINTを設定しないようにして解決した。
compute nodeのアップグレードが失敗
compute nodeでアップグレードしたら依存関係で正常終了せず、以下のメッセージが出た。
以下のパッケージには満たせない依存関係があります:
kvm-ipxe : 依存: ipxe-qemu しかし、インストールされようとしていません
qemu-kvm : 依存: qemu-system-x86 (>= 1.5.0+dfsg-3ubuntu5~cloud0)
E: 問題を解決することができません。壊れた変更禁止パッケージがあります。
これは検索しても解決策が見当たらず。インストールガイドを見ると、compute nodeに明示的にqemu-kvmやkvm-ipxeなどをインストールしていなかったので、エラーになるパッケージをとことん削除する方針にした結果、以下を削除した。
qemu-system-x86 qemu-kvm kvm nova-compute-kvm nova-compute
そして、インストールガイドの通りに。
sudo apt-get install nova-compute-kvm python-guestfs
“Unknown column ‘services.disabled_reason’ in ‘field list'”
このあと、とりあえずHorizonにログインしてみたらエラーが出てた。どんなエラーか忘れてしまったけど、novaのどれかのログに以下のエラーが出ていた。
2013-12-29 22:40:53.848 2119 TRACE nova.api.openstack OperationalError: (OperationalError) (1054, "Unknown column 'services.disabled_reason' in 'field list'") 'SELECT services.created_at AS services_created_at, services.updated_at AS services_updated_at, services.deleted_at AS services_deleted_at, services.deleted AS services_deleted, services.id AS services_id, services.host AS services_host, services.`binary` AS services_binary, services.topic AS services_topic, services.report_count AS services_report_count, services.disabled AS services_disabled, services.disabled_reason AS services_disabled_reason \nFROM services \nWHERE services.deleted = %s' (0,)
検索するとhttps://bugs.launchpad.net/nova/+bug/1194792が出てきて、やはりデータベースマイグレーションが必要だった。
nova-manage db sync
を実行した。
VMにping失敗
novaを直したので、VMが気になりVMにnamespace内からpingしてみたら、まったく反応がなし。来たよneutron、と思ってログを見ると/var/log/neutron/openvswitch-agent.logに
ERROR neutron.plugins.openvswitch.agent.ovs_neutron_agent [-] No tunnel_type specified, cannot create tunnels
と出ていた。設定ファイルを見たところ、追加設定があった。
/etc/neutron/plugins/openvswitch/ovs_neutron_plugin.ini
に
[ovs] tunnel_type=gre ....... [agent] tunnel_types = gre .......
を追加した。
“Table ‘cinder.volume_admin_metadata’ doesn’t exist”
次にボリューム一覧が出なかった。そろそろデータベースマイグレーションを疑いつつログを見ると、
2013-12-30 15:01:32.872 30632 TRACE cinder.service ProgrammingError: (ProgrammingError) (1146, "Table 'cinder.volume_admin_metadata' doesn't exist") 'SELECT volumes.created_at AS volumes_created_at, volumes.updated_at AS volumes_updated_at, volumes.deleted_at AS volumes_deleted_at, volumes.id AS volumes_id, volumes._name_id AS volumes__name_id,
とあり、やはりマイグレーションが必要のようだったので、
cinder-manage db sync
を実行した。
GlanceでExit code: 127
ここまでくるとglanceも疑う。どこかのログに
Exit code: 127 Stdout: '' Stderr: '/bin/sh: 1: collie: not found\n' Disabling add method. 2013-12-30 14:49:50.507 29642 WARNING glance.store.base [-] Failed to configure store correctly: Store cinder could not be configured correctly. Reason: Cinder storage requires a context. Disabling add method. 2013-12-30 14:49:50.514 29642 WARNING glance.api.v2.images [-] Could not find schema properties file schema-image.json. Continuing without custom properties
とあったので、いちおう
glance-manage db_sync
を実行した。
ルータ一覧がエラー
ネットワークの管理はネットワークトポロジーとネットワークは開けたが、ルーターがエラーになってしまった。ログを見ると
TRACE neutron.openstack.common.rpc.amqp OperationalError: (OperationalError) (1054, "Unknown column 'routers.enable_snat' in 'field list'")
とあった。すでにneutronにしていたので、適当に以下を(たぶん)実行した。
$ neutron-db-manage --config-file /etc/neutron/neutron.conf --config-file /etc/neutron/plugins/openvswitch/ovs_neutron_plugin.ini stamp grizzly $ neutron-db-manage --config-file /etc/neutron/neutron.conf --config-file /etc/neutron/plugins/openvswitch/ovs_neutron_plugin.ini upgrade havana
しかし、portbindingsテーブルはすでに存在する、というようなメッセージが出てマイグレーションが失敗してしまう。実際portbindingsテーブルは存在していて、データはない。やむを得ずテーブルを削除して再度upgradeするとまた別のテーブルがあるというエラーに。。やけになって失敗するたびに存在するテーブルを削除して再実行、何度かやって最終的には成功。(http://alembic.readthedocs.org/en/latest/tutorial.htmlみて、downgrade grizzlyのあとupgradeしても失敗)
最後に
INFO [alembic.migration] Running upgrade 27ef74513d33 -> havana, havana
と出たのでたぶん成功。
ボリュームのアタッチができない
Horizonですべて表示できていそうだったので、うれしくて使い始めると、今度はボリュームのアタッチができない。Horizonで実行しても元通りになってしまい、コマンドで実行するとなにごともなく返ってくる割にavailableのまま。ログには
2013-12-30 23:11:04.581 31892 TRACE nova.openstack.common.rpc.amqp Command: sudo nova-rootwrap /etc/nova/rootwrap.conf iscsiadm -m node -T iqn.2010-10.org.openstack:volume-8978b858-22d9-4347-9690-0c2a6347d595 -p 10.0.0.10:3260 --rescan 2013-12-30 23:11:04.581 31892 TRACE nova.openstack.common.rpc.amqp Exit code: 255 2013-12-30 23:11:04.581 31892 TRACE nova.openstack.common.rpc.amqp Stdout: '' 2013-12-30 23:11:04.581 31892 TRACE nova.openstack.common.rpc.amqp Stderr: 'iscsiadm: No portal found.\n'
とあった。ここは何も変更してないはずなので、iSCSI周りをいろいろ調べた。10.0.0.10がよくないのかと思い、cinder.conf、nova.confに
iscsi_ip_address=10.10.10.10
を追加しても、状況は変わらず。かなり絶望しつつ検索すると、ずばりhttp://ubuntuforums.org/showthread.php?t=2045883にiscsitargetを削除しろとあった。ねんのため、
apt-get remove --purge iscsitarget
を実行後、リブートした。
以上、起こった障害を書いてみた。実際やってみた感想としては、思ったより難しくなく、かといって簡単でもない、といったところか。