前回の記事で名前空間を使ってすこし環境を整理しました。今回は負荷が上昇した場合などの自動スケーリングとその中でもポッドの水平スケールについてみていきます。
自動スケールの種類
AKS における自動スケールは以下の 3 種類が主に考えられます。
参考:Azure Kubernetes Service (AKS) でのアプリケーションのスケーリング オプション
ポッドの水平スケール (Horizontal Scaling)
ポッドはアプリの最小単位であり、スケールできるように設計されたポッドは数の増減でスケールが可能です。今回のサンプルの場合は Web アプリがスケールできます。
一方 SQL Server 2017 の場合は Always On Availability Group の構成をして読み取り専用セカンダリを構成するか、スケールアップを利用してノードのリソースやディスクのパフォーマンスを上げる必要があります。
参考: SQL Server Always On Availability Groups on AKS
クラスタノードのスケール
2019年10月時点でまだプレビューですが、ポッドの水平スケールの結果、クラスタ全体のリソースの過不足が発生した場合、AKS クラスタ内のノードを自動で調整します。
Azure Container Instance (ACI) へのバースト
ACI は Azure が提供する、ノードの管理を必要としないサーバーレスなコンテナ実行環境です。ポッドの水平スケールによりクラスタ全体のリソースが不足した場合、ノードの追加では時間がかかりすぎる場合、より迅速にスケールする手段として利用できます。こちらも 2019年10月時点でプレビュー機能です。
ACI 環境は仮想ノードとして AKS クラスタに認識され、同一仮想ネットワークにデプロイされます。
リソース要求と制限
自動スケールを利用するには、ポッドにリソース要求と制限を設定します。これにより追加のポッドが必要かなどか判断できるようになります。
参照: ポッドのリソースの要求と制限を定義する
リソース要求
リソース制限
ポッドで利用できる CPU とメモリの上限を定義します。
尚、CPU はコア数に対しての要求と制限を行うため、ノードが利用するコアの性能によって、割り当てられる CPU のパワーは異なります。
現在の設定
ノードプール 1 は Standard_DS2_v2 のため、 vCPU 2、 メモリ 7 GiBであり、core3webapp は以下の設定であるため、ポッド 4-8 個程度で 1 ノードの上限となる。
- CPU はコア 0.25-0.5 個
- メモリは 512 Mi-1Gi
resources:
requests:
cpu: "250m"
memory: "512Mi"
limits:
cpu: "500m"
memory: "1Gi"
ポッドのオートスケーラーの設定
k8s はバージョン 1.1 以降で自動スケールをサポートしているため、コマンド 1 つで簡単に設定が行えます。ここではオートスケールを試すため、あえて非常に低い閾値を設定しています。
参考: ポッドを自動スケールする
1. Deployment に対して、最小 4、最大 100、スケールの閾値として CPU 使用率 10% でオートスケールを設定。
kubectl autoscale deployment core3webapp --cpu-percent=5 --min=4 --max=100
2. Horizontal Pod Autoscaler (hpa) リソースを確認。
>kubectl get hpa
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
core3webapp Deployment/core3webapp 1%/10% 4 100 4 2m9s
3. アクセスが無い状態の負荷を確認。
>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 を取得。ポッド数が増えていることを確認。
>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 も取得。
>kubectl get hpa
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
core3webapp Deployment/core3webapp 1%/10% 4 100 6 17h
6. テスト終了時の負荷を確認。
>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 に戻る
>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. オートスケール設定を解除。
kubectl delete hpa core3webapp
まとめ
今回は自動スケールの概要とポッドの水平のスケールを見ていきました。ポッドの設定はノードのスケールや ACI へのバーストの基本となります。次回はクラスタノードのスケールについてみていきます。