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」が行われます。