[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
インスタンスを作ろうとした際に "No valid host was found. There are not enough hosts available." と怒られたときの話。
これの原因はインスタンスを作る際に適切なコンピュートノードが見つからなかった、というものである。このエラーを吐くのは nova-scheduler である。nova-scheduler は filter という構造を持っており、これを使って適切なコンピュートノードを提案する。
原因を探るには nova-scheduler のログを確認すること。標準的な手順で Ubuntu 上に構築された場合 /etc/nova/nova-scheduler.log にログが吐かれている。これでどのフィルターによって失敗したのかを確認しよう。
何を見ればいいんだっけ、とたびたびなっていたのでメモがてら。
この記事は Creative Commons by-by 3.0 で公開されている記事を翻訳したものです。その為、この記事も同じライセンスとなります。
元記事は How do I increase quota_port ? - Ask OpenStack: Q&A Site for OpenStack Users and Developers です。
How do I increase quota_port ? - Ask OpenStack: Q&A Site for OpenStack Users and Developers の翻訳です。丁度引っかかった問題でした。
今、35個の VM がある環境を扱っているのですが、 nova-scheduler.log (コントローラノード) と nova-compute.log (コンピュートノード) に次のようなエラーログが出てきました。
/usr/lib/python2.7/dist-packages/nova/network/neutronv2/api.py", line 192, in _create_port\n raise exception.PortLimitExceeded()', 'PortLimitExceeded: Maximum number of ports exceeded']
quota_port をデフォルト値の50から引き上げなければならないと考え、Horizon のコンソールから100に変更しました。しかし、やはり同じエラーが出ます。neutron.conf も確認したのですが、コントローラノードにもコンピュートノードにもそれらしい設定項目があります。いったいどれをいじればよいのでしょうか?
Neutron Server (訳註:ネットワークノードのことか。この質問であればコントローラノードが該当する) の /etc/neutron/neutron.conf を開き、 quota_port の値を編集してください。そのうえで、サーバを再起動してみてください。
日時 2014年6月26日 02:27
返答者 kobo
私の環境ではこれで上手くいったよ
日時 2015年11月20日 13:40
返答者 soppliger
Neutron Server のものを設定したうえでサーバを再起動してください。
ないしは以下のバグが関係あるかもしれません。 https://bugs.launchpad.net/nova/+bug/1247844
回答日時 2014年6月26日 00:49
回答者 mpetason
Controller or Compute って尋ねているんだからその用語で答えてやれよ……
この辺の設定については OpenStack Admin User Guide (日本語) に記されている。
ポートそのものについては OpenStack Networking Guide (日本語 かなり古い翻訳だが、該当部分は同じ) に簡単なガイドがある。これは全体を読んでおくと良いかもしれない。
手元の OpenStack をマルチリージョンにしたのだが。新しいリージョンの方に horizon からアクセスすると極端に遅い。しかし、返ってこないわけではない。ログを見ると Neutron がタイムアウトしていた。これが原因っぽいが……
理由は二つのリージョンでネットワーク構成が違った関係で利用している Neutron の機能が違ったため。最初に立てたリージョンがセルフサービスネットワークだったが、追加リージョンは NIC 節約とか調達待ちたくなかったとかそういった理由でより単純な プロバイダーネットワークを採った。
私の認識ではこれらの設定は単一の Horizon では共存できない。素直に Horizon をもう一つ立てることで解決した。なお、この新しい Horizon は元々と同じ KeyStone を参照している。
強引な解決策として Neutron への問い合わせタイムアウト時間を短くする、という手もありそうだが、色々と間違っている気がする……
以下の感じで配置している。
リージョンA コントローラノード ┐ │・Keystone │ │ │ │ │ │ │ │・Nova │ │・Neutron │ │・Glance │ │・Horizon │ └┰──────────────┘ ┃リージョンA コンピュートノード ┣┥・nova-compute │ ┃│・neutron-plugin-linuxbr..│ ┃└─────────────┘ ┃リージョンA コンピュートノード ┣┥・nova-compute │ ┃│・neutron-plugin-linuxbr..│ ┃└─────────────┘ ┃リージョンA コンピュートノード ┣┥・nova-compute │ ┃│・neutron-plugin-linuxbr..│ ┃└─────────────┘ ..
リージョンA コントローラノード ┐ │・Keystone │ │ ┝┓ │ │┃ │ │┃リージョンB コントローラノード ┐ │・Nova │┃│・Nova │ │・Neutron │┗┥・Neutron │ │・Glance │ │・Glance │ │・Horizon │ │ │ └┰──────────────┘ └┰──────────────┘ ┃リージョンA コンピュートノード ┃リージョンB コンピュートノード ┣┥・nova-compute │ ┣┥・nova-compute │ ┃│・neutron-plugin-linuxbr..│ ┃│・neutron-plugin-linuxbr..│ ┃└─────────────┘ ┃└─────────────┘ ┃リージョンA コンピュートノード ┃リージョンB コンピュートノード ┣┥・nova-compute │ ┣┥・nova-compute │ ┃│・neutron-plugin-linuxbr..│ ┃│・neutron-plugin-linuxbr..│ ┃└─────────────┘ ┃└─────────────┘ ┃リージョンA コンピュートノード ┃リージョンB コンピュートノード ┣┥・nova-compute │ ┣┥・nova-compute │ ┃│・neutron-plugin-linuxbr..│ ┃│・neutron-plugin-linuxbr..│ ┃└─────────────┘ ┃└─────────────┘ .. ..
KeyStone・Horizon 抜きの環境 (リージョン B) を作り、KeyStone はリージョン A のを使いまわす。
OpenStack Docs: OpenStack Installation Guide for Ubuntu (Liberty) に従ってセットアップしているものとする。若干古いけど、新しくなっても手順は基本的に変わらないはず。
# apt-get install software-properties-common
# add-apt-repository cloud-archive:liberty
# apt-get update && apt-get dist-upgrade
# apt-get install python-openstackclient
続けて mysql のインストールと設定、RabbitMQ のインストールと設定を行う
リージョン B のエンドポイントを追加する。リージョンA を作った時に次のようにしているとする。
$ openstack endpoint create --region RegionOne identity public http://controller-a:5000/v2.0
$ openstack endpoint create --region RegionOne identity internal http://controller-a:5000/v2.0
$ openstack endpoint create --region RegionOne identity admin http://controller-a:35357/v2.0
同じようにリージョン B の KeyStone エンドポイントを追加する。リージョン A でこの操作を行う点に注意。
$ openstack endpoint create --region RegionTwo identity public http://controller-a:5000/v2.0
$ openstack endpoint create --region RegionTwo identity internal http://controller-a:5000/v2.0
$ openstack endpoint create --region RegionTwo identity admin http://controller-a:35357/v2.0
URL は変わらず、リージョン名だけ変える所に注意。
同様に Glance のエンドポイントを追加する。
$ openstack endpoint create --region RegionTwo image public http://controller-b:9292
$ openstack endpoint create --region RegionTwo image internal http://controller-b:9292
これは URL がリージョン B のコントローラノードのものとなる。
サービスクレデンシャルはもう入っている (リージョン A をセットアップしたときに入れた) ので追加しなくてよい。
リージョン A に入れる時と同じように DB を準備し、glance 関係コンポーネント群をインストールする。[keystone_authtoken]
でリージョン A の URL を入れる必要がある点と、[database]
が自分自身の URL となるようにする必要がある点に注意。
Glance と同様に Nova のエンドポイントを追加する。
URL がリージョン B のコントローラノードのものとなる。
サービスクレデンシャルの追加はやはり不要。
気を付けるべき点は [keystone_authtoken]
、[database]
に加えて [oslo_messaging_rabbit]
だろうか。[oslo_messaging_rabbit]
はコントローラノード B を指すこと。何も考えずにガイドのサンプルをコピペしていると案外見落とすので注意。
同様に Neutron のエンドポイントを追加する。
多分、Neutron は一番複雑なサービス。設定項目も多く、見落とすポイントが多い。注意すること。
[database] | connection | mysql+pymysql://neutron:NEUTRON_DBPASS@controller-b/neutron |
[oslo_messaging_rabbit] | rabbit_host | controller-b |
[keystone_authtoken] | auth_uri | http://controller-a:5000 |
auth_url | http://controller-a:35357 | |
[DEFAULT] | nova_url | http://controller-b:8774/v2 |
[nova] | auth_url | http://controller-a:35357 |
region_name | RegionTwo |
[DEFAULT] | auth_uri | http://controller-a:5000 |
auth_url | http://controller-a:35357 | |
region_name | RegionTwo | |
nova_metadata_ip | controller-b |
[neutron] | url | http://controller-b:9696 |
auth_url | http://controller-a:35357 | |
region_name | RegionTwo |
気を付けるポイントが上述のコントローラノードと変わらないので割愛。
OpenStack の Horizon のタイムアウトが1時間なのは短すぎる、という言葉を頂き、設定を見直そうとしてみたがうまくいかなかった話。
Horiozon の設定ファイル (local_settings.py) 内に、SESSION_TIMEOUT
という値を追記することでタイムアウトまでの時間を変更できる (公式ドキュメント)。
しかし、公式ドキュメントには次のようにあった。
This SESSION_TIMEOUT is a method to supercede the token timeout with a shorter horizon session timeout (in seconds). So if your token expires in 60 minutes, a value of 1800 will log users out after 30 minutes.
"SESSION_TIMEOUT は Horizon のセッションタイムアウトをより短い時間で上書きするために提供されている手段です。例え、トークンが60分後に失効するとしても、この値に1,800を代入しておけば30分後にユーザは強制的にログアウトさせられます"。……「timeout with a shorter (タイムアウトをより短い時間で)」とある。
Horizon のセッションタイムアウトは初期値が1時間となっている。これは実際に Horizon からログインして Cookie を確認すればわかる。
試しに SESSION_TIMEOUT = 1800
として試してみた。Apache を再起動し、Horizon にログインする。そのうえで Cookie を確認したところ、30分後になっていた。
次は SESSION_TIMEOUT = 4200
(1時間10分) として試してみた。再度ログインしたが、 Cookie は1時間後に無効になるように設定されていた。やはり1時間より長く設定することはできないようだ。
質問日時 2014年6月17日 15:37
質問者 pap