活用マニュアル

オートスケールを設定する

IDCFクラウドでは仮想ルーターを使用してロードバランシングをすることが可能です。

スクリプトにより、Webサーバーなどへの負荷が継続した際や急激なアクセスの上昇の検知をし、自動でテンプレートから仮想マシンを作成してスケールアウト(ロードバランサーへ登録)することができます。スケールアウトを使用することで緊急時でもサーバーからのレスポンスを一定にコントロールすることができ、運用負荷も軽減させることができます。

ここで紹介するオートスケールは、指定したロードバランサー配下の仮想マシン1台のLoadAverageを監視し、指定の上限閾値を超えた場合、指定したテンプレートから仮想マシンを作成し、作成した仮想マシンをロードバランサー配下に追加します。
また、LoadAverageが指定した下限閾値を下回った場合はロードバランサーから仮想マシンを1台削除します。
仮想マシンの上限/下限台数を指定できるので、指定以上/以下の台数にはなりません。
なお、監視対象のサーバーは1台しか指定できないため、ロードバランサーのバランシングのアルゴリズムはroundrobinを選択する必要があります。

オートスケールを使用して構築するには、元となるサーバーのテンプレートを作成してAPIが使用できる環境を作成する必要があります。
また、しきい値を監視するため、監視元と監視対象のサーバーを用意する必要があります。
(本書ではテスト実行のため、最終的に3台構成となります。)
 
本書の中で監視元サーバーを「運用サーバー」、監視対象サーバーを「監視対象サーバー」と記載しています。
 
※本ドキュメントは2019年6月にCentOS7対応版として更新しています。CentOS6対応のドキュメントは従来のPDF資料を参照ください。
 

1. 監視対象サーバーの構築とテンプレート準備

監視対象サーバーを構築し、テンプレートを作成します。
ここでは、仮想マシン名「scale01」としてCentOS7でHTTPサーバーを作成まで完了した状態からの手順となります。
仮想マシンの作成は、活用マニュアル「Webサイトの本番環境を構築したい(Web1台構成)」(1)仮想マシンの作成を参照ください(本書の仮想マシン名は「scale01」としているため、仮想マシン名は「sacle01」として作成してください)。
 
① コンピューティングのメニューより「IPアドレス」をクリックし、IPアドレス設定画面を表示します。右側の「IPアドレス取得」をクリックします。

 

② 以下の項目を設定して「取得する」ボタンをクリックします。
項目
設定内容
IPアドレス名
Scale(任意)
ゾーン
仮想マシンを作成したゾーン
ネットワーク
仮想マシンを作成したネットワーク




③ IPアドレス取得しました。というメッセージが表示されるので、取得した「IPアドレス」をクリックします。


 

④ ファイアウォールをクリックし、ルールを図のように3つ作成します。
作成は1つずつ行い、「+」ボタンで追加します。

・ssh-web
項目
設定内容
コメント
ssh-web
ソースCIDR
My IP
タイプ
Custom TCP
ポートレンジ
10022
・ssh
項目
設定内容
コメント
ssh
ソースCIDR
My IP
タイプ
SSH
ポートレンジ
自動
・http
項目
設定内容
コメント
http
ソースCIDR
Any(httpの設定)
タイプ
HTTP(httpの設定)
ポートレンジ
自動(httpの設定)
 

⑤ ポートフォワードをクリックし、ssh-webのsshポートフォワード設定を行います。
監視対象サーバーは基本的に外部からログインする機会が殆どないため、22番ポートは運用サーバーで使用し、10022番ポートを監視対象サーバー宛てに設定します。
本設定も同様に「+」ボタンで追加します。
項目
設定内容
コメント
ssh-web
プライベートポート
22
パブリックポート
10022
プロトコル
TCP
仮想マシン
scale01
 

⑥ ロードバランサーに監視対象サーバーを追加します。
「ロードバランサー」をクリックします。Webでサーバーの負荷分散として、今回はHTTPでアクセスを来た際の振り分け設定を実施し、scale01を予め追加しておきます。
設定が完了したら「×」で設定ウィンドウを閉じます。
項目
設定内容
コメント
Scale
パブリックポート
HTTP
プライベートポート
80
アルゴリズム
Roundrobin
接続維持
なし
仮想マシン
scale01
 



 監視対象サーバーにログインします。
活用マニュアルの「Webサイトの本番環境を構築したい(Web1台構成)」(3)仮想マシンへのアクセスを実施し、Webサーバーを作成します。
アクセスの際にはsshのポートを10022と指定してログインしてください。
 

⑧ 監視対象サーバーのテンプレートを作成します。
活用マニュアルの「スケーラブルなWebサイトを構築したい(Web2台構成編)」を参照して行います。
(1)スナップショットの取得と(2)テンプレートの作成を実施してテンプレートの作成を行います。
 
以上で監視対象サーバーの作業は完了です。
次の章でも一部で監視対象サーバーの作業がありますので、作業するサーバーを注意して進めてください。



2. 運用サーバーの作成とスクリプトの設定

オートスケールのスクリプトを実行する運用サーバーを作成します。
運用サーバーの作成は、活用マニュアル「Webサイトの本番環境を構築したい(Web1台構成)」の(1)仮想マシンの作成まで完了した状態からの手順となります。
ここでは、仮想マシン名「manage01」としてCentOS7で作成してください。
※必ず監視対象サーバーと同じゾーンに作成してください。

また、運用サーバーにはAPIから情報を取得するためのコマンドラインツール「idcfcloud-cli」とオートスケール用のサンプルプログラム「idcf.compute.auto_scale」を設置します。
「idcfcloud-cli」についてはAPI Docsを参考にインストールしてください。
ここでは「idcfcloud-cli」がインストール済みの前提で「idcf.compute.auto_scale」の利用について紹介します。
 
 
① コンピューティングのメニューから「IPアドレス」をクリックし、(1)で作成したIPアドレス名(ここではscale)をクリックします。

 
 
 「ポートフォワード」をクリックしてmanage01にsshログインするための情報を記載し、「+」をクリックして設定を追加します。
項目
設定内容
コメント
ssh
プライベートポート
SSH
パブリックポート
22
プロトコル
自動
仮想マシン
manage01
 
 
 
 監視対象サーバーにログインします。
活用マニュアルの「
Webサイトの本番環境を構築したい(Web1台構成)」を参照して行います。
 
 
 IDCフロンティアで用意しているリポジトリから、オートスケール用スクリプト「idcf.compute.auto_scale」をインストールします。
[root@manage01 ~]# yum -y install epel-release
 ~~~~~~~~~~
完了しました!
New leaves:
  epel-release.noarch
[root@manage01 ~]# yum -y install http://repo.noah.idc.jp/Linux/CentOS/7/idcf/x86_64/idcf-release-8-0.0.idcf.el7.noarch.rpm
 ~~~~~~~~~~
完了しました!
New leaves:
  idcf-release.noarch
[root@manage01 ~]# yum -y install idcf.compute.auto_scale
 ~~~~~~~~~~
完了しました!
New leaves:
  idcf.compute.auto_scale.noarch
[root@manage01 ~]#
							


⑤ APIキーを取得するため、クラウドコンソール右上の「アイコン」をクリックし、プルダウンメニューから「アカウント設定」をクリックします。



⑥ メニューから「API Key」を選択しAPI Key画面を表示させます。
エンドポイント(今回サーバーを構築しているリージョンによって異なります。)、API Key、SecretKeyをメモ帳などにコピーして次の項目で使用できるようにしておきます。


 
⑦ 設定のサンプルファイルをコピーします。
viなどのテキストエディタでコピーしたサンプルファイルを開き、⑥で確認した項目を記入します。
[root@manage01 ~]# cp /usr/share/doc/idcf.compute.auto_scale-*/sample.idcfrc .idcfrc
[root@manage01 ~]# vi .idcfrc #以下を編集して保存
---------------
[account]
host=[コピーしたエンドポイント]
api_key=[コピーしたAPI Key]
secret_key=[コピーしたSecret Key] 
---------------
[root@manage01 ~]# 
							


⑧ 
idcfcloud-cliが正しく動作するかzone-idを取得して確認します。
このzone-idは後に使用するので、今回サーバーを作成したzoneのidをメモ帳などにコピーしておいてください。

※なお、エラーになる場合は設定が間違っている、もしくはコントロールパネルにてAPI IPアドレス制限が掛かっている可能性があるため、設定を見直してください。
[root@manage01 ~]# idcfcloud compute listZones -o table -f id,name
+------------------------------------+-------+
|id                                  |name   |
|e8ebfccb-eb38-43ed-8abf-80b5f37c3aa9|weber  |
|95c8746d-57b3-421f-9375-34bea93e2a3d|lux    |
|f4583787-7bff-461a-b026-73942911ca8b|farad  |
|a46a3906-3e1b-4657-9626-f06f714fba81|candela|
|8ef55883-df52-4252-a96a-bb0f557658f5|kelvin |
+------------------------------------+-------+ 
[root@manage01 ~]#
							


⑨ テンプレートidを取得します。
このテンプレートidは後に使用するので、メモ帳などにコピーしておいてください。 
[root@manage01 ~]# idcfcloud compute listTemplates -o table -f id,name '{"templatefilter":"self"}'
+------------------------------------+-----+
|id                                  |name |
|xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx|scale|
+------------------------------------+-----+ 
[root@manage01 ~]#
							


⑩ サーバーを紐づけるLoad Balancer Rule ID(ここではScaleのid)を取得します。
このLoad Balancer Rule IDは後に使用するので、メモ帳などにコピーしておいてください。

[root@manage01 ~]# idcfcloud compute listLoadBalancerRules -o table -f id,name,publicip
+------------------------------------+------+-------------+
|id                                  |name  |publicip     |
|xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx|Scale |xxx.xxx.xx.xx|
+------------------------------------+------+-------------+ 
[root@manage01 ~]#
							


⑪ 
マシンタイプのid(ServiceOffering id)を取得します。
このServiceOffering idは後に使用するので、メモ帳などにコピーしておいてください。
[root@manage01 ~]# idcfcloud compute listServiceOfferings -o table -f id,name
+------------------------------------+----------------+
|id                                  |name            |
|bd226b3b-6ae7-454d-b53d-c886f7eebe42|light.S1        |
|6ee2b663-3739-4c41-8e37-2fc3e830729f|light.S2        |
|32d57f87-7b55-4841-a79a-9387c3ddbfe1|light.M3        |
|3e307fa2-775e-4af9-916a-8f29c653f35a|standard.S4     |
|de0f86d3-d69c-48c4-b5db-273cda9bbae2|standard.S8     |
|7ed510fa-f62e-4b4c-9172-4a29b423d674|standard.M8     |
|1ff9fba2-4384-4746-a5fd-104b16d36f66|standard.L16    |
|e4c1116e-4af0-4381-b60e-a584260603b6|standard.XL32   |
|13ead2fb-cfe1-43b0-9ea6-59dbba272582|highcpu.M4      |
|b603b7b2-d609-43da-b8fe-e4ec5ec501ab|highcpu.L8      |
|5c9ed560-54b4-403f-9049-c57863a70d1c|highcpu.XL16    |
|ad7c95be-268e-440c-96a3-5b385cb27c2d|highcpu.2XL32   |
|a132dcb6-a531-43e6-a7b8-84954d29eaf2|highmem.M16     |
|7108896c-f4bf-44be-b29a-1841f582af04|highmem.L32     |
|eb89b53e-492c-4b44-acb7-dc5472c2bf96|highmem.XL64    |
|79a93364-8bd4-4915-bbd7-a82190ac5aea|highmem.2XL128  |
|b1e3bf25-05fa-4324-b48a-bbb8777beb94|highio.3XL128   |
|a01f3570-0b8e-4ec2-a609-8b6d7818b58e|gpu.7XLM40      |
|ce8bbd32-163a-4e57-ab24-359ab005b785|gpu.7XLP100     |
|b0c4f968-267c-4cf1-8976-939a6e4fd7f3|highio.5XL128.g2|
|ee58bf9e-c649-4196-a529-4864029e4fc8|highio.3XL128.g2|
+------------------------------------+----------------+
[root@manage01 ~]#
							


⑫ 
監視対象サーバーに監視スクリプトでログインできるように運用サーバーでsshの鍵交換をします。
※監視スクリプトでパスフレーズを入力するため、パスフレーズを設定してください。
[root@manage01 ~]# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): [Enter]
Enter passphrase (empty for no passphrase): [パスフレーズを入力]
Enter same passphrase again: [もう1度パスフレーズを入力]
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
~~~~~~~~~~~~~~~~~~
+-----------------+
[root@manage01 ~]#
							


⑬ ※※この工程は監視対象サーバーでの作業です※※
運用サーバーから監視対象サーバーに、一時的にパスワードでログインできるようにsshのパスワードログインを有効化してユーザーパスワードを設定します。
[root@scale01 ~]# sed -i".org" -e "s/PasswordAuthentication no//g" /etc/ssh/sshd_config
[root@scale01 ~]# systemctl restart sshd.service
[root@scale01 ~]# passwd
ユーザー root のパスワードを変更。
新しいパスワード: [パスワードを入力]
新しいパスワードを再入力してください: [再度パスワードを入力]
passwd: 全ての認証トークンが正しく更新できました。
[root@scale01 ~]#
							


 ※※この工程は運用サーバーでの作業です※※
運用サーバーから監視対象サーバーに公開鍵を送ります。
鍵認証でログインできることを確認します。(scale01はホスト名です。変更している場合は読み替えてください。)
[root@manage01 ~]# cat /root/.ssh/id_rsa.pub | ssh root@scale01 \
"cat - >> ~/.ssh/authorized_keys"
The authenticity of host 'scale01 (10.15.0.101)' can't be established.
~~~~~~~~~~
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'scale01,10.15.0.101' (RSA) to the list of known hosts.
root@scale01's password: [パスワードを入力]
[root@manage01 ~]# ssh scale01
Enter passphrase for key '/root/.ssh/id_rsa': [鍵のパスフレーズを入力]
~~~~~~~~~~
[root@scale01 ~]# exit
logout
Connection to scale01 closed.
[root@manage01 ~]#
							


 ※※この工程は監視対象サーバーでの作業です※※
監視対象サーバーのパスワードログインを無効化して元に戻します。
[root@scale01 ~]# mv -f /etc/ssh/sshd_config.org /etc/ssh/sshd_config
[root@scale01 ~]# systemctl restart sshd.service
[root@scale01 ~]#
							


 ※※本章のこの工程以降はすべて運用サーバーでの作業です※※
監視スクリプト(ssh_scale.py)で呼び出す設定ファイルをviで編集します。
[root@manage01 ~]# vi .idcfrc 
  
---------------------------------------------------------------
[account]
host=[⑩で設定済み]
api_key=[⑩で設定済み]
secret_key=[⑩で設定済み]
  
[monitoring]
host=[監視対象VMの仮想マシン名(今回はscale01)]
user=root
private_key_path=/root/.ssh/id_rsa
pass_phrase=[パスフレーズ]
  
[launch_config]
serviceofferingid=[⑭で確認したServiceOffering ID]
templateid=[⑫で確認したテンプレートID]
zoneid=[⑪で確認したzone ID]
  
[scalling]
min_size=[オートスケール時の最小VM台数(ここでは2)]
max_size=[オートスケール時の最大VM台数(ここでは4)]
load_balancer=[⑬で確認したLoad Balancer Rule ID]
  
[scalling_policy_out]
threshold=[スケールアウトを開始するLoad Average(ここでは2)]
  
[scalling_policy_in]
threshold=[スケールインを開始するLoad Average(ここでは1)]
---------------------------------------------------------------
  
[root@manage01 ~]#
							


⑰ 
実際にssh_scale.pyを実行してテストします。
現在はscale01のみがロードバランサー配下で稼働していますが、⑯でmin_sizeを2に指定しているため、1台追加されます。
クラウドコンソール上でも「VM-」から始まるサーバーが1台追加されていることを確認します。
[root@manage01 ~]# /usr/bin/ssh_scale.py
2016-01-27 13:42:41,471 transport[1379] [INFO]: Connected (version 2.0, client OpenSSH_5.3)
2016-01-27 13:42:41,565 transport[1379] [INFO]: Authentication (publickey) successful!
~~~~~~~~~~~~~~~~~~
2016-01-27 13:44:01 *** scale in check ***
2016-01-27 13:44:01 la_threshold_in  : 1
2016-01-27 13:44:01 now_la           : 0
2016-01-27 13:44:01 now_vm_count     : 2
[root@manage01 ~]#
							

サーバー追加確認



⑱ 
自動監視スクリプトを起動するために、運用サーバーのcronにて自動実行するように設定します。
[root@manage01 ~]# (crontab -l; echo "* * * * * /usr/bin/ssh_scale.py >> /var/log/ssh_scale.log 2>&1") | crontab -
no crontab for root(crontab登録がないときに出るメッセージ)
[root@manage01 ~]# crontab –l
* * * * * /usr/bin/ssh_scale.py >> /var/log/ssh_scale.log 2>&1
[root@manage01 ~]#
							
以上で運用サーバーの設定は完了です。次に実際にスケールアウトを自動で行うかテストをします。
 

 

3. スケールアウトのテスト

実際にスケールアウトするかテストで負荷をかけて確認をします。
本章では運用サーバー、監視対象サーバー、双方で作業をするので作業するサーバーに注意してください。
また、運用サーバーと監視対象サーバーは、それぞれ別々のssh接続で作業を行ってください。
 
① ※※この工程は監視対象サーバーでの作業です※※
監視対象サーバーで負荷をかけるためにストレステストツールを導入します。
[root@scale01 ~]# yum -y install epel-release
 ~~~~~~~~~~
完了しました!
New leaves:
  epel-release.noarch
[root@scale01 ~]# yum -y install stress
~~~~~~~~~~
完了しました!
New leaves:
  stress.x86_64 
[root@scale01 ~]#
							


② ※※この工程は監視対象サーバーでの作業です※※
ストレステストツールを実行します。
[root@scale01 ~]# stress -c 4 > /dev/null &
[1] 3154 (pidのため、必ずしも同じにはなりません。)
[root@scale01 ~]# 
							


 ※※この工程は監視対象サーバーでの作業です※※
何回かwコマンドを実行してLoadAverageがしきい値(ここでは2)を超えることを確認します。
[root@scale01 ~]# w
 14:22:02 up 10:37,  3 users,  load average: 0.43, 0.63, 0.44
USER     TTY      FROM              LOGIN@   IDLE   JCPU   PCPU WHAT
~~~~~~~~~~~~~
[root@scale01 ~]# w
 14:22:17 up 10:37,  3 users,  load average: 1.22, 0.80, 0.49
~~~~~~~~~~~~~
[root@scale01 ~]# w
 14:22:39 up 10:38,  3 users,  load average: 2.01, 1.00, 0.57
~~~~~~~~~~~~~
[root@scale01 ~]# 
							


 ※※この工程は運用サーバーでの作業です※※
tailコマンドでssh_scale.pyの実行ログを確認し、サーバーを増やす挙動があることを確認します。(出ていない場合は、1分程度待って再度実行します。)
[root@manage01 ~]# tail /var/log/ssh_scale.log
2016-01-27 14:23:10 query job        : jobid: 2dd58c04-5666-481e-b756-d3a89ed61614, jobstatus: 0
2016-01-27 14:23:20 query job        : jobid: 2dd58c04-5666-481e-b756-d3a89ed61614, jobstatus: 0
2016-01-27 14:23:30 query job        : jobid: 2dd58c04-5666-481e-b756-d3a89ed61614, jobstatus: 0
2016-01-27 14:23:40 query job        : jobid: 2dd58c04-5666-481e-b756-d3a89ed61614, jobstatus: 0
2016-01-27 14:23:50 query job        : jobid: 2dd58c04-5666-481e-b756-d3a89ed61614, jobstatus: 1
2016-01-27 14:23:50 now vm count    : 3
2016-01-27 14:23:50 *** scale in check ***
2016-01-27 14:23:50 la_threshold_in  : 1
2016-01-27 14:23:50 now_la           : 3
2016-01-27 14:23:51 now_vm_count     : 3
[root@manage01 ~]# 
							


⑤ (2) 運用サーバーの作成とスクリプトの設定 の⑰を参考にしてコントロールパネルにVM-から始まるサーバーが増えていることを確認します。
 
⑥ ※※この工程は監視対象サーバーでの作業です※※
ストレステストツールを終了して負荷を下げます。
[root@scale01 ~]# killall stress
[1]+  終了しました      stress -c 4 > /dev/null
[root@scale01 ~]# 
							


 ※※この工程は監視対象サーバーでの作業です※※
数分置いてからwコマンドを実行してLoadAverageがしきい値(ここでは1)以下に下がったことを確認します。
[root@scale01 ~]# w
14:38:28 up 10:54,  3 users,  load average: 0.20, 2.06, 2.04
USER     TTY      FROM              LOGIN@   IDLE   JCPU   PCPU WHAT
~~~~~~~~~~~~~
[root@scale01 ~]#
							


⑧ クラウドコンソール上にて、スケールしたVM-から始まるサーバーが自動で削除されていることを確認します。
(ステータスがstoppingなどの状態の場合は、数分待ってからブラウザを更新してください。)



⑨ ※※この工程は運用サーバーでの作業です※※
tailコマンドでssh_scale.pyの実行ログを確認し、正常に稼働していることを確認します。
実行時間が1分間の間に発生していて、now_vm_countが設定したmin_sizeと同じことを確認します。
 
[root@manage01 ~]# tail /var/log/ssh_scale.log
2016-01-27 15:18:01,888 transport[1379] [INFO]: Secsh channel 1 opened.
2016-01-27 15:18:02,018 transport[1379] [INFO]: Secsh channel 2 opened.
2016-01-27 15:18:01 *** scale out check ***
2016-01-27 15:18:01 la_threshold_out : 2
2016-01-27 15:18:01 now_la           : 0
2016-01-27 15:18:02 now_vm_count     : 2
2016-01-27 15:18:02 *** scale in check ***
2016-01-27 15:18:02 la_threshold_in  : 1
2016-01-27 15:18:02 now_la           : 0
2016-01-27 15:18:02 now_vm_count     : 2 
[root@manage01 ~]#
							
これでWebサーバーを自動で追加して負荷分散するオートスケールの設定ができるようになりました。


本書では新しくIPアドレスを追加してロードバランサーの設定を行いましたが、ゾーンにデフォルトで払い出されるIPアドレスでも実施可能です。
 
オートスケールの機能を使うことにより夜間休日問わず、不測の急激なアクセスに対応をし、Webサーバーのレスポンス速度を負荷分散によって平準化したり、耐障害性を高めることが自動でできるようになります。
今回はIDCフロンティアにて用意をしたサンプルスクリプトにて動作確認を行いましたが、APIは公開しておりますので同じ仕組みで自作スクリプトを作成し、自由に柔軟なスケーリングを構築することもできます。APIのコントロールパネルには実行IPアドレスを制限するセキュリティ強化機能も付属していますので、合わせて使用することをおすすめいたします。



このページの先頭へ このページの先頭へ