Hateburo: kazeburo hatenablog

SRE / 運用系小姑 / Goを書くPerl Monger

sacloud/autoscaler でさくらのクラウドの水平スケールを試す

さくらのクラウドでオートスケールを実現する sacloud/autoscaler が v0.1.0 で水平スケールに対応したので試してみます。

github.com

yamamoto_febc さんのさくらのイベントでの発表資料はこちら

speakerdeck.com

sacloud/autoscalerの構成を知るためにはこの資料を最初に目を通すのをお勧めします。

またv0.1.0 以前からサポートしている垂直スケールにつてはこちらの記事もわかりやすいです!

qiita.com

qiita.com

とりあえず、今回の水平スケールは、サーバの増減とエンハンスド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されるようルールもつくります。

f:id:kazeburo:20210802144447p:plain

f:id:kazeburo:20210802144555p:plain

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台サーバが作成されていきます。

f:id:kazeburo:20210802144819p:plain

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

f:id:kazeburo:20210802144956p:plain

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などで実行することで、時間帯に合わせてサーバを増減させたり、必要なサーバ台数をキープすることもできそうです。

うまく使えると運用が楽できそうー