Azure Container Apps の Custom (KEDA) のスケーリングの設定方法 (CPU・Cron) 

# 本記事について

本記事では、Azure サーバーレスのコンテナーアプリの実行環境である [Azure Container Apps](https://learn.microsoft.com/ja-jp/azure/container-apps/overview) における、[Custom スケーリング](https://learn.microsoft.com/ja-jp/azure/container-apps/scale-app?pivots=azure-cli#custom)の設定方法を見ていきます。Custom スケーリングは柔軟性が高く豊富なオプションがありますが、あまり公開情報が多くないため、本記事では基本的なところをご紹介していきます。特に良く利用されそうな、CPU の利用量ベースでのスケーリングと Cron を使った指定時刻での起動・停止をどのように設定すれば行えるかを確認したいと思います。

# Azure Container Apps とは？

Azure Container Apps は、コンテナー化されたアプリケーションやマイクロサービス用のコンテナーを実行するのに最適化された、サーバーレスなコンテナーサービスです。HTTP/HTTPS のイングレスや、オートスケール、イベント駆動処理、カスタムドメインサポートや認証・認可 (Easy Auth) など、多くの機能を提供しています。

https://learn.microsoft.com/ja-jp/azure/container-apps/overview

また、組み込みで Dapr が利用できるようになっており、マイクロサービスの実行基盤としても最適です。

https://learn.microsoft.com/ja-jp/azure/container-apps/dapr-overview?tabs=bicep1%2Cyaml

# KEDA とは？

[Kubernetes Event-driven Autoscaling (KEDA)](https://learn.microsoft.com/ja-jp/azure/aks/keda-about) は、Kubernetes 環境のアプリケーションの自動スケーリングをシンプルにするためのコンポーネントであり、CNCF インキュベーションプロジェクトです。Azure Container Apps では、バックエンドに Kubernetes を採用しており、KEDA を利用してスケーリングの設定を行えるようになっています。

## KEDA のスケーラーについて

KEDA では、50種類を超えるスケーラーと呼ばれるスケールの起点となるメトリックをサポートしています。

https://keda.sh/docs/2.10/scalers/

Azure Container Apps では、KEDA の多くのスケーラーを利用して、コンテナーアプリをスケールアウト・インさせることができます。

https://learn.microsoft.com/ja-jp/azure/container-apps/scale-app?pivots=azure-cli#custom

# CPU によるスケーリング

最初に CPU の利用量に応じて、レプリカ数を増減させる方法について見ていきます。

## 利用する KEDA のスケーラー

Custom スケーリングで type として cpu を選ぶとき、下記の KEDA スケーラーを使うことになります。

https://keda.sh/docs/2.10/scalers/cpu/

## Azure Container Apps での設定方法

スケーリング（スケールルール）の設定は、リビジョンの作成から行います。スケーリングタブでスケールルールを追加します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276225/d504df79-ceb5-de66-1a1c-773f8ccc6dbc.png)

スケールルールで、「+追加」を押して、設定値を入れていきます。CPUでスケールさせる場合は、下記のような設定を入れます。

type には、Utilization と AverageValue の２つの選択肢があります。シンプルに利用量で考える場合は Utilization を選択します。Utilization を選択した場合は、value に CPU 利用量 (割合 [%]) を入れます。例えば、コンテナーアプリで、動いているコンテナーアプリの平均 CPU 利用率が60% を超えたらレプリカを増やしたいという場合は、60 [%] という値を入れます。

なお、CPUでスケールさせる場合は、最小レプリカ数は1となりますのでご注意ください。また、クーリングタイム（スケールインさせるための基準となる時間）は５分 (300秒) となっています。

```yaml
ルール名: <任意の名前>
種類: カスタム
カスタムルールの種類: cpu

メタデータ:
    type: <Utilization | AverageValue>
    value: <閾値となる CPU 利用量 (割合 [%])>
```

実際に入力する画面は以下のような感じになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276225/e4178b84-8f5b-4d10-60a0-da48c1399293.png)


## スケールのテスト

せっかくなので、コンテナーのCPU負荷を無理やりあげて、ちゃんとスケールするかテストしてみます。Ubuntuベースのコンテナーでコンソールに入り、下記コマンドを実行します。

```bash
apt update
apt install stress
stress --cpu 1 --timeout 5m
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276225/6b3dd092-a511-dcda-feae-50ac857e26d6.png)

最初、レプリカは１個立っています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276225/aee7b5a8-eb51-f668-5bdc-b232961ae869.png)

負荷をかけて少し待つと、下記のように新しいレプリカが１個立ち上がってきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276225/348951ee-5e9d-31dd-0437-801b39fe826e.png)

メトリックで見ると下記のようにレプリカの増減とCPUの利用量を確認できます。CPU負荷が16:58-17:03でかけられており、それが終わると５分のクールダウンピリオドを経て、17:08 あたりでスケールインされています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276225/4afaa471-99a8-6405-52f0-f7bb4f4c6481.png)

# Cron によるスケーリング

次に、Cron を利用して、指定時間に起動・停止させる方法を見ていきます。

## 利用する KEDA のスケーラー

Custom スケーリングで type として cron を選ぶとき、下記の KEDA スケーラーを使うことになります。

https://keda.sh/docs/2.10/scalers/cron/

## Azure Container Apps での設定方法

スケールルールの設定で下記のように設定します。start と end の値は [Cron の記法](https://en.wikipedia.org/wiki/Cron)に従います。timezone の値は、[この Wikipedia 記事](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones)をご参照ください。

```yaml
ルール名: <任意の名前>
種類: カスタム
カスタムルールの種類: cron

メタデータ:
    desiredReplicas: <増やしたい台数>
    start: <時間の指定>
    end: <時間の指定>
    timezone: <タイムゾーンの指定>  
```

たとえば、下記の指定だと、毎時45分に3台のコンテナーレプリカが立ち上がり、毎時50分にそれらが停止される指定になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276225/cc2ceeb0-3b13-399f-5884-038ef780343e.png)

## スケールのテスト

特にユーザー側で何もしなくても、cron の設定に従い、コンテナーが立ち上がります。

最初は０個のレプリカがある状態です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276225/e7b260e8-bc47-cf5e-f1e6-20356138b48c.png)

45分になると、３つのレプリカが立ち上がってきました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276225/ef230ed5-c97a-aa27-872e-46a27bff848c.png)

時間が過ぎると元に戻ります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276225/e7b260e8-bc47-cf5e-f1e6-20356138b48c.png)

メトリックを確認すると下記のようになっていました。5分のクールダウンピリオドがこちらも効いているようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276225/68271c27-c5a8-ae6d-6c60-a56a3942bbf0.png)


# 最後に

本記事では、Azure Container Apps のカスタムスケーリングについて、CPU と Cron を利用するときの具体的な使い方について見ていきました。本稿が、Azure Container Apps 活用の一助になれば幸いです。

＊本稿は、個人の見解に基づいた内容であり、所属する会社の公式見解ではありません。また、いかなる保証を与えるものでもありません。正式な情報は、各製品の販売元にご確認ください。