AKS で asp.net core アプリケーション : 自動スケール概要とポッドの水平スケール

[前回の記事](https://qiita.com/kenakamu/items/7003b6013779f1a5bdb6)で名前空間を使ってすこし環境を整理しました。今回は負荷が上昇した場合などの自動スケーリングとその中でもポッドの水平スケールについてみていきます。

# 自動スケールの種類

AKS における自動スケールは以下の 3 種類が主に考えられます。
[参考:Azure Kubernetes Service (AKS) でのアプリケーションのスケーリング オプション](https://docs.microsoft.com/ja-jp/azure/aks/concepts-scale)

## ポッドの水平スケール (Horizontal Scaling)

ポッドはアプリの最小単位であり、スケールできるように設計されたポッドは数の増減でスケールが可能です。今回のサンプルの場合は Web アプリがスケールできます。
![](https://docs.microsoft.com/ja-jp/azure/aks/media/concepts-scale/horizontal-pod-autoscaling.png)
一方 SQL Server 2017 の場合は Always On Availability Group の構成をして読み取り専用セカンダリを構成するか、スケールアップを利用してノードのリソースやディスクのパフォーマンスを上げる必要があります。

[参考: SQL Server Always On Availability Groups on AKS](https://github.com/Azure/azure-quickstart-templates/tree/master/201-aks-sql-server-always-on/)

## クラスタノードのスケール

2019年10月時点でまだプレビューですが、ポッドの水平スケールの結果、クラスタ全体のリソースの過不足が発生した場合、AKS クラスタ内のノードを自動で調整します。

![](https://docs.microsoft.com/ja-jp/azure/aks/media/concepts-scale/cluster-autoscaler.png)

## Azure Container Instance (ACI) へのバースト

ACI は Azure が提供する、ノードの管理を必要としないサーバーレスなコンテナ実行環境です。ポッドの水平スケールによりクラスタ全体のリソースが不足した場合、ノードの追加では時間がかかりすぎる場合、より迅速にスケールする手段として利用できます。こちらも 2019年10月時点でプレビュー機能です。
![](https://docs.microsoft.com/ja-jp/azure/aks/media/concepts-scale/burst-scaling.png)

ACI 環境は仮想ノードとして AKS クラスタに認識され、同一仮想ネットワークにデプロイされます。

# リソース要求と制限

自動スケールを利用するには、ポッドにリソース要求と制限を設定します。これにより追加のポッドが必要かなどか判断できるようになります。
[参照: ポッドのリソースの要求と制限を定義する](https://docs.microsoft.com/ja-jp/azure/aks/developer-best-practices-resource-management#define-pod-resource-requests-and-limits)

**リソース要求**

**リソース制限**
ポッドで利用できる CPU とメモリの上限を定義します。

尚、CPU はコア数に対しての要求と制限を行うため、ノードが利用するコアの性能によって、割り当てられる CPU のパワーは異なります。

## 現在の設定

ノードプール 1 は Standard_DS2_v2 のため、 vCPU 2、 メモリ 7 GiBであり、core3webapp は以下の設定であるため、ポッド 4-8 個程度で 1 ノードの上限となる。

- CPU はコア 0.25-0.5 個
- メモリは 512 Mi-1Gi

```yaml:myapp.yaml
resources: 
  requests:
    cpu: "250m"
    memory: "512Mi"
  limits:
    cpu: "500m"
    memory: "1Gi"
```
# ポッドのオートスケーラーの設定

k8s はバージョン 1.1 以降で自動スケールをサポートしているため、コマンド 1 つで簡単に設定が行えます。ここではオートスケールを試すため、あえて非常に低い閾値を設定しています。
[参考: ポッドを自動スケールする](https://docs.microsoft.com/ja-jp/azure/aks/tutorial-kubernetes-scale#autoscale-pods)

1\. Deployment に対して、最小 4、最大 100、スケールの閾値として CPU 使用率 10% でオートスケールを設定。

```shell
kubectl autoscale deployment core3webapp --cpu-percent=5 --min=4 --max=100
```

2\. Horizontal Pod Autoscaler (hpa) リソースを確認。

```shell
>kubectl get hpa
NAME          REFERENCE                TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
core3webapp   Deployment/core3webapp   1%/10%    4         100       4          2m9s
```

3\. アクセスが無い状態の負荷を確認。

```shell
>kubectl top pod
NAME                                CPU(cores)   MEMORY(bytes)
core3webapp-b599bd5d-9l8hx          0m           52Mi
core3webapp-b599bd5d-hnrk6          0m           56Mi
core3webapp-b599bd5d-lwgbq          0m           56Mi
core3webapp-b599bd5d-n76cj          0m           52Mi
mssql-deployment-749f664d67-w8pd7   6m           968Mi
```

4\. アプリに対して任意のツールで負荷をかけてスケールを確認。ここでは Visual Studio で 1000 多重でトップページの取得を実施。Top を取得。ポッド数が増えていることを確認。

```shell
>kubectl top pods
NAME                                CPU(cores)   MEMORY(bytes)
core3webapp-b599bd5d-9l8hx          2m           76Mi
core3webapp-b599bd5d-9qmrd          9m           55Mi
core3webapp-b599bd5d-hnrk6          1m           72Mi
core3webapp-b599bd5d-lwgbq          2m           73Mi
core3webapp-b599bd5d-n76cj          1m           76Mi
core3webapp-b599bd5d-qjjw6          5m           60Mi
mssql-deployment-749f664d67-w8pd7   12m          982Mi
```

5\. HPA も取得。

```shell
>kubectl get hpa
NAME          REFERENCE                TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
core3webapp   Deployment/core3webapp   1%/10%    4         100       6          17h
```
6\. テスト終了時の負荷を確認。

```shell
>kubectl top pods
NAME                                CPU(cores)   MEMORY(bytes)
core3webapp-b599bd5d-9l8hx          0m           76Mi
core3webapp-b599bd5d-9qmrd          0m           68Mi
core3webapp-b599bd5d-hnrk6          0m           71Mi
core3webapp-b599bd5d-lwgbq          0m           73Mi
core3webapp-b599bd5d-n76cj          0m           76Mi
core3webapp-b599bd5d-qjjw6          0m           72Mi
mssql-deployment-749f664d67-w8pd7   8m           982Mi
```

7\. 一定時間経過後、自動でスケールダウンされることを確認。

- ステータスが Terminating になる
- その後ポッドは終了され、最小値の 4 に戻る

```shell
>kubectl get pods
NAME                                READY   STATUS        RESTARTS   AGE
core3webapp-b599bd5d-9l8hx          1/1     Running       5          43h
core3webapp-b599bd5d-9qmrd          0/1     Terminating   0          6m50s
core3webapp-b599bd5d-hnrk6          1/1     Running       2          42h
core3webapp-b599bd5d-lwgbq          1/1     Running       2          42h
core3webapp-b599bd5d-n76cj          1/1     Running       6          43h
core3webapp-b599bd5d-qjjw6          0/1     Terminating   0          6m50s
mssql-deployment-749f664d67-w8pd7   1/1     Running       2          43h

>kubectl get pods
NAME                                READY   STATUS    RESTARTS   AGE
core3webapp-b599bd5d-9l8hx          1/1     Running   5          43h
core3webapp-b599bd5d-hnrk6          1/1     Running   2          42h
core3webapp-b599bd5d-lwgbq          1/1     Running   2          42h
core3webapp-b599bd5d-n76cj          1/1     Running   6          43h
mssql-deployment-749f664d67-w8pd7   1/1     Running   2          43h

>kubectl top pods
NAME                                CPU(cores)   MEMORY(bytes)
core3webapp-b599bd5d-9l8hx          0m           76Mi
core3webapp-b599bd5d-hnrk6          0m           71Mi
core3webapp-b599bd5d-lwgbq          0m           73Mi
core3webapp-b599bd5d-n76cj          0m           76Mi
mssql-deployment-749f664d67-w8pd7   8m           982Mi
```

8\. オートスケール設定を解除。

```shell
kubectl delete hpa core3webapp
```

# まとめ

今回は自動スケールの概要とポッドの水平のスケールを見ていきました。ポッドの設定はノードのスケールや ACI へのバーストの基本となります。次回はクラスタノードのスケールについてみていきます。

[次の記事へ](https://qiita.com/kenakamu/items/a4fe3769605795c23c24)
[目次へ戻る](https://qiita.com/kenakamu/items/e155740aa60c85a3d867)

# 参照

[ポッドのリソースの要求と制限を定義する](https://docs.microsoft.com/ja-jp/azure/aks/developer-best-practices-resource-management#define-pod-resource-requests-and-limits)
[ポッドを自動スケールする](https://docs.microsoft.com/ja-jp/azure/aks/tutorial-kubernetes-scale#autoscale-pods)