オートスケール

[更新:2022年11月25日]

概要

オートスケール機能は、サーバに負荷が発生した際に対象サーバのスペックアップを行う「スケールアップ」と、台数を増やす「スケールアウト」の両方をご利用いただけます。サーバの負荷が解消されると、自動的にスケールダウンやスケールインが行われます。
サーバ負荷を検知するトリガーには アクティビティグラフ の「CPU TIME」を10分間隔で監視して利用しています。
※ 本機能には GitHub にて開発・公開しているオープンソース sacloud/autoscaler を使用しています。

追加・管理

コントロールパネル左側の「オートスケール」から新規追加や作成済みオートスケールの管理が可能です。

新規追加

事前準備(垂直スケール)

コントロールパネルからオートスケールの設定を行う前に、APIキーやオートスケールの対象となるサーバとエンハンスドロードバランサの準備が必要です。
本内容では例として、以下の構成でサーバとエンハンスドロードバランサの作成・設定を行っています。

  • 東京第2ゾーンと石狩第2ゾーンにサーバを作成する
  • サーバには「nginx」をインストールしてWebサイトを公開する
  • エンハンスドロードバランサを作成して実サーバを追加する
  • オートスケールをスケールアップ(垂直スケール)で設定する

オートスケール機能で使用するAPIキーを作成します。
※作成方法は「 APIキー 」をご確認ください。

APIキーの種類 リソース操作APIキー
アクセスレベル 作成・削除

東京第2ゾーンと石狩第2ゾーンにオートスケールの対象となるサーバを作成します。
※本構成例では作成したサーバに「nginx」をインストールしてWebサイトを公開しています。
※インストール方法については Auto Scale(オートスケール) をご参照ください。

スケールアップ(垂直スケール)の場合

ゾーン 東京第2ゾーン(tk1b) 石狩第2ゾーン(is1b)
名前 vscale-group-01 vscale-group-02
NIC 共有セグメント 共有セグメント

エンハンスドロードバランサを作成して、実サーバ(オートスケールの対象となるサーバ)を追加します。
※作成方法は「 エンハンスドロードバランサ 」をご確認ください。

名前 autoscale-lb

待ち受けポートを追加します。

オートスケールの作成

APIキー 事前に作成したAPIキーを選択します。
設定ファイル オートスケールの設定ファイルを入力します。設定例は以下をご参照ください。
監視対象が存在するゾーン オートスケールの監視対象のサーバが存在するゾーンを選択します。

例:スケールアップ(垂直スケール)の設定ファイル

resources:
  - type: Server
    selector:
      names: ["vscale-group"] #サーバ名のprefix
      zones: ["tk1b","is1b"] #オートスケール対象のサーバが存在するゾーン

    parent:
      type: ELB
      selector:
        names: ["autoscale-lb"] #エンハンスドLBの名前

    shutdown_force: false
    setup_grace_period: 90 #スケール後のバランサに戻す猶予時間

    plans:
      - name: smallest
        core: 1
        memory: 1
      - name: medium
        core: 3
        memory: 4
      - name: largest
        core: 8
        memory: 16

# オートスケーラーの動作設定
autoscaler:
  cooldown: 300

オートスケールの設定ファイルの詳細は sacloud/autoscalerのマニュアル をご覧ください。

なお、本機能では以下の設定は利用できません。

  • カスタムハンドラー設定
  • クールダウン期間(cooldown)以外のオートスケーラーの動作設定
  • さくらのクラウドAPI関連の設定
  • startup_scripts、ssh_keys、cloud_configでの外部ファイルの参照
監視対象のサーバ名のプリフィックス オートスケールの監視対象となるサーバ名のプリフィックス(接頭辞)を入力します。
性能アップするCPU使用率 任意の値を入力します。
性能ダウンするCPU使用率 任意の値を入力します。
名前 / 説明 / タグ / アイコン コントロールパネル上で表示するわかりやすい名前や説明の設定、タグ・ アイコン 機能による分類が可能です。

各項目を入力して「追加」をクリックします。

オートスケールの動作確認

「ApacheBench」コマンドを使用して、サーバに負荷を発生させることでオートスケールの動作を確認します。
確認方法の詳細につきましては Auto Scale(オートスケール) をご参照ください。

事前準備(水平スケール)

コントロールパネルからオートスケールの設定を行う前に、APIキーやオートスケールの対象となるサーバとロードバランサの準備が必要です。
本内容では例として、プライベートネットワーク内でロードバランサアプライアンスを使ってオートスケールを行います。
この例ではCPU使用率の監視対象となるサーバを1台、オートスケールは0台から最大7台まで増えるように設定しています。
なお、CPU使用率の監視対象となるサーバはオートスケール対象外です。

以下の構成を東京第2ゾーンで作成しています。

  • スイッチ(ルータは必要ありません)
  • VPCルータ(NATのために利用します)
  • 踏み台サーバ(グローバルネットワーク、スイッチ両方のネットワークに接続して、プライベートネットワーク内のサーバにアクセスするために使います)
  • プライベートネットワークは 192.168.10.0/24 を使います
  • VPCルータのプライベート側のIPアドレスは 192.168.0.254 とします

オートスケール機能で使用するAPIキーを作成します。
※作成方法は「 APIキー 」をご確認ください。

APIキーの種類 リソース操作APIキー
アクセスレベル 作成・削除

ロードバランサアプライアンスの作成

hscale-lb1 という名前で作成し、IPアドレスに 192.168.10.161 を指定します。

VIPとして 192.168.10.162 を登録します。

オートスケール対象外サーバの作成

hscale-base1 という名前でサーバを作成します。この例ではOSに RockyLinux をインストールしています。
NICはスイッチに接続して、IPアドレスに 192.168.10.171 を指定します。

サーバにはnginxを入れて、ロードバランサアプライアンスの実サーバとして動作するようネットワーク設定をします。
192.168.10.162 はロードバランサのVIPです。

sudo yum install -y nginx
sudo systemctl enable nginx
sudo systemctl start nginx
echo "server name: $(hostname)" | sudo tee  /usr/share/nginx/html/index.html
echo "OK" | sudo tee /usr/share/nginx/html/live
sudo firewall-cmd --permanent --add-service http
sudo firewall-cmd --reload
cat <<EOF | sudo tee -a /etc/sysctl.conf
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
EOF
sudo sysctl -p
sudo nmcli connection add type dummy ifname dummy0 ipv4.method manual ipv4.addresses 192.168.10.162/32 ipv6.method ignore

ロードバランサの実サーバとして登録

監視方法は「tcp」にして登録しています。

踏み台サーバから動作確認を行います。

$ curl 192.168.10.162
server name: hscale-base1

$ curl 192.168.10.162
server name: hscale-base1

オートスケールの設定

例:スケールアウト(水平スケール)の設定ファイル

resources:
  - type: ServerGroup
    name: "hscale-auto" # hscale-auto-001 というサーバが作成されます
    zone: "tk1b" #ゾーンはtk1b

    parent:
      type: LoadBalancer
      selector: "hscale-lb1" #ロードバランサアプライアンスの名前

    min_size: 0 #負荷がないときは0台。baseだけになります。
    max_size: 7

    shutdown_force: false

    plans:
      - name: smallest
        size: 0
      - name: medium
        size: 4
      - name: largest
        size: 7

    template:
      description: "hscale-servergroup"
      interface_driver: "virtio"
      plan: #サーバのプラン 1core 1GBのサーバ
        core: 1
        memory: 1
        dedicated_cpu: false

      network_interfaces:
        - upstream:
            id: 113301XXXXXX #スイッチのID
          assign_cidr_block: "192.168.10.128/27" # 192.168.10.128 - 192.168.10.159 から割り当てられる
          assign_netmask_len: 24
          default_route: "192.168.10.254" #VPCルータ
          expose:
            ports: [80]
            vips: ["192.168.10.162"] #ロードバランサのVIP
            health_check:
              protocol: "tcp"

      disks:
        - os_type: "rockylinux"
          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鍵
          - "ssh-rsa xxx"
          - "ssh-rsa xxx"

        startup_scripts: #nginxをインストールし、ロードバランサで利用できるネットワーク設定をする
          - |
            #!/bin/bash
            yum install -y nginx
            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
            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
            nmcli connection add type dummy ifname dummy0 ipv4.method manual ipv4.addresses 192.168.10.162/32 ipv6.method ignore
            cat <<EOF | tee -a /etc/sysctl.conf
            net.ipv4.conf.all.arp_ignore = 1
            net.ipv4.conf.all.arp_announce = 2
            EOF
            sysctl -p

# オートスケーラーの動作設定
autoscaler:
  cooldown: 300

対象のゾーンは tk1b で、平均CPU使用率が30%を超えるとスケールアウトするようにします。

オートスケールの動作確認

hscale-base1にて「stress」コマンドを実行し、負荷をかけるとオートスケールが実行されます。

$ yum install -y stress
$ stress -c 1
stress: info: [80781] dispatching hogs: 1 cpu, 0 io, 0 vm, 0 hdd

今回はCPU使用率を確認する間隔である10分ごとに1台ずつ増え、3台までサーバが増えています。

May 25 15:09:23 prod1 systemd[1]: Started SakuraCloud AutoScaler Input for 113400xxxxxx.
May 25 15:09:24 prod1 cpu_threshold_scaling.sh[77142]: 2022/05/25 15:09:24 hscale-base zone:tk1b cores:1 cpu:1.020000 time:2022-05-25 15:05:00 +0900 JST
May 25 15:09:24 prod1 cpu_threshold_scaling.sh[77142]: 2022/05/25 15:09:24 hscale-base avg:102.000000
May 25 15:09:24 prod1 cpu_threshold_scaling.sh[77142]: Do Up
May 25 15:09:24 prod1 autoscaler[76942]: timestamp=2022-05-25T15:09:24+09:00 level=info request=Up message="request received"
May 25 15:09:24 prod1 autoscaler[76942]: timestamp=2022-05-25T15:09:24+09:00 level=info request=Up source=default resource=hscale-auto status=JOB_ACCEPTED
May 25 15:09:24 prod1 autoscaler[76942]: timestamp=2022-05-25T15:09:24+09:00 level=info request=Up source=default resource=hscale-auto status=JOB_RUNNING
May 25 15:09:24 prod1 cpu_threshold_scaling.sh[77142]: status: JOB_ACCEPTED, job-id: hscale-auto
May 25 15:09:24 prod1 systemd[1]: autoscaler_113400948155_input.service: Succeeded.
May 25 15:09:24 prod1 autoscaler[76942]: timestamp=2022-05-25T15:09:24+09:00 level=info request=Up source=default resource=hscale-auto status=ACCEPTED
May 25 15:09:24 prod1 autoscaler[76942]: timestamp=2022-05-25T15:09:24+09:00 level=info request=Up source=default resource=hscale-auto status=RUNNING
May 25 15:09:24 prod1 autoscaler[76942]: timestamp=2022-05-25T15:09:24+09:00 level=info request=Up source=default resource=hscale-auto status=RUNNING log=creating...
May 25 15:09:26 prod1 autoscaler[76942]: timestamp=2022-05-25T15:09:26+09:00 level=info request=Up source=default resource=hscale-auto status=RUNNING log="created: {ID:113400xxxxxx, Name:hscale-auto-001}"
May 25 15:09:26 prod1 autoscaler[76942]: timestamp=2022-05-25T15:09:26+09:00 level=info request=Up source=default resource=hscale-auto status=RUNNING log="creating disk[0]..."
May 25 15:10:36 prod1 autoscaler[76942]: timestamp=2022-05-25T15:10:36+09:00 level=info request=Up source=default resource=hscale-auto status=RUNNING log="created disk[0]: {ID:113400xxxxxx, Name:hscale-auto-001-disk001, ServerID:113400xxxxxx}"
May 25 15:10:36 prod1 autoscaler[76942]: timestamp=2022-05-25T15:10:36+09:00 level=info request=Up source=default resource=hscale-auto status=RUNNING log=starting...
May 25 15:11:09 prod1 autoscaler[76942]: timestamp=2022-05-25T15:11:09+09:00 level=info request=Up source=default resource=hscale-auto status=DONE log=started
May 25 15:11:09 prod1 autoscaler[76942]: timestamp=2022-05-25T15:11:09+09:00 level=info request=Up source=default resource=hscale-auto status=ACCEPTED
May 25 15:11:09 prod1 autoscaler[76942]: timestamp=2022-05-25T15:11:09+09:00 level=info request=Up source=default resource=hscale-auto status=RUNNING
May 25 15:11:10 prod1 autoscaler[76942]: timestamp=2022-05-25T15:11:10+09:00 level=info request=Up source=default resource=hscale-auto status=RUNNING log="added: Server{VIP:192.168.10.162, IP: 192.168.10.129, Port:80}"
May 25 15:11:10 prod1 autoscaler[76942]: timestamp=2022-05-25T15:11:10+09:00 level=info request=Up source=default resource=hscale-auto status=RUNNING log=updating...
May 25 15:11:11 prod1 autoscaler[76942]: timestamp=2022-05-25T15:11:11+09:00 level=info request=Up source=default resource=hscale-auto status=RUNNING log=updated
May 25 15:11:11 prod1 autoscaler[76942]: timestamp=2022-05-25T15:11:11+09:00 level=info request=Up source=default resource=hscale-auto status=DONE
May 25 15:11:11 prod1 autoscaler[76942]: timestamp=2022-05-25T15:11:11+09:00 level=info request=Up source=default resource=hscale-auto status=JOB_DONE
May 25 15:19:33 prod1 systemd[1]: Started SakuraCloud AutoScaler Input for 113400xxxxxx.
May 25 15:19:34 prod1 cpu_threshold_scaling.sh[77173]: 2022/05/25 15:19:34 hscale-base zone:tk1b cores:1 cpu:1.020000 time:2022-05-25 15:15:00 +0900 JST
May 25 15:19:34 prod1 cpu_threshold_scaling.sh[77173]: 2022/05/25 15:19:34 hscale-base avg:102.000000
May 25 15:19:34 prod1 cpu_threshold_scaling.sh[77173]: Do Up
May 25 15:19:34 prod1 autoscaler[76942]: timestamp=2022-05-25T15:19:34+09:00 level=info request=Up message="request received"
May 25 15:19:34 prod1 autoscaler[76942]: timestamp=2022-05-25T15:19:34+09:00 level=info request=Up source=default resource=hscale-auto status=JOB_ACCEPTED
May 25 15:19:34 prod1 autoscaler[76942]: timestamp=2022-05-25T15:19:34+09:00 level=info request=Up source=default resource=hscale-auto status=JOB_RUNNING
May 25 15:19:34 prod1 cpu_threshold_scaling.sh[77173]: status: JOB_ACCEPTED, job-id: hscale-auto
May 25 15:19:34 prod1 systemd[1]: autoscaler_113400948155_input.service: Succeeded.
May 25 15:19:35 prod1 autoscaler[76942]: timestamp=2022-05-25T15:19:35+09:00 level=info request=Up source=default resource=hscale-auto status=ACCEPTED
May 25 15:19:35 prod1 autoscaler[76942]: timestamp=2022-05-25T15:19:35+09:00 level=info request=Up source=default resource=hscale-auto status=RUNNING
May 25 15:19:35 prod1 autoscaler[76942]: timestamp=2022-05-25T15:19:35+09:00 level=info request=Up source=default resource=hscale-auto status=RUNNING log=creating...
May 25 15:19:37 prod1 autoscaler[76942]: timestamp=2022-05-25T15:19:37+09:00 level=info request=Up source=default resource=hscale-auto status=RUNNING log="created: {ID:113400xxxxxx, Name:hscale-auto-002}"
May 25 15:19:37 prod1 autoscaler[76942]: timestamp=2022-05-25T15:19:37+09:00 level=info request=Up source=default resource=hscale-auto status=RUNNING log="creating disk[0]..."
May 25 15:20:27 prod1 autoscaler[76942]: timestamp=2022-05-25T15:20:27+09:00 level=info request=Up source=default resource=hscale-auto status=RUNNING log="created disk[0]: {ID:113400xxxxxx, Name:hscale-auto-002-disk001, ServerID:113400xxxxxx}"
May 25 15:20:27 prod1 autoscaler[76942]: timestamp=2022-05-25T15:20:27+09:00 level=info request=Up source=default resource=hscale-auto status=RUNNING log=starting...
May 25 15:21:00 prod1 autoscaler[76942]: timestamp=2022-05-25T15:21:00+09:00 level=info request=Up source=default resource=hscale-auto status=DONE log=started
May 25 15:21:00 prod1 autoscaler[76942]: timestamp=2022-05-25T15:21:00+09:00 level=info request=Up source=default resource=hscale-auto status=ACCEPTED
May 25 15:21:00 prod1 autoscaler[76942]: timestamp=2022-05-25T15:21:00+09:00 level=info request=Up source=default resource=hscale-auto status=RUNNING
May 25 15:21:00 prod1 autoscaler[76942]: timestamp=2022-05-25T15:21:00+09:00 level=info request=Up source=default resource=hscale-auto status=RUNNING log="added: Server{VIP:192.168.10.162, IP: 192.168.10.130, Port:80}"
May 25 15:21:00 prod1 autoscaler[76942]: timestamp=2022-05-25T15:21:00+09:00 level=info request=Up source=default resource=hscale-auto status=RUNNING log=updating...
May 25 15:21:01 prod1 autoscaler[76942]: timestamp=2022-05-25T15:21:01+09:00 level=info request=Up source=default resource=hscale-auto status=RUNNING log=updated
May 25 15:21:01 prod1 autoscaler[76942]: timestamp=2022-05-25T15:21:01+09:00 level=info request=Up source=default resource=hscale-auto status=DONE
May 25 15:21:01 prod1 autoscaler[76942]: timestamp=2022-05-25T15:21:01+09:00 level=info request=Up source=default resource=hscale-auto status=JOB_DONE
May 25 15:29:43 prod1 systemd[1]: Started SakuraCloud AutoScaler Input for 113400xxxxxx.
May 25 15:29:44 prod1 cpu_threshold_scaling.sh[77206]: 2022/05/25 15:29:44 hscale-base zone:tk1b cores:1 cpu:1.020000 time:2022-05-25 15:25:00 +0900 JST
May 25 15:29:44 prod1 cpu_threshold_scaling.sh[77206]: 2022/05/25 15:29:44 hscale-base avg:102.000000
May 25 15:29:45 prod1 cpu_threshold_scaling.sh[77206]: 2022/05/25 15:29:45 hscale-auto-001 zone:tk1b cores:1 cpu:0.026667 time:2022-05-25 15:25:00 +0900 JST
May 25 15:29:45 prod1 cpu_threshold_scaling.sh[77206]: 2022/05/25 15:29:45 hscale-auto-001 avg:2.666667
May 25 15:29:45 prod1 cpu_threshold_scaling.sh[77206]: Do Up
May 25 15:29:45 prod1 autoscaler[76942]: timestamp=2022-05-25T15:29:45+09:00 level=info request=Up message="request received"
May 25 15:29:45 prod1 autoscaler[76942]: timestamp=2022-05-25T15:29:45+09:00 level=info request=Up source=default resource=hscale-auto status=JOB_ACCEPTED
May 25 15:29:45 prod1 autoscaler[76942]: timestamp=2022-05-25T15:29:45+09:00 level=info request=Up source=default resource=hscale-auto status=JOB_RUNNING
May 25 15:29:45 prod1 cpu_threshold_scaling.sh[77206]: status: JOB_ACCEPTED, job-id: hscale-auto
May 25 15:29:45 prod1 systemd[1]: autoscaler_113400948155_input.service: Succeeded.
May 25 15:29:46 prod1 autoscaler[76942]: timestamp=2022-05-25T15:29:46+09:00 level=info request=Up source=default resource=hscale-auto status=ACCEPTED
May 25 15:29:46 prod1 autoscaler[76942]: timestamp=2022-05-25T15:29:46+09:00 level=info request=Up source=default resource=hscale-auto status=RUNNING
May 25 15:29:46 prod1 autoscaler[76942]: timestamp=2022-05-25T15:29:46+09:00 level=info request=Up source=default resource=hscale-auto status=RUNNING log=creating...
May 25 15:29:48 prod1 autoscaler[76942]: timestamp=2022-05-25T15:29:48+09:00 level=info request=Up source=default resource=hscale-auto status=RUNNING log="created: {ID:113400xxxxxx, Name:hscale-auto-003}"

ロードバランサからのアクセスもそれぞれのサーバに振られています。

$ curl 192.168.10.162
server name: hscale-auto-004
$ curl 192.168.10.162
server name: hscale-auto-003
$ curl 192.168.10.162
server name: hscale-auto-002
$ curl 192.168.10.162
server name: hscale-auto-001
$ curl 192.168.10.162
server name: hscale-base
$ curl 192.168.10.162
server name: hscale-auto-004
$ curl 192.168.10.162
server name: hscale-auto-003
$ curl 192.168.10.162
server name: hscale-auto-002
$ curl 192.168.10.162
server name: hscale-auto-001
$ curl 192.168.10.162
server name: hscale-base
$ curl 192.168.10.162
server name: hscale-auto-004
$ curl 192.168.10.162
server name: hscale-auto-003
$ curl 192.168.10.162
server name: hscale-auto-002
$ curl 192.168.10.162
server name: hscale-auto-001

「stress」コマンドを停止すると、段階的に hscale-auto-* のサーバは削除されていきます。

オートスケール設定の定期的な検証/不正時の動作停止について

オートスケールでは登録/更新時にオートスケール設定を検証していますが、登録/更新後に設定が不正な状態になる場合がございます。

例:

  • サーバの垂直スケール対象として設定したサーバの名前を変更した
  • コピー元ディスクとして指定した条件で検索すると複数のディスクがヒットするようになった

オートスケールは検証で正常性が確認できなくなると動作を継続できない状態となり動作を停止します。
このため、オートスケールは定期的に設定を検証し、正常な動作ができる状態であるか確認しています。

設定が不正な状態となっていることを検知すると緊急連絡用メールアドレスに設定されたメールアドレス(未設定の場合は会員IDの登録メールアドレス)宛に、以下のような文面でメール通知されます。

From: さくらのクラウド オートスケール <noreply@sakura.ad.jp>
Subject: 【さくらインターネット】オートスケール停止のお知らせ

※ このメッセージは自動送信されています。

さくらのクラウド オートスケール サービスです。
下記のご契約につきまして不正な状態になっていることを検知したためサービスを停止いたしました。

クラウドアカウント名:example
リソース名:example
リソースID:123456789012

お客様にてログ/ステータスのご確認をお願いいたします。

さくらのクラウドマニュアル - オートスケール
https://manual.sakura.ad.jp/cloud/autoscale/index.html

※本メールは自動送信用メールアドレスから送信しているため、そのまま返信しても弊社よりご連絡できません。