sacloud/autoscaler でさくらのクラウドの水平スケールを試す
さくらのクラウドでオートスケールを実現する sacloud/autoscaler が v0.1.0 で水平スケールに対応したので試してみます。
yamamoto_febc さんのさくらのイベントでの発表資料はこちら
sacloud/autoscalerの構成を知るためにはこの資料を最初に目を通すのをお勧めします。
またv0.1.0 以前からサポートしている垂直スケールにつてはこちらの記事もわかりやすいです!
とりあえず、今回の水平スケールは、サーバの増減とエンハンスドLBにサーバを参加させるところまでを試しました。
準備
サーバを2台とエンハンスドLBを作っておきます。
まず、autoscalerを動かすサーバを作成します。
名前: autoscale1 プラン: 1Core-1GB #最小 NIC: 共有セグメント OS: AlmaLinux 8.4
設定はあとでやります。
次に、エンハンスドLBに参加させるサーバを作成。
名前: base1 プラン: 1Core-1GB #最小 NIC: 共有セグメント OS: AlmaLinux 8.4
このサーバの名前を、下でオートスケールするサーバグループの名前から始まるように設定すると、オートスケールの管理下に置かれ、スケールダウンした際にサーバが削除される可能性があります。
サーバが起動したら、テスト用のnginxをいれておきます
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
エンハンスドLBを作成し、実サーバとして base1 を追加(サーバグループは gr1 とします)。またproxyされるようルールもつくります。


curlでも動作を確認
% curl https://example.com/ server name: base1
salcoud/autoscalerのセットアップ
まずダウンロードして所定の場所に設置
wget https://github.com/sacloud/autoscaler/releases/download/v0.1.0/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 に作ります。
$ cat /etc/autoscaler/core.config OPTIONS="--addr unix:/var/run/autoscaler/autoscaler.sock --config /etc/autoscaler/autoscaler.yaml --log-level info" SAKURACLOUD_ACCESS_TOKEN="" SAKURACLOUD_ACCESS_TOKEN_SECRET=""
TOKEN, SECRETはさくらのクラウドのコントロールパネルから作成して設定してください。
さて、最後にオートスケールに関する設定をします。今回は以下のようにしました。
resources:
- type: ELB
name: "hscale-elb"
selector:
names: ["tk-elb"] #エンハンスドLBに設定した名前
resources:
- type: ServerGroup
name: "hscale-group" #サーバのプリフィックスにもなります
zone: "tk1a"
min_size: 2
max_size: 5
shutdown_force: false
plans:
- name: smallest
size: 2
- name: medium
size: 3
- name: largest
size: 5
template:
description: "hscale-group"
interface_driver: "virtio"
plan:
core: 1
memory: 1
dedicated_cpu: false
network_interfaces:
- upstream: "shared" # 共有セグメント
expose:
ports: [80] #エンハンスドLBで使われるport番号
server_group_name: "gr1" #エンハンスドLBで使われるグループ名
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 …." # サーバにログインするためのssh鍵
startup_scripts:
- |
#!/bin/bash
sudo yum install -y nginx
sudo systemctl enable nginx
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: 180 # ジョブの連続実行を抑止するためのクールダウン期間を秒数で指定。デフォルト: 600(10分)
このファイルを /etc/autoscaler/autoscaler.yaml におきます
おいたら、autoscaler coreを起動します
sudo systemctl enable autoscaler_core.service sudo systemctl start autoscaler_core.service sudo systemctl status autoscaler_core.service
うまく動かない場合はstatusやログを確認するとよいでしょう
sudo journalctl -f -u autoscaler_*
オートスケールの検証
さっそく、スケールアップしてみましょう。
v0.1.0では対象のサーバが一台もないときに、スケールアップができない問題があるので desired-state-name をつけて、スケールアップをします。
コマンドは次のようになります。
$ sudo autoscaler inputs direct up --dest unix:/var/run/autoscaler/autoscaler.sock --desired-state-name smallest --resource-name hscale-group status: JOB_ACCEPTED, job-id: hscale-group
リソースとして、サーバグループの指定も必要です。 smallestの状態にするため、2台サーバが作成されていきます。

ロードバランサーにも追加されています

autoscalerのログでも作成の様子が確認できます。
Aug 02 14:01:45 autoscale1 autoscaler[451218]: timestamp=2021-08-02T14:01:45+09:00 level=info message="autoscaler core started" address=/var/run/autoscaler/autoscaler.sock
Aug 02 14:01:59 autoscale1 autoscaler[451218]: timestamp=2021-08-02T14:01:59+09:00 level=info request=Up message="request received"
Aug 02 14:01:59 autoscale1 autoscaler[451218]: timestamp=2021-08-02T14:01:59+09:00 level=info request=Up source=default resource=hscale-group status=JOB_ACCEPTED
Aug 02 14:01:59 autoscale1 autoscaler[451218]: timestamp=2021-08-02T14:01:59+09:00 level=info request=Up source=default resource=hscale-group status=JOB_RUNNING
Aug 02 14:01:59 autoscale1 autoscaler[451218]: timestamp=2021-08-02T14:01:59+09:00 level=info request=Up source=default resource=hscale-group type=ServerGroupInstance zone=tk1a id="(known after handle)" name=hscale-group-001 step=Handle handler=server-horizontal-scaler status=ACCEPTED
Aug 02 14:01:59 autoscale1 autoscaler[451218]: timestamp=2021-08-02T14:01:59+09:00 level=info request=Up source=default resource=hscale-group type=ServerGroupInstance zone=tk1a id="(known after handle)" name=hscale-group-001 step=Handle handler=server-horizontal-scaler status=RUNNING
Aug 02 14:01:59 autoscale1 autoscaler[451218]: timestamp=2021-08-02T14:01:59+09:00 level=info request=Up source=default resource=hscale-group type=ServerGroupInstance zone=tk1a id="(known after handle)" name=hscale-group-001 step=Handle handler=server-horizontal-scaler status=RUNNING log=creating...
Aug 02 14:02:06 autoscale1 autoscaler[451218]: timestamp=2021-08-02T14:02:06+09:00 level=info request=Up source=default resource=hscale-group type=ServerGroupInstance zone=tk1a id="(known after handle)" name=hscale-group-001 step=Handle handler=server-horizontal-scaler status=RUNNING log="created: {ID:113301403488, Name:hscale-group-001}"
Aug 02 14:02:06 autoscale1 autoscaler[451218]: timestamp=2021-08-02T14:02:06+09:00 level=info request=Up source=default resource=hscale-group type=ServerGroupInstance zone=tk1a id="(known after handle)" name=hscale-group-001 step=Handle handler=server-horizontal-scaler status=RUNNING log="creating disk[0]..."
Aug 02 14:04:46 autoscale1 autoscaler[451218]: timestamp=2021-08-02T14:04:46+09:00 level=info request=Up source=default resource=hscale-group type=ServerGroupInstance zone=tk1a id="(known after handle)" name=hscale-group-001 step=Handle handler=server-horizontal-scaler status=RUNNING log="created disk[0]: {ID:113301403491, Name:hscale-group-001-disk001, ServerID:113301403488}"
Aug 02 14:04:46 autoscale1 autoscaler[451218]: timestamp=2021-08-02T14:04:46+09:00 level=info request=Up source=default resource=hscale-group type=ServerGroupInstance zone=tk1a id="(known after handle)" name=hscale-group-001 step=Handle handler=server-horizontal-scaler status=RUNNING log=starting...
Aug 02 14:05:35 autoscale1 autoscaler[451218]: timestamp=2021-08-02T14:05:35+09:00 level=info request=Up source=default resource=hscale-group type=ServerGroupInstance zone=tk1a id="(known after handle)" name=hscale-group-001 step=Handle handler=server-horizontal-scaler status=DONE log=started
Aug 02 14:05:35 autoscale1 autoscaler[451218]: timestamp=2021-08-02T14:05:35+09:00 level=info request=Up source=default resource=hscale-group type=ServerGroupInstance zone=tk1a id=113301403488 name=hscale-group-001 step=PostHandle handler=elb-servers-handler status=ACCEPTED
… 中略 …
Aug 02 14:09:13 autoscale1 autoscaler[451218]: timestamp=2021-08-02T14:09:13+09:00 level=info request=Up source=default resource=hscale-group status=JOB_DONE
ここからさらにスケールアップするときは、
sudo autoscaler inputs direct up --dest unix:/var/run/autoscaler/autoscaler.sock --resource-name hscale-group
スケールダウンする時は、
sudo autoscaler inputs direct down --dest unix:/var/run/autoscaler/autoscaler.sock --resource-name hscale-group
となります。
autoscaler coreの設定時に指定した通り、一度スケールアップ・ダウンをしてから cooldownの 180秒はコマンドを受け付けません。コマンドの結果は次のようになりました。
$ sudo autoscaler inputs direct up --dest unix:/var/run/autoscaler/autoscaler.sock --resource-name hscale-group status: JOB_DONE, job-id: hscale-group, message: job is in an unacceptable state $ echo $? 0
まとめ
sacloud/autoscalerではprometheusなどからwebhookを受け取ってスケールアップ・ダウンするサーバを起動できたりするので、監視ツールが整備されている場合、そこからのwebhookを受け取ってスケールアップやスケールアウトが実現できそう。それ以外でも今回使ったCLIツールをcronなどで実行することで、時間帯に合わせてサーバを増減させたり、必要なサーバ台数をキープすることもできそうです。
うまく使えると運用が楽できそうー