IBMCloud CPU負荷によるAutoScale VPC

##目的
IBMCloudのVPC Gen2において、バックエンドインスタンスのCPU負荷状況に応じたAutoScaleを試す
今回は、AutoScaleルールに従って正常にインスタンスが上下するか確認する
またフロントにLBを構成し、インスタンスが上下した際もサービス停止が発生しない事を確認する

##構成
* ローカル端末：macOS Catalina 10.15.6 1台
* プラットフォーム:IBMCloud
    * AutoScale:インスタンステンプレート/インスタンスグループ 1サービス
    * VPC:ロードバランサー 1サービス
        * 仮想マシンインスタンス(1~2台)

**AutoScaleルール**

* 最低仮想マシンインスタンスを1台稼働させる
* CPU負荷が平均50%を上回り続けた場合、インスタンスを増加させる(**集約期間の90秒間の平均**)
* CPU負荷が平均50%を下回り続けた場合、インスタンスを減少させる(**集約期間の90秒間の平均**)


詳しいAutoScaleの仕組みはこちらを参照:[オートスケールのためのインスタンス・グループの作成](https://cloud.ibm.com/docs/vpc?topic=vpc-creating-auto-scale-instance-group&locale=ja)

##インスタンステンプレートの作成
AutoScaleする際の仮想マシンを予め定義しておくルールを作成する。
このテンプレートに従って、インスタンスが作成される。

**インスタンステンプレート** -> **作成**を選択
![IBM_Cloud_Infrastructure-8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/b6f04b81-8cb8-7903-2c7f-59e779f871f7.png)

* 名前:任意名
* 仮想プライベートクラウド:自分のVPC
* リソースグループ:自分のリソースグループ
* ロケーション:任意のロケーション
* イメージ:AutoScaleでデプロイする仮想マシンの種類を選択
* プロファイル:AutoScaleでデプロイする仮想マシンのプロファイルを選択

![IBM_Cloud_Infrastructure.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/9cef82b8-1e3b-a82e-7cc7-acfeb993ecac.png)

* SSH鍵:デプロイした仮想マシンに予め組み込ませるSSH鍵を選択
* ユーザデータ:デプロイした際に、一緒に実行しておきたいスクリプトなどを入力
    * yum -y install httpd :**Apacheをインストールする**
    * hostname > /var/www/html/index.html :**hostnameを表示させるhtmlを生成**
    * ln -sf  /usr/share/zoneinfo/Asia/Tokyo /etc/localtime :**ローカルタイムを変更**
    * systemctl start httpd : **apacheを起動**

```
#!/bin/sh
yum -y install httpd
hostname > /var/www/html/index.html
ln -sf  /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
systemctl start httpd
```

![IBM_Cloud_Infrastructure-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/710c94e1-51af-deef-4ba1-4d4090aefa7d.png)

##インスタンスグループの作成

**インスタンスグループ** -> **作成**を選択
![IBM_Cloud_Infrastructure-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/1181c2c0-9551-faf9-1ae0-fa258b41758d.png)

* 名前:任意名
* リソースグループ:自分のリソースグループを選択
* Region:任意のリージョンを選択

![IBM_Cloud_Infrastructure-4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/271c80c4-f079-43b4-b4ed-c9d5d40c7943.png)

* 名前:先ほど作成したインスタンステンプレートを選択
* サブネット:バックエンドで動作する仮想マシンインスタンスのサブネットを選択
* ロードバランサー:フロントで動作するLBを指定し、バックエンド側のアプリケーションポートを指定
* スケーリング方式:CPU負荷に応じてスケールさせるため、**動的**を選択

![IBM_Cloud_Infrastructure-5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/7121e221-cec8-e702-e56e-735d43d0d1bf.png)

* 最小インスタンス:最低1台稼働させるため、**1**とする
* 最大インスタンス:CPU負荷に応じて、最大2台とするため、**2**とする
* 集約時間:最小値の**90**とする(90秒間の平均でスケールを判断)
* クールダウン:最小値の**120**とする(頻繁にスケールしないようにクール時間を指定)
* メトリックタイプ:CPUの負荷でスケールさせるため、**CPU使用率(%)**を選択
* 平均ターゲット使用量:仮想マシンのCPU使用率を50%でスケールさせるため、**50**を入力


最後に、**保存** -> 右上の✓をいれて、**インスタンスグループの作成**を選択
![IBM_Cloud_Infrastructure-6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/3f31cb0f-6899-bc59-7823-b8474c94cb75.png)





##動作確認
###AutoScale動作前のロードバランサ配下インスタンスの状態
ロードバランサのIDを確認

```
% ibmcloud is lbs
ID                                          名前                                                         ファミリー    サブネット                                             パブリックです   プロビジョン状況   作動状況   リソース・グループ
r006-b386228d-4792-4570-8e8d-27fbf749d182   kh-alb                                                       Application   khsubnet                                               true             active             online     khoshina
```

ロードバランサ配下のプールIDを確認

```
% ibmcloud is lb r006-b386228d-4792-4570-8e8d-27fbf749d182
プール               ID                                          名前
                     r006-f4c2012e-7bba-4871-a4b2-1206b3af20c9   kh-alb-backend
```

プール配下の仮想サーバインスタンスの状態を確認、まだ何もない状態

```
% ibmcloud is lb-pms r006-b386228d-4792-4570-8e8d-27fbf749d182 r006-f4c2012e-7bba-4871-a4b2-1206b3af20c9
メンバーが見つかりませんでした。
```

AutoScaleのグループを有効にすると、最小インスタンス1に従って、自動で仮想サーバインスタンス1台が作成される

```
% ibmcloud is lb-pms r006-b386228d-4792-4570-8e8d-27fbf749d182 r006-f4c2012e-7bba-4871-a4b2-1206b3af20c9
ID                                          ポート   ターゲット      重み   ヘルス    作成済み                        プロビジョン状況
r006-4b3b605e-ea00-4f93-8053-a51796225eff   80       10.240.128.20   50     unknown   2020-09-22T20:56:26.914+09:00   create_pending
|
|
ID                                          ポート   ターゲット      重み   ヘルス    作成済み                        プロビジョン状況
r006-4b3b605e-ea00-4f93-8053-a51796225eff   80       10.240.128.20   50     faulted   2020-09-22T20:56:26.914+09:00   active
|
|
ID                                          ポート   ターゲット      重み   ヘルス   作成済み                        プロビジョン状況
r006-4b3b605e-ea00-4f93-8053-a51796225eff   80       10.240.128.20   50     ok       2020-09-22T20:56:26.914+09:00   active
```

##負荷掛け開始
仮想サーバインスタンスへ負荷を開始
AutoScaleの発動条件である、<font color=red>CPU負荷率は50％以上をキープしている(%idleが30%程度)</font>

```
2020年  9月 22日 火曜日 21:13:51 JST
# dd if=/dev/urandom | gzip -9 >> /dev/null &
[1] 1744

# sar -p 1
                CPU     %user     %nice   %system   %iowait    %steal     %idle
21時13分50秒     all      0.00      0.00      0.00      0.00      0.00    100.00
21時13分51秒     all      0.50      0.00      0.50      0.00      0.00     99.00
21時13分52秒     all     21.72      0.00      6.57      0.51      0.00     71.21
21時13分53秒     all     52.08      0.00     14.58      0.00      0.00     33.33
21時13分54秒     all     51.02      0.00     15.82      0.00      0.00     33.16
21時13分55秒     all     52.33      0.00     14.51      0.00      0.00     33.16
21時13分56秒     all     51.30      0.00     13.47      0.00      1.04     34.20
```

AutoScale開始
負荷がけ開始から、<font color=red>およそ2分後にAutoScaleが発動</font>した

```
#ibmcloud is lb-pms r006-b386228d-4792-4570-8e8d-27fbf749d182 r006-f4c2012e-7bba-4871-a4b2-1206b3af20c9 & date
2020年 9月22日 火曜日 21時15分57秒 JST
ID                                          ポート   ターゲット      重み   ヘルス    作成済み                        プロビジョン状況
r006-4b3b605e-ea00-4f93-8053-a51796225eff   80       10.240.128.20   50     ok        2020-09-22T20:56:26.914+09:00   update_pending
r006-533248b5-816a-47ae-986c-6a066099853f   80       10.240.128.21   50     unknown   2020-09-22T21:15:58.447+09:00   create_pending
```

仮想サーバインスタンスの作成完了

```
#ibmcloud is lb-pms r006-b386228d-4792-4570-8e8d-27fbf749d182 r006-f4c2012e-7bba-4871-a4b2-1206b3af20c9 & date
2020年 9月22日 火曜日 21時16分18秒 JST
ID                                          ポート   ターゲット      重み   ヘルス    作成済み                        プロビジョン状況
r006-4b3b605e-ea00-4f93-8053-a51796225eff   80       10.240.128.20   50     ok        2020-09-22T20:56:26.914+09:00   active
r006-533248b5-816a-47ae-986c-6a066099853f   80       10.240.128.21   50     faulted   2020-09-22T21:15:58.447+09:00   active
```

ロードバランサのヘルスチェックが通り、分散対象リソースとしてロードバランサに組み込まれた
負荷がけ開始から、実際に利用可能になったのは<font color=red>2分45秒後</font>

```
#ibmcloud is lb-pms r006-b386228d-4792-4570-8e8d-27fbf749d182 r006-f4c2012e-7bba-4871-a4b2-1206b3af20c9 & date
2020年 9月22日 火曜日 21時16分36秒 JST
ID                                          ポート   ターゲット      重み   ヘルス   作成済み                        プロビジョン状況
r006-4b3b605e-ea00-4f93-8053-a51796225eff   80       10.240.128.20   50     ok       2020-09-22T20:56:26.914+09:00   active
r006-533248b5-816a-47ae-986c-6a066099853f   80       10.240.128.21   50     ok       2020-09-22T21:15:58.447+09:00   active
```

###LB分散動作の確認
httpsアクセスによる分散確認、均等にロードバランスされているのがわかる

```
% while true; do curl -w "gettime:%{time_total} " https://alb.xcloudyx.com; done
gettime:0.615598 kh-autoscale-grp-gmq28w1800-7qm3u
gettime:0.570493 kh-autoscale-grp-q2n803tsol-ev9ce
gettime:0.611571 kh-autoscale-grp-gmq28w1800-7qm3u
gettime:0.614285 kh-autoscale-grp-q2n803tsol-ev9ce
gettime:0.573616 kh-autoscale-grp-gmq28w1800-7qm3u
gettime:0.597437 kh-autoscale-grp-q2n803tsol-ev9ce
gettime:0.594196 kh-autoscale-grp-gmq28w1800-7qm3u
gettime:0.568270 kh-autoscale-grp-q2n803tsol-ev9ce
gettime:0.592016 kh-autoscale-grp-gmq28w1800-7qm3u
gettime:0.590057 kh-autoscale-grp-q2n803tsol-ev9ce
```

###負荷掛け停止

```
2020年  9月 22日 火曜日 21:28:57 JST
# kill %1
[1]+  Terminated              dd if=/dev/urandom | gzip -9 >> /dev/null

#sar -p 1
21時28分57秒     all     52.63      0.00     13.16      0.00      0.00     34.21
21時28分58秒     all     53.44      0.00     12.17      0.00      0.00     34.39
21時28分59秒     all      1.51      0.00      0.00      0.00      0.00     98.49
21時29分00秒     all      0.00      0.00      0.00      0.00      0.00    100.00
21時29分01秒     all      0.00      0.00      0.00      0.00      0.00    100.00
21時29分02秒     all      0.00      0.00      0.00      0.00      0.00    100.00
21時29分03秒     all      0.00      0.00      0.00      0.00      0.00    100.00
```

AutoScale開始（縮小)
負荷がけ停止から、<font color=red>およそ90秒後にAutoScaleが発動</font>した

```
2020年 9月22日 火曜日 21時30分36秒 JST
k.calc.cca1129@Koujis-MacBook-Pro ~ % ユーザー Kouji.Hoshina@ibm.com としてアカウント IBM の下でロード・バランサー・プール r006-f4c2012e-7bba-4871-a4b2-1206b3af20c9 のメンバーをリストしています...
ID                                          ポート   ターゲット      重み   ヘルス    作成済み                        プロビジョン状況
r006-4b3b605e-ea00-4f93-8053-a51796225eff   80       10.240.128.20   50     unknown   2020-09-22T20:56:26.914+09:00   delete_pending
r006-533248b5-816a-47ae-986c-6a066099853f   80       10.240.128.21   50     ok        2020-09-22T21:15:58.447+09:00   update_pending
```

インスタンスが削除された

```
2020年 9月22日 火曜日 21時30分49秒 JST
k.calc.cca1129@Koujis-MacBook-Pro ~ % ユーザー Kouji.Hoshina@ibm.com としてアカウント IBM の下でロード・バランサー・プール r006-f4c2012e-7bba-4871-a4b2-1206b3af20c9 のメンバーをリストしています...
ID                                          ポート   ターゲット      重み   ヘルス   作成済み                        プロビジョン状況
r006-533248b5-816a-47ae-986c-6a066099853f   80       10.240.128.21   50     ok       2020-09-22T21:15:58.447+09:00   update_pending
```

```
2020年 9月22日 火曜日 21時31分09秒 JST
k.calc.cca1129@Koujis-MacBook-Pro ~ % ユーザー Kouji.Hoshina@ibm.com としてアカウント IBM の下でロード・バランサー・プール r006-f4c2012e-7bba-4871-a4b2-1206b3af20c9 のメンバーをリストしています...
ID                                          ポート   ターゲット      重み   ヘルス   作成済み                        プロビジョン状況
r006-533248b5-816a-47ae-986c-6a066099853f   80       10.240.128.21   50     ok       2020-09-22T21:15:58.447+09:00   active
```

###インスタンス増加時
インスタンス増加時は、Webページのgetに一時５秒以上かかっている場面が見られた

```
gettime:0.610742 kh-autoscale-grp-q2n803tsol-ev9ce
gettime:0.609017 kh-autoscale-grp-q2n803tsol-ev9ce
gettime:0.596975 kh-autoscale-grp-q2n803tsol-ev9ce
gettime:0.585924 kh-autoscale-grp-q2n803tsol-ev9ce
gettime:0.446488 kh-autoscale-grp-q2n803tsol-ev9ce
gettime:0.607215 kh-autoscale-grp-q2n803tsol-ev9ce

gettime:5.610640 kh-autoscale-grp-q2n803tsol-ev9ce

gettime:0.578460 kh-autoscale-grp-q2n803tsol-ev9ce
```

###インスタンス減少時
減少時も同様にwebページのgetに5秒ちょっとかかる場面が見られた

```
gettime:0.602480 kh-autoscale-grp-lpm7yldef6-qyz06
gettime:0.581108 kh-autoscale-grp-q2n803tsol-ev9ce
gettime:0.612629 kh-autoscale-grp-lpm7yldef6-qyz06
gettime:0.599119 kh-autoscale-grp-q2n803tsol-ev9ce
gettime:0.590478 kh-autoscale-grp-lpm7yldef6-qyz06
gettime:0.610427 kh-autoscale-grp-lpm7yldef6-qyz06

gettime:5.608297 kh-autoscale-grp-lpm7yldef6-qyz06

gettime:0.581778 kh-autoscale-grp-lpm7yldef6-qyz06
```