SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

マイクロサービスアーキテクチャが支えるOpenStackの動作と仕組み

Novaの動作と仕組み~複数のノード・仮想化方式でも効率的にインスタンス管理

マイクロサービスアーキテクチャが支えるOpenStackの動作と仕組み 第2回


新しいインスタンスの作成

次に説明するのは、新しいインスタンスを作成する機能です。

コンピュートノードの選択は2つの手順で実行される

先述したとおり、コンピュートノードは1つの環境に複数個置かれることがほとんどです。 インスタンスを作成するコンピュートノードは、次のような条件を満たしている必要があります。

  • 性能が足りている
  • 十分なリソースが余っている。他のインスタンスによって圧迫されていない
  • コンピュートノードの仮想化基盤が使おうとしているイメージの形式に対応している

また、特定のインスタンス群を次のように配置したい場合もあるでしょう。

  • 通信速度の都合から、近いコンピュートノードに配置したい
  • 可用性の観点から、それぞれを離れたコンピュートノードに配置したい

これらの条件や要求を満たし、環境がきちんと動作するためには、インスタンスを作成するコンピュートノードを正しく判断する仕組みが必要です。 その判断を司っているのがnova-schedulerコンポーネント(以下、nova-scheduler)です。 nova-schedulerはコントローラノードにインストールされ、インスタンス作成のリクエストを受け取ったnova-apiが、インスタンスを作成するコンピュートノードを決めるために利用します。

nova-schedulerは次の2つの手順によって、インスタンスを作成するコンピュートノードを判断します。

  1. フィルタリングにより、要求されたインスタンスを作成できないコンピュートノードを除く
  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はリソースを効率的に利用できています。

FilterとWeigherで適切なノードを選択
FilterとWeigherで適切なノードを選択

なぜインスタンスを作成するコンピュートノードを選択する専用のコンポーネントがあるのか

ところで、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つ、インスタンスの作成ができない点だけ気にすればよいのです。

次のページ
コンピュートノードの管理

この記事は参考になりましたか?

マイクロサービスアーキテクチャが支えるOpenStackの動作と仕組み連載記事一覧

もっと読む

この記事の著者

大嶋 俊祐(株式会社ワークスアプリケーションズ)(オオシマ シュンスケ)

株式会社ワークスアプリケーションズ所属。 社内では技術研修を担当しながら、OpenStackを使ってプライベートクラウドを作っています。 自分が運営する研修を自分が作ったプライベートクラウドを使って運営するのがマイブーム。 あだ名はひよこ。TRPGが趣味なのでどなたかお誘いください。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/9848 2021/03/25 21:21

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー