Compute の自動スケーリング
Red Hat OpenStack Platform での自動スケーリングの設定
概要
第1章 Compute の自動スケーリングの設定 リンクのコピーリンクがクリップボードにコピーされました!
本ガイドでは、高いシステムの使用状況に応じてコンピュートインスタンスを自動的にスケールアウトする方法について説明します。CPU やメモリー使用量などの要素を考慮する事前定義のルールを使用することで、必要に応じて追加のインスタンスを自動的に追加/削除するように Orchestration (heat)を設定できます。
1.1. アーキテクチャーの概要 リンクのコピーリンクがクリップボードにコピーされました!
1.1.1. Orchestration リンクのコピーリンクがクリップボードにコピーされました!
自動スケーリングの背後にあるコアコンポーネントは Orchestration (heat)です。Orchestration を使用すると、人間が判読できる YAML テンプレートを使用してルールを定義できます。これらのルールは、追加のインスタンスを追加することを決定する前に Telemetry データを評価することができます。その後、アクティビティーがサブサイドになると、Orchestration は不要なインスタンスを自動的に削除できます。
1.1.2. テレメトリー リンクのコピーリンクがクリップボードにコピーされました!
Telemetry は OpenStack 環境のパフォーマンス監視を行い、インスタンスおよび物理ホストの CPU、ストレージ、およびメモリー使用率に関するデータを収集します。オーケストレーションテンプレートは、事前に定義されたアクションを実行するかどうかを決定する際に Telemetry データを検証します。
1.1.3. 主要な用語 リンクのコピーリンクがクリップボードにコピーされました!
- スタック: スタックは、アプリケーションの操作に必要なすべてのリソースで設定されます。1 つのインスタンスとそのリソースではシンプルで、複数階層アプリケーションを設定する複数のインスタンスとすべてのリソースの依存関係の場合は複雑になります。
テンプレート: Heat が実行する一連のタスクを定義する YAML スクリプト。たとえば、特定の機能に個別のテンプレートを使用することが推奨されます。
- スタックテンプレート: Telemetry が応答するしきい値を定義し、自動スケーリンググループを定義します。
- 環境テンプレート - 環境のビルド情報(使用するフレーバーおよびイメージ、仮想ネットワークの設定方法、インストールするソフトウェア)を定義します。
1.2. 例:CPU 使用率に基づく自動スケーリング リンクのコピーリンクがクリップボードにコピーされました!
この例では、オーケストレーションは Telemetry データを検査し、CPU の高い使用率に対応してインスタンスの数を自動的に増やします。必要なルールとその後の設定を定義するために、スタックテンプレートと環境テンプレートが作成されます。この例では、既存のリソース(ネットワークなど)を使用し、独自の環境で異なる可能性の高い名前を使用します。
インスタンスのフレーバー、ネットワーク設定、およびイメージ種別を記述する環境テンプレートを作成します。
/etc/heat/templates/cirros.yamlに以下の値を入力します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow /root/environment.yamlに Orchestration リソースを登録します。resource_registry: "OS::Nova::Server::Cirros": "file:///etc/heat/templates/cirros.yaml"resource_registry: "OS::Nova::Server::Cirros": "file:///etc/heat/templates/cirros.yaml"Copy to Clipboard Copied! Toggle word wrap Toggle overflow スタックテンプレートを作成し、監視する CPU しきい値と追加するインスタンスの数を記述します。インスタンスグループも作成し、このテンプレートに参加できるインスタンスの最小数および最大数を定義します。
/root/example.yamlに以下の値を入力します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow Telemetry コレクションの間隔を更新します。デフォルトでは、Telemetry は CPU データに対して 10 分ごとにインスタンスをポーリングします。この例では、
/etc/ceilometer/pipeline.yamlで間隔を 60 秒に変更します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注記実稼働環境では、ポーリング期間が 60 秒ほど推奨しません。ポーリング間隔が長くなると、コントロールプレーンの負荷が増加する可能性があるためです。
すべての OpenStack サービスを再起動して、更新された Telemetry 設定を適用します。
openstack-service restart
# openstack-service restartCopy to Clipboard Copied! Toggle word wrap Toggle overflow 注記このステップにより、OpenStack デプロイメントの停止が短くなります。
オーケストレーションスクリプトを実行して、環境を構築し、インスタンスをデプロイします。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Orchestration は、
scaleup_group定義(min_size)に設定されるように、スタックを作成し、単一の cirros インスタンスを起動します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow オーケストレーションは、
cpu_alarm_highおよびcpu_alarm_lowで定義されているように、スケールアップまたはスケールダウンイベントをトリガーするために使用される 2 つの CPU アラームも作成します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow
1.2.1. 自動スケーリングインスタンスのテスト リンクのコピーリンクがクリップボードにコピーされました!
オーケストレーションは、cpu_alarm_high しきい値に基づいてインスタンスを自動的にスケーリングします。CPU 使用率が 50% を超えると、cpu_alarm_high 定義に設定されるように 50% インスタンスがスケールアップされます: threshold: 50
CPU 負荷を生成するには、インスタンスにログインして dd コマンドを実行します。
ssh -i admin.pem cirros@192.168.122.232 dd if=/dev/zero of=/dev/null & dd if=/dev/zero of=/dev/null & dd if=/dev/zero of=/dev/null &
$ ssh -i admin.pem cirros@192.168.122.232
$ dd if=/dev/zero of=/dev/null &
$ dd if=/dev/zero of=/dev/null &
$ dd if=/dev/zero of=/dev/null &
dd コマンドを実行すると、cirros インスタンスで 100% の CPU 使用率を期待できます。60 秒後、Orchestration がグループを 2 つのインスタンスに自動スケーリングしたことがわかります。
60 秒を超えると、Orchestration が 3 つのインスタンスに再度自動的にスケーリングされたことを確認します。この設定の最大値は 3 つであるため、( scaleup_group 定義で設定された)スケーリングは max_sizeしません。
1.2.2. インスタンスの自動スケールダウン リンクのコピーリンクがクリップボードにコピーされました!
オーケストレーションは、cpu_alarm_low しきい値に基づいてインスタンスを自動的にスケールダウンします。この例では、CPU 使用率が 10% を下回ると、インスタンスはスケールダウンされます。実行中の dd プロセスを終了し、オーケストレーションがインスタンスのスケールダウンを開始することを確認します。
dd プロセスを停止すると、cpu_alarm_low event がトリガーされます。その結果、オーケストレーションは自動的にスケールダウンを開始し、インスタンスを削除します。
数分後、scaleup_group で許容される最小インスタンス数:min_size: 1
1.3. 例:アプリケーションの自動スケーリング リンクのコピーリンクがクリップボードにコピーされました!
前述の機能も、アプリケーションのスケールアップにも使用できます。たとえば、一度に実行される複数のインスタンスの 1 つによって提供される動的な Web ページなどです。この場合、neutron は Load Balancing-as-a-Service を提供するように設定できます。これは、インスタンス間でトラフィックを均等に分散するのに均等に機能します。
以下の例では、Orchestration は Telemetry データを再度検査し、CPU 使用率が高いとインスタンスの数を増やすか、CPU 使用率がセット値を下回った場合にはインスタンスの数を減らします。
ロードバランサー 環境のプロパティーを記述するテンプレートを作成します。
/etc/heat/templates/lb-env.yamlに以下の値を入力します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow Web アプリケーションを実行するインスタンス用に別のテンプレートを作成します。以下のテンプレートはロードバランサーを作成し、既存のネットワークを使用します。お使いの環境に応じてパラメーターを置き換え、テンプレートを
/root/lb-webserver-rhel7.yamlなどのファイルに保存します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow Telemetry コレクションの間隔を更新します。デフォルトでは、Telemetry は CPU データに対して 10 分ごとにインスタンスをポーリングします。この例では、
/etc/ceilometer/pipeline.yamlで間隔を 60 秒に変更します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注記実稼働環境では、ポーリング期間が 60 秒ほど推奨しません。ポーリング間隔が長くなると、コントロールプレーンの負荷が増加する可能性があるためです。
すべての OpenStack サービスを再起動して、更新された Telemetry 設定を適用します。
openstack-service restart
# openstack-service restartCopy to Clipboard Copied! Toggle word wrap Toggle overflow 注記このステップにより、OpenStack デプロイメントの停止が短くなります。
オーケストレーションスクリプトを実行します。これにより、環境がビルドされ、テンプレートを使用してインスタンスをデプロイします。
heat stack-create webfarm -f /root/lb-webserver-rhel7.yaml
# heat stack-create webfarm -f /root/lb-webserver-rhel7.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow /root/lb-webserver-rhel7.yamlを実際のパスおよびファイル名に置き換えます。
Orchestration → Stacks → Webfarm で、Dashboard でスタックの作成をモニターできます。スタックが作成されると、以下のような、有用な情報が複数表示されます。
- 手動スケールアップまたはスケールダウンイベントをトリガーするために使用できる URL。
- Web サイトの IP アドレスである Floating IP アドレス。
- スタックの CPU 負荷を表示する Telemetry コマンド。スケーリングが予想通りに機能しているかどうかを確認することができます。
ダッシュボードでページは次のようになります。
Network → Load Balancers を開いて、ロードバランサーを表示します。
Members をクリックします。このページには、負荷分散プールのメンバーが表示されます。これらは、Web サイトのトラフィックを分散できるインスタンスです。対応するインスタンスが作成され、Apache がインストールおよび設定されるまで、メンバーは Active ステータスにならないことに注意してください。
Web サーバーを起動すると、インスタンスはロードバランサーのアクティブなメンバーとして表示されます。
これで、http://IP/hostname.php で Web アプリケーションにアクセスできるようになりました。以下のような出力が表示されるはずです。
Hello, My name is we-zrwm-t4ezkpx34gxu-qbg5d7dqbc4j-server-mzdvigk2jugl
Hello, My name is we-zrwm-t4ezkpx34gxu-qbg5d7dqbc4j-server-mzdvigk2jugl
ダッシュボード のスタックの概要から Telemetry コマンドを実行して、スタックの CPU パフォーマンスデータを表示できるようになりました。コマンドは以下のようになります。
ceilometer statistics -m cpu_util -q metadata.user_metadata.stack=8f86c3d5-15cf-4a64-b9e8-70215498c046 -p 60 -a avg
# ceilometer statistics -m cpu_util -q metadata.user_metadata.stack=8f86c3d5-15cf-4a64-b9e8-70215498c046 -p 60 -a avg
1.3.1. 自動スケーリングアプリケーションのテスト リンクのコピーリンクがクリップボードにコピーされました!
アプリケーションのスケーリングを手動でトリガーするには、Dashboard のスタック概要から REST スケールアップ URL を使用するか、最初にデプロイされたインスタンスでリソース集約型コマンドを実行して負荷を生成します。
REST API を使用するには、
HTTP POSTリクエストを実行できるツールが必要です。たとえば、REST Easy Firefox add on やcurlなどです。スケールアップ URL をコピーし、REST Easy の形式で貼り付けます。
または、
curlコマンドラインでパラメーターとして使用します。curl -X POST "scale-up URL"
$ curl -X POST "scale-up URL"Copy to Clipboard Copied! Toggle word wrap Toggle overflow 負荷を人為的に生成するには、インスタンスに Floating IP を確保し、SSH でログインし、CPU がビジー状態になるコマンドを実行します。以下に例を示します。
dd if=/dev/zero of=/dev/null &
$ dd if=/dev/zero of=/dev/null &Copy to Clipboard Copied! Toggle word wrap Toggle overflow 重要たとえば
topコマンドを使用して、CPU 使用率が 95% を超えるかどうかを確認します。CPU 使用率が十分に高くない場合は、ddコマンドを並行して実行するか、別の方法を使用して CPU をビジー状態に維持します。
次回 Telemetry がスタックから CPU データを収集すると、スケールアップイベントがトリガーされ、Orchestration → Stacks → Webfarm → Events に表示されます。新しい Web サーバーインスタンスが作成され、ロードバランサーに追加されます。これが完了すると、インスタンスはアクティブになり、Web サイト URL がロードバランサー経由でスタックの両方のインスタンスにルーティングされることがわかります。
インスタンスの起動には数分かかることがあります。なぜなら、インスタンスの初期化、Apache のインストールと設定、およびアプリケーションをデプロイする必要があるためです。これは HAProxy によってモニターされます。これにより、Web サイトがアクティブとしてマークされる前にインスタンスで利用可能になります。
新規インスタンスの作成中の Dashboard で、負荷分散プールのメンバーのリストは次のようになります。
追加のインスタンスを作成するかどうかを決定する際には、heat スタックのインスタンスの平均 CPU 使用率が考慮されます。2 番目のインスタンスは通常の CPU 使用率を持つ可能性が最も高いため、最初のインスタンスのバランスを取り除きます。ただし、2 番目のインスタンスもビジーになり、最初のインスタンスと 2 番目のインスタンスの平均 CPU 使用率が 95% を超えると、別のインスタンス(3 番目の)インスタンスが作成されます。
1.3.2. アプリケーションの自動スケーリング リンクのコピーリンクがクリップボードにコピーされました!
これは、スタックの CPU 使用率が事前定義の値を下回ると、スケールダウンポリシーが実行される点で 「自動スケーリングアプリケーションのテスト」 と似ています。これは、「自動スケーリングアプリケーションのテスト」 で説明されている例の 15% です。さらに、インスタンスがスタックから削除されると、ロードバランサーからも自動的に削除されます。Web サイトのトラフィックは、残りのインスタンスに自動的に分散されます。