新しいインスタンスの作成
次に説明するのは、新しいインスタンスを作成する機能です。
コンピュートノードの選択は2つの手順で実行される
先述したとおり、コンピュートノードは1つの環境に複数個置かれることがほとんどです。 インスタンスを作成するコンピュートノードは、次のような条件を満たしている必要があります。
- 性能が足りている
- 十分なリソースが余っている。他のインスタンスによって圧迫されていない
- コンピュートノードの仮想化基盤が使おうとしているイメージの形式に対応している
また、特定のインスタンス群を次のように配置したい場合もあるでしょう。
- 通信速度の都合から、近いコンピュートノードに配置したい
- 可用性の観点から、それぞれを離れたコンピュートノードに配置したい
これらの条件や要求を満たし、環境がきちんと動作するためには、インスタンスを作成するコンピュートノードを正しく判断する仕組みが必要です。 その判断を司っているのがnova-schedulerコンポーネント(以下、nova-scheduler)です。 nova-schedulerはコントローラノードにインストールされ、インスタンス作成のリクエストを受け取ったnova-apiが、インスタンスを作成するコンピュートノードを決めるために利用します。
nova-schedulerは次の2つの手順によって、インスタンスを作成するコンピュートノードを判断します。
- フィルタリングにより、要求されたインスタンスを作成できないコンピュートノードを除く
- 重み付けにより、要求されたインスタンスに最適なコンピュートノードを決定する
手順の1.として行うフィルタリングには、nova-schedulerのFilterが使われます。 様々な種類のFilterが用意されていますが、主なものは次のとおりです。
| RetryFilter | 前にインスタンス操作のリクエストを受けたけれども失敗したコンピュートノードを除く |
|---|---|
| AvailabilityZoneFilter | インスタンスを作成するコンピュートノードが属するネットワーク系統や電源系統を指定し、指定と違うところにあるコンピュートノードを除くネットワーク系統や電源系統で区切った領域をAvailability Zoneと呼ぶ |
| RamFilter | インスタンスに必要なメモリが足りないコンピュートノードを除く |
| DiskFilter | インスタンスに必要なハードディスクが足りないコンピュートノードを除く。ただし、複数のインスタンスを共有する関係で、コンピュートノードは持っているハードディスクを実際の値より大きく見せることが可能。どれだけ大きく見せるかはNova全体で設定する |
| ComputeFilter | コンピュートノードとして正常に動作していないコンピュートノードを除く |
| ComputeCapabilitiesFilter | flavorが持つextra_specs属性によって、指定された性能のインスタンスを作成できないコンピュートノードを除く。extra_specsはオプションとしてflavorに設定できる。特別なリソースを持ったコンピュートノードを指定する際に利用する |
| ImagePropertiesFilter | イメージによって指定されたアーキテクチャや仮想化方式に対応していないコンピュートノードを除く |
| ServerGroupAntiAffinityFilter | 複数のインスタンスをグループとして作成する際に、同じグループのインスタンスがあるコンピュートノードから、近くにあるコンピュートノードを除く |
| ServerGroupAffinityFilter | 複数のインスタンスをグループとして作成する際に、同じグループのインスタンスがあるコンピュートノードから、遠くにあるコンピュートノードを除く |
フィルタリングの次は、フィルタリングで除かれなかったコンピュートノードに対して重み付けを行います。この重み付けを基に、インスタンスを作成するコンピュートノードが決定されます(手順の2.)。
重み付けは、nova-schedulerのWeigherによって行われます。 Weigherはメモリ量や、該当するコンピュートノードが含まれるネットワークで未使用となっているIPアドレスの数、I/Oの待ち時間などを基にして重み付けを行います。
こうして、nova-schedulerがFilterとWeigherでインスタンスを作成するコンピュートノードを適切に選択していることで、Novaはリソースを効率的に利用できています。
なぜインスタンスを作成するコンピュートノードを選択する専用のコンポーネントがあるのか
ところで、nova-schedulerは、nova-apiとは独立したコンポーネントとして開発されています。なぜ、インスタンスの作成機能だけがnova-apiから切り離されているのでしょう? nova-apiはインスタンスを操作するコンポーネントなのだから、作成機能もnova-apiに含まれていてよさそうなものです。
理由は、インスタンスを作成するロジックが複雑なことにあります。 ロジックが複雑だということは、そのメンテナンスにも手間や時間がかかることを意味します。また、インスタンスを作成するという限られた機能をメンテナンスする間、その他のインスタンス操作が一切できなくなるのはたいへん非効率です。
そのため、インスタンスの作成機能はnova-apiから切り離され、nova-schedulerという別個のコンポーネントに実装されています。nova-apiはインスタンス作成の要求を受け取ると、APIを利用してnova-schedulerを呼び出します。これも、OpenStackにおけるマイクロサービスアーキテクチャの例です。
万が一、nova-schedulerの複雑なロジックに不具合があった場合でも、nova-apiとは独立して停止させ、メンテナンスや設定を行い、起動し直すことができます。その間、nova-apiは正常に動き続け、ユーザーは既存のインスタンスの操作を行うことができます。ただ1つ、インスタンスの作成ができない点だけ気にすればよいのです。
