インスタンスの自動スケーリング
Red Hat OpenStack Platform での自動スケーリングの設定
概要
第1章 本ガイドについて リンクのコピーリンクがクリップボードにコピーされました!
現在 Red Hat では、本リリース用の本ガイドに記載されている情報および手順の見直しを行っています。
本書は、製品ドキュメント から利用可能な Red Hat OpenStack Platform 12 のドキュメントをベースにしています。
現在の Red Hat OpenStack Platform リリース用にサポートが必要な場合は、Red Hat サポートにお問い合わせください。
第2章 コンピュートインスタンスの自動スケーリングの設定 リンクのコピーリンクがクリップボードにコピーされました!
大規模なシステムの使用に応じて、コンピュートインスタンスを自動的にスケールアウトすることができます。CPU やメモリーの使用などの要素を検討する事前定義済みのルールを使用して、Orchestration(heat)を設定して、必要に応じてインスタンスを自動的に追加/削除することができます。
2.1. 自動スケーリングアーキテクチャーの概要 リンクのコピーリンクがクリップボードにコピーされました!
2.1.1. オーケストレーション リンクのコピーリンクがクリップボードにコピーされました!
自動スケーリングを提供するコアコンポーネントは Orchestration(heat)です。Orchestration を使用して、人間が判読可能な YAML テンプレートを使ってルールを定義します。これらのルールは、Telemetry データに基づいてシステムの負荷を評価するために適用され、スタックにインスタンスを追加する必要があるかどうかを確認します。負荷が減ると、オーケストレーションは未使用のインスタンスを再び自動的に削除できます。
2.1.2. テレメトリー リンクのコピーリンクがクリップボードにコピーされました!
Telemetry は、Red Hat OpenStack Platform 環境のパフォーマンスを監視し、インスタンスおよび物理ホストの CPU、ストレージ、およびメモリー使用率のデータを収集します。オーケストレーションテンプレートは Telemetry データを検査し、事前定義のアクションを開始するかどうかを評価します。
2.1.3. 主要な用語 リンクのコピーリンクがクリップボードにコピーされました!
- stack
- アプリケーションの操作に必要なリソースのコレクション。スタックは、単一インスタンスとそのリソースとしてシンプルなものであったり、複数層のアプリケーションを構成するリソースの全依存関係を持つ複数のインスタンスとして複雑な場合があります。
- テンプレート
heat が実行する一連のタスクを定義する YAML スクリプト。たとえば、特定の機能に個別のテンプレートを使用することが推奨されます。
- テンプレートファイル: Telemetry が応答するしきい値を定義し、自動スケーリンググループを定義します。
- 環境ファイル: 環境の構築情報を定義します。使用するフレーバーとイメージ、仮想ネットワークの設定方法、およびインストールするソフトウェアを定義します。
2.2. 例:CPU の使用状況に基づく自動スケーリング リンクのコピーリンクがクリップボードにコピーされました!
この例では、Orchestrationは Telemetry データを検査し、CPU の高い使用率に対応してインスタンスの数を自動的に増やします。スタックテンプレートおよび環境テンプレートを作成して、ルールとサブ設定を定義します。この例では、ネットワークなどの既存のリソースを使用し、実際の環境とは異なる可能性のある名前を使用します。
手順
インスタンスのフレーバー、ネットワーク設定、およびイメージ種別を記述する環境テンプレートを作成します。テンプレートを
/home/<user>/stacks/example1/cirros.yamlファイルに保存します。<user>変数を実際のユーザー名に置き換えます。heat_template_version: 2016-10-14 description: Template to spawn an cirros instance. parameters: metadata: type: json image: type: string description: image used to create instance default: cirros flavor: type: string description: instance flavor to be used default: m1.tiny key_name: type: string description: keypair to be used default: mykeypair network: type: string description: project network to attach instance to default: internal1 external_network: type: string description: network used for floating IPs default: external_network resources: server: type: OS::Nova::Server properties: block_device_mapping: - device_name: vda delete_on_termination: true volume_id: { get_resource: volume } flavor: {get_param: flavor} key_name: {get_param: key_name} metadata: {get_param: metadata} networks: - port: { get_resource: port } port: type: OS::Neutron::Port properties: network: {get_param: network} security_groups: - default floating_ip: type: OS::Neutron::FloatingIP properties: floating_network: {get_param: external_network} floating_ip_assoc: type: OS::Neutron::FloatingIPAssociation properties: floatingip_id: { get_resource: floating_ip } port_id: { get_resource: port } volume: type: OS::Cinder::Volume properties: image: {get_param: image} size: 1Orchestration リソースを
~/stacks/example1/environment.yamlに登録します。resource_registry: "OS::Nova::Server::Cirros": ~/stacks/example1/cirros.yamlスタックテンプレートを作成します。監視する CPU しきい値と、追加するインスタンス数を記述します。インスタンスグループも作成し、このテンプレートに参加できるインスタンスの最小数および最大数を定義します。
注記Gnocchi
cpu_utilメトリックの粒度に応じて granularity パラメーターを設定します。詳細は、「 gnocchi を ceilometer ディスパッチャーとして使用する際の aodh アラームを作成する方法」を参照して ください。~/stacks/example1/template.yamlに以下の値を保存します。heat_template_version: 2016-10-14 description: Example auto scale group, policy and alarm resources: scaleup_group: type: OS::Heat::AutoScalingGroup properties: cooldown: 300 desired_capacity: 1 max_size: 3 min_size: 1 resource: type: OS::Nova::Server::Cirros properties: metadata: {"metering.server_group": {get_param: "OS::stack_id"}} scaleup_policy: type: OS::Heat::ScalingPolicy properties: adjustment_type: change_in_capacity auto_scaling_group_id: { get_resource: scaleup_group } cooldown: 300 scaling_adjustment: 1 scaledown_policy: type: OS::Heat::ScalingPolicy properties: adjustment_type: change_in_capacity auto_scaling_group_id: { get_resource: scaleup_group } cooldown: 300 scaling_adjustment: -1 cpu_alarm_high: type: OS::Aodh::GnocchiAggregationByResourcesAlarm properties: description: Scale up if CPU > 80% metric: cpu_util aggregation_method: mean granularity: 300 evaluation_periods: 1 threshold: 80 resource_type: instance comparison_operator: gt alarm_actions: - str_replace: template: trust+url params: url: {get_attr: [scaleup_policy, signal_url]} query: str_replace: template: {"=": {"server_group": "stack_id"}} params: stack_id: {get_param: "OS::stack_id"} cpu_alarm_low: type: OS::Aodh::GnocchiAggregationByResourcesAlarm properties: metric: cpu_util aggregation_method: mean granularity: 300 evaluation_periods: 1 threshold: 5 resource_type: instance comparison_operator: lt alarm_actions: - str_replace: template: trust+url params: url: {get_attr: [scaledown_policy, signal_url]} query: str_replace: template: {"=": {"server_group": "stack_id"}} params: stack_id: {get_param: "OS::stack_id"} outputs: scaleup_policy_signal_url: value: {get_attr: [scaleup_policy, signal_url]} scaledown_policy_signal_url: value: {get_attr: [scaledown_policy, signal_url]}以下のコマンドを入力して環境をビルドしてインスタンスをデプロイします。
$ openstack stack create -t template.yaml -e environment.yaml example +---------------------+--------------------------------------------+ | Field | Value | +---------------------+--------------------------------------------+ | id | 248a98bb-f56e-4934-a281-fffde62d78d8 | | stack_name | example | | description | Example auto scale group, policy and alarm | | creation_time | 2017-03-06T15:00:29Z | | updated_time | None | | stack_status | CREATE_IN_PROGRESS | | stack_status_reason | Stack CREATE started | +---------------------+--------------------------------------------+Orchestrationはスタックを作成し、
scaleup_group定義のmin_sizeパラメーターで定義されているように、定義された最小数の cirros インスタンスを起動します。インスタンスが正常に作成されたことを確認します。$ openstack server list +--------------------------------------+-------------------------------------------------------+--------+------------+-------------+-------------------------------------+ | ID | Name | Status | Task State | Power State | Networks | +--------------------------------------+-------------------------------------------------------+--------+------------+-------------+-------------------------------------+ | e1524f65-5be6-49e4-8501-e5e5d812c612 | ex-3gax-5f3a4og5cwn2-png47w3u2vjd-server-vaajhuv4mj3j | ACTIVE | - | Running | internal1=10.10.10.9, 192.168.122.8 | +--------------------------------------+-------------------------------------------------------+--------+------------+-------------+-------------------------------------+オーケストレーションは、cpu_gitops_
high およびで定義されているように、スケールアップイベントまたはスケールダウンイベントをトリガーする 2 つの CPU アラームも作成します。トリガーが存在することを確認します。cpu_gitops_low$ openstack alarm list +--------------------------------------+--------------------------------------------+-------------------------------------+-------------------+----------+---------+ | alarm_id | type | name | state | severity | enabled | +--------------------------------------+--------------------------------------------+-------------------------------------+-------------------+----------+---------+ | 022f707d-46cc-4d39-a0b2-afd2fc7ab86a | gnocchi_aggregation_by_resources_threshold | example-cpu_alarm_high-odj77qpbld7j | insufficient data | low | True | | 46ed2c50-e05a-44d8-b6f6-f1ebd83af913 | gnocchi_aggregation_by_resources_threshold | example-cpu_alarm_low-m37jvnm56x2t | insufficient data | low | True | +--------------------------------------+--------------------------------------------+-------------------------------------+-------------------+----------+---------+
2.2.1. インスタンスの自動スケーリングのテスト リンクのコピーリンクがクリップボードにコピーされました!
Orchestrationは、cpu_alarm_high しきい値の定義に基づいて、インスタンスを自動的にスケーリングできます。CPU が使用する値が threshold パラメーターで定義される値に達すると、別のインスタンスを起動して負荷分散を行います。上記の template.yaml ファイルの しきい 値は 80% に設定されます。
手順
インスタンスにログインし、いくつかの
ddコマンドを実行して負荷を生成します。$ ssh -i ~/mykey.pem cirros@192.168.122.8 $ sudo dd if=/dev/zero of=/dev/null & $ sudo dd if=/dev/zero of=/dev/null & $ sudo dd if=/dev/zero of=/dev/null &cirros インスタンスで CPU の使用率が 100% になることが予想されます。アラームがトリガーされていることを確認します。
$ openstack alarm list +--------------------------------------+--------------------------------------------+-------------------------------------+-------+----------+---------+ | alarm_id | type | name | state | severity | enabled | +--------------------------------------+--------------------------------------------+-------------------------------------+-------+----------+---------+ | 022f707d-46cc-4d39-a0b2-afd2fc7ab86a | gnocchi_aggregation_by_resources_threshold | example-cpu_alarm_high-odj77qpbld7j | alarm | low | True | | 46ed2c50-e05a-44d8-b6f6-f1ebd83af913 | gnocchi_aggregation_by_resources_threshold | example-cpu_alarm_low-m37jvnm56x2t | ok | low | True | +--------------------------------------+--------------------------------------------+-------------------------------------+-------+----------+---------+約 60 秒後に、Orchestrationは別のインスタンスを開始し、グループに追加します。これを確認するには、以下のコマンドを入力します。
$ openstack server list +--------------------------------------+-------------------------------------------------------+--------+------------+-------------+---------------------------------------+ | ID | Name | Status | Task State | Power State | Networks | +--------------------------------------+-------------------------------------------------------+--------+------------+-------------+---------------------------------------+ | 477ee1af-096c-477c-9a3f-b95b0e2d4ab5 | ex-3gax-4urpikl5koff-yrxk3zxzfmpf-server-2hde4tp4trnk | ACTIVE | - | Running | internal1=10.10.10.13, 192.168.122.17 | | e1524f65-5be6-49e4-8501-e5e5d812c612 | ex-3gax-5f3a4og5cwn2-png47w3u2vjd-server-vaajhuv4mj3j | ACTIVE | - | Running | internal1=10.10.10.9, 192.168.122.8 | +--------------------------------------+-------------------------------------------------------+--------+------------+-------------+---------------------------------------+短期間に、Orchestration がインスタンス 3 つに自動的にスケーリングされていることを確認します。この設定は最大 3 つのインスタンスに設定されるため、それ以上のインスタンスをスケーリングすることはできません。以下のコマンドを使用して、Orchestration が 3 つのインスタンスに再度スケーリングされたことを確認します。
$ openstack server list +--------------------------------------+-------------------------------------------------------+--------+------------+-------------+---------------------------------------+ | ID | Name | Status | Task State | Power State | Networks | +--------------------------------------+-------------------------------------------------------+--------+------------+-------------+---------------------------------------+ | 477ee1af-096c-477c-9a3f-b95b0e2d4ab5 | ex-3gax-4urpikl5koff-yrxk3zxzfmpf-server-2hde4tp4trnk | ACTIVE | - | Running | internal1=10.10.10.13, 192.168.122.17 | | e1524f65-5be6-49e4-8501-e5e5d812c612 | ex-3gax-5f3a4og5cwn2-png47w3u2vjd-server-vaajhuv4mj3j | ACTIVE | - | Running | internal1=10.10.10.9, 192.168.122.8 | | 6c88179e-c368-453d-a01a-555eae8cd77a | ex-3gax-fvxz3tr63j4o-36fhftuja3bw-server-rhl4sqkjuy5p | ACTIVE | - | Running | internal1=10.10.10.5, 192.168.122.5 | +--------------------------------------+-------------------------------------------------------+--------+------------+-------------+---------------------------------------+
2.2.2. インスタンスの自動スケーリング リンクのコピーリンクがクリップボードにコピーされました!
オーケストレーションは、cpu_gitops_low のしきい値に基づいてインスタンスを自動的にスケールダウンできます。この例では、CPU 使用率が 5% 未満の場合、インスタンスはスケールダウンします。
手順
実行中の
ddプロセスを終了し、Orchestration が開始してインスタンスをスケールダウンします。$ killall ddddプロセスを停止すると、cpu_gitops_low イベントがトリガーされます。これにより、Orchestrationは自動的にスケールダウンを開始し、インスタンスを削除します。対応するアラームがトリガーされていることを確認します。$ openstack alarm list +--------------------------------------+--------------------------------------------+-------------------------------------+-------+----------+---------+ | alarm_id | type | name | state | severity | enabled | +--------------------------------------+--------------------------------------------+-------------------------------------+-------+----------+---------+ | 022f707d-46cc-4d39-a0b2-afd2fc7ab86a | gnocchi_aggregation_by_resources_threshold | example-cpu_alarm_high-odj77qpbld7j | ok | low | True | | 46ed2c50-e05a-44d8-b6f6-f1ebd83af913 | gnocchi_aggregation_by_resources_threshold | example-cpu_alarm_low-m37jvnm56x2t | alarm | low | True | +--------------------------------------+--------------------------------------------+-------------------------------------+-------+----------+---------+数分後に、Orchestration は、
scaleup_group定義のmin_sizeパラメーターで定義されている最小値に、インスタンスの数を継続的に減らします。このシナリオでは、min_sizeパラメーターは1に設定されています。
2.2.3. 設定のトラブルシューティング リンクのコピーリンクがクリップボードにコピーされました!
環境が適切に機能していない場合は、ログファイルと履歴レコードでエラーを確認できます。
状態遷移に関する情報を表示するには、スタックイベントレコードを一覧表示します。
$ openstack stack event list example 2017-03-06 11:12:43Z [example]: CREATE_IN_PROGRESS Stack CREATE started 2017-03-06 11:12:43Z [example.scaleup_group]: CREATE_IN_PROGRESS state changed 2017-03-06 11:13:04Z [example.scaleup_group]: CREATE_COMPLETE state changed 2017-03-06 11:13:04Z [example.scaledown_policy]: CREATE_IN_PROGRESS state changed 2017-03-06 11:13:05Z [example.scaleup_policy]: CREATE_IN_PROGRESS state changed 2017-03-06 11:13:05Z [example.scaledown_policy]: CREATE_COMPLETE state changed 2017-03-06 11:13:05Z [example.scaleup_policy]: CREATE_COMPLETE state changed 2017-03-06 11:13:05Z [example.cpu_alarm_low]: CREATE_IN_PROGRESS state changed 2017-03-06 11:13:05Z [example.cpu_alarm_high]: CREATE_IN_PROGRESS state changed 2017-03-06 11:13:06Z [example.cpu_alarm_low]: CREATE_COMPLETE state changed 2017-03-06 11:13:07Z [example.cpu_alarm_high]: CREATE_COMPLETE state changed 2017-03-06 11:13:07Z [example]: CREATE_COMPLETE Stack CREATE completed successfully 2017-03-06 11:19:34Z [example.scaleup_policy]: SIGNAL_COMPLETE alarm state changed from alarm to alarm (Remaining as alarm due to 1 samples outside threshold, most recent: 95.4080102993) 2017-03-06 11:25:43Z [example.scaleup_policy]: SIGNAL_COMPLETE alarm state changed from alarm to alarm (Remaining as alarm due to 1 samples outside threshold, most recent: 95.8869217299) 2017-03-06 11:33:25Z [example.scaledown_policy]: SIGNAL_COMPLETE alarm state changed from ok to alarm (Transition to alarm due to 1 samples outside threshold, most recent: 2.73931707966) 2017-03-06 11:39:15Z [example.scaledown_policy]: SIGNAL_COMPLETE alarm state changed from alarm to alarm (Remaining as alarm due to 1 samples outside threshold, most recent: 2.78110858552)アラーム履歴ログを読み取るには、以下を実行します。
$ openstack alarm-history show 022f707d-46cc-4d39-a0b2-afd2fc7ab86a -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | timestamp | type | detail | event_id | -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | 2017-03-06T11:32:35.510000 | state transition | {"transition_reason": "Transition to ok due to 1 samples inside threshold, most recent: | 25e0e70b-3eda-466e-abac-42d9cf67e704 | | | | 2.73931707966", "state": "ok"} | | | 2017-03-06T11:17:35.403000 | state transition | {"transition_reason": "Transition to alarm due to 1 samples outside threshold, most recent: | 8322f62c-0d0a-4dc0-9279-435510f81039 | | | | 95.0964497325", "state": "alarm"} | | | 2017-03-06T11:15:35.723000 | state transition | {"transition_reason": "Transition to ok due to 1 samples inside threshold, most recent: | 1503bd81-7eba-474e-b74e-ded8a7b630a1 | | | | 3.59330523447", "state": "ok"} | | | 2017-03-06T11:13:06.413000 | creation | {"alarm_actions": ["trust+http://fca6e27e3d524ed68abdc0fd576aa848:delete@192.168.122.126:8004/v1/fd | 224f15c0-b6f1-4690-9a22-0c1d236e65f6 | | | | 1c345135be4ee587fef424c241719d/stacks/example/d9ef59ed-b8f8-4e90-bd9b- | | | | | ae87e73ef6e2/resources/scaleup_policy/signal"], "user_id": "a85f83b7f7784025b6acdc06ef0a8fd8", | | | | | "name": "example-cpu_alarm_high-odj77qpbld7j", "state": "insufficient data", "timestamp": | | | | | "2017-03-06T11:13:06.413455", "description": "Scale up if CPU > 80%", "enabled": true, | | | | | "state_timestamp": "2017-03-06T11:13:06.413455", "rule": {"evaluation_periods": 1, "metric": | | | | | "cpu_util", "aggregation_method": "mean", "granularity": 300, "threshold": 80.0, "query": "{\"=\": | | | | | {\"server_group\": \"d9ef59ed-b8f8-4e90-bd9b-ae87e73ef6e2\"}}", "comparison_operator": "gt", | | | | | "resource_type": "instance"}, "alarm_id": "022f707d-46cc-4d39-a0b2-afd2fc7ab86a", | | | | | "time_constraints": [], "insufficient_data_actions": null, "repeat_actions": true, "ok_actions": | | | | | null, "project_id": "fd1c345135be4ee587fef424c241719d", "type": | | | | | "gnocchi_aggregation_by_resources_threshold", "severity": "low"} | | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------heat が既存のスタック用に収集するスケールアウトまたはスケールダウン操作の記録を表示するには、
awkコマンドを使用してheat-engine.logを解析します。$ awk '/Stack UPDATE started/,/Stack CREATE completed successfully/ {print $0}' /var/log/heat/heat-engine.logaodh関連の情報を表示するには、evaluator.logを調べます。$ grep -i alarm /var/log/aodh/evaluator.log | grep -i transition