Auto Scale(オートスケール)¶
重要
本内容は salcoud/autoscaler を利用して、お客様ご自身で監視専用のサーバもご用意いただくオートスケールの構築例です。
コントロールパネルから簡単に設定が可能となり、監視専用サーバも不要となったさくらのクラウドの「オートスケール」につきましては以下のマニュアルをご確認ください。
オートスケール
[更新: 2022年5月26日]
さくらのクラウドの「アクティビティグラフ」の情報を利用して、自動でスケールアウト・インを行うオートスケールの環境を構築可能です。
事前準備¶
さくらのクラウドで、「サーバー2台」と「エンハンスドロードバランサ」を作成します。
autoscalerを実行するサーバー
名前 | autoscale1 |
---|---|
プラン | 1Core-1GB |
NIC | 共有セグメント |
OS | AlmaLinux 8.4 |
エンハンスドロードバランサに参加させるサーバー
こちらのサーバはオートスケールにより、削除されないよう名前をオートスケールのサーバグループ名とは異なるサーバ名(ここでは「base1」)で作成します。
名前 | base1 |
---|---|
プラン | 1Core-1GB |
NIC | 共有セグメント |
OS | AlmaLinux 8.4 |
また、「base1」にはテスト用のnginxをインストールします。
sudo yum install -y nginx
sudo systemctl enable nginx
echo -e "keepalive_requests 10;\ngzip_proxied any;\ngzip on \ngzip_http_version 1.0;\ngzip_comp_level 9;\ngzip_types text/html;" > /etc/nginx/conf.d/gzip.conf
# 負荷をかけるためのテスト用コンテンツ。wikipediaのページをダウンロードして使います
curl https://ja.wikipedia.org/wiki%E4%B8%96%E7%95%8C%E9%81%BA%E7%94%A3 > /usr/share/nginx/html/sekai.html
sudo systemctl start nginx
echo "server name: $(hostname)" > /usr/share/nginx/html/index.html
echo "OK" > /usr/share/nginx/html/live
firewall-cmd --permanent --add-service http
firewall-cmd --reload
正常に動作しているかをcurlで確認します。
% curl https://example.com/
server name: base1
エンハンスドロードバランサを作成します。
名前 | tk-elb |
---|
実サーバとして「base1」を追加します。 ※サーバグループは「gr1」とします。
また、proxyされるようにルールも作成します。
以上で事前準備は完了です。
ロードバランサ経由でも正常に動作しているかをcurlで確認します。
% curl https://elb.example.com/
server name: base1
salcoud/autoscaler のセットアップ¶
「autoscale1」サーバーの設定を行います。
本ドキュメントでは「v0.6.2」の「autoscaler_linux-amd64.zip」をダウンロードします。
解凍後、所定の場所に設置します。
配布元: salcoud/autoscaler
wget https://github.com/sacloud/autoscaler/releases/download/v0.6.2/autoscaler_linux-amd64.zip
unzip autoscaler_linux-amd64.zip autoscaler
sudo install autoscaler /usr/local/sbin
systemd の unit ファイルもダウンロードして、/etc/systemd/system 直下にコピーします。
wget https://raw.githubusercontent.com/sacloud/autoscaler/main/examples/systemd/autoscaler_core.service
sudo cp autoscaler_core.service /etc/systemd/system/
autoscaler core の実行ユーザを作成し、必要なディレクトリを作成します。
sudo useradd -s /sbin/nologin -M autoscaler
sudo mkdir -p /etc/autoscaler
sudo mkdir -p /var/run/autoscaler
sudo chgrp autoscaler /var/run/autoscaler/
sudo chmod 770 /var/run/autoscaler/
また、autoscaler core サーバの起動時に環境変数を設定するファイルを /etc/autoscaler/core.config に作成します。
vi /etc/autoscaler/core.config
以下を記入します。TOKEN / SECRET は、さくらのクラウドのコントロールパネルから作成して記入してください。
作成については APIキー をご確認ください。
OPTIONS="--addr unix:/var/run/autoscaler/autoscaler.sock --config /etc/autoscaler/autoscaler.yaml --log-level info"
SAKURACLOUD_ACCESS_TOKEN=""
SAKURACLOUD_ACCESS_TOKEN_SECRET=""
autoscaler_core の設定¶
オートスケールに関する設定を行います。
「autoscaler.yaml」ファイルを作成し、「/etc/autoscaler/」直下に保存します。
※以下の設定では東京第2(tk1b)ゾーンにサーバーを作成します。
vi /etc/autoscaler/autoscaler.yaml
記入例
resources:
- type: ServerGroup
name: "hscale-group"
zone: "tk1b"
parent:
type: ELB
name: "hscale-elb"
selector:
names: ["tk-elb"]
min_size: 2
max_size: 5
shutdown_force: false
plans:
- name: smallest
size: 2
- name: medium
size: 3
- name: largest
size: 5
template:
# tags: [ "tag1", "tag2" ]
description: "hscale-group"
interface_driver: "virtio"
plan:
core: 1
memory: 1
dedicated_cpu: false
network_interfaces:
- upstream: "shared" # 共有セグメント
expose:
ports: [80]
server_group_name: "gr1"
disks:
- os_type: "almalinux"
plan: "ssd"
connection: "virtio"
size: 20
edit_parameter:
disabled: false
password: ""
disable_pw_auth: true
enable_dhcp: false
change_partition_uuid: true
ssh_keys:
- "ssh-ed25519 *****"
startup_scripts:
- |
#!/bin/bash
sudo yum install -y nginx
sudo systemctl enable nginx
echo -e "keepalive_requests 10;\ngzip_proxied any;\ngzip on;\ngzip_http_version 1.0;\ngzip_comp_level 9;\ngzip_types text/html;" > /etc/nginx/conf.d/gzip.conf
# 負荷をかけるためのテスト用コンテンツ。wikipediaのページをダウンロードして使います
curl https://ja.wikipedia.org/wiki/%E4%B8%96%E7%95%8C%E9%81%BA%E7%94%A3 > /usr/share/nginx/html/sekai.html
sudo systemctl start nginx
echo "server name: {{ .Name }}" > /usr/share/nginx/html/index.html
echo "OK" > /usr/share/nginx/html/live
firewall-cmd --permanent --add-service http
firewall-cmd --reload
# オートスケーラーの動作設定
autoscaler:
cooldown: 600 # ジョブの連続実行を抑止するためのクールダウン期間を秒数で指定。デフォルト: 600(10分)
autoscaler core を起動します。
sudo systemctl enable autoscaler_core.service
sudo systemctl start autoscaler_core.service
sudo systemctl status autoscaler_core.service
アクティビティグラフの情報取得¶
以下のファイルをダウンロードして、解凍したものを「/usr/local/bin/」に保存します。
配布元: sacloud-cpu-usage
本件では「sacloud-cpu-usage_linux_amd64.zip」を利用しています。
wget https://github.com/sacloud/sacloud-cpu-usage/releases/download/v0.0.7/sacloud-cpu-usage_linux_amd64.zip
unzip sacloud-cpu-usage_linux_amd64.zip sacloud-cpu-usage
sudo install sacloud-cpu-usage /usr/local/bin/
シェルスクリプトの作成¶
sacloud-cpu-usageを利用したシェルスクリプト「autoscale.sh」を作成し、/etc/autoscaler に設置します。
vi /etc/autoscaler/autoscale.sh
記入例
#!/bin/bash
set -e
cpu_usage=$(/usr/local/bin/sacloud-cpu-usage --env-from /etc/autoscaler/core.config --zone tk1b --prefix hscale-group --time 1 --query '.avg|round')
if [ $cpu_usage -gt 50 ]; then
echo "Scale up"
/usr/local/sbin/autoscaler inputs direct up --dest unix:/var/run/autoscaler/autoscaler.sock --resource-name hscale-group
elif [ $cpu_usage -lt 20 -a $cpu_usage -gt 1]; then
echo "Scale down"
/usr/local/sbin/autoscaler inputs direct down --dest unix:/var/run/autoscaler/autoscaler.sock --resource-name hscale-group
else
echo "Keep"
/usr/local/sbin/autoscaler inputs direct up --dest unix:/var/run/autoscaler/autoscaler.sock --desired-state-name smallest --resource-name hscale-group
fi
cronの設置から最初のサーバの作成・起動¶
以下のcronを設置します。
SHELL=/bin/bash
*/2 * * * * bash /etc/autoscaler/autoscale.sh |& logger -t autoscale
最初のCRON実行時に、設定にある最小スケールを確保するため、サーバが作成されて起動します。
スケールアップの確認¶
作成したサーバに別のサーバから「ApacheBench」コマンドでアクセス負荷をかけます。
正常にオートスケールが行われるかを確認します。
watch "ab -k -H 'Accept-Encoding: deflate, gzip, br' -c 3 -t 600 http://elb.example.com/sekai.html"
アクティビティグラフで負荷が上がってきているのが確認できます。
CPU負荷が上がっていることをcronにて検知するとオートスケールが行われます。
※cpu負荷により「hscale-group-003」が作成(Scale Up)されました。
「ApacheBench」を停止することで、cpu負荷が解消されて「Scale Down」が行われます。