Azure Kubernetes Service (AKS) でのアプリケーションの需要を満たすようにクラスターを自動的にスケーリング
Azure Kubernetes Service (AKS) のアプリケーションの需要に対応するには、ワークロードを実行するノードの数を調整する必要が生じる場合があります。 クラスター オートスケーラー コンポーネントは、リソース制約のためにスケジュールできないクラスター内のポッドを監視します。 クラスター オートスケーラーは、問題を検出すると、アプリケーションの需要に合わせてノード プール内のノード数をスケールアップします。 また、実行ポッドの不足について定期的にノードがチェックされ、必要に応じてノードの数がスケールダウンされます。
この記事では、AKS クラスターでクラスター オートスケーラーを有効にして管理する方法について説明します。
開始する前に
この記事では、Azure CLI バージョン 2.0.76 以降が必要です。 バージョンを確認するには、az --version
を実行します。 インストールまたはアップグレードする必要がある場合は、Azure CLI のインストールに関するページを参照してください。
クラスター オートスケーラーについて
平日と夜間、または週末など、アプリケーションの変則的な需要に対応するために、多くの場合、クラスターには自動的にスケーリングする方法が必要になります。 AKS クラスターは、次の 2 つの方法のいずれかでスケーリングできます。
- クラスター オートスケーラーは、リソース制約のためにノードでスケジュールできないポッドを監視します。 その後、クラスターによってノードの数が自動的に増やされます。 詳細については、「スケールアップの仕組み」をご覧ください。
- ポッドの水平オートスケーラーは、Kubernetes クラスターのメトリック サーバーを使用して、ポッドのリソースの需要をモニターします。 アプリケーションで必要なリソースが増えると、その需要を満たすためにポッドの数が自動的に増やされます。
ポッドの水平オートスケーラーとクラスター オートスケーラーでは、必要に応じてポッドとノードの数を減らすこともできます。 一定期間後に未使用の容量があった場合、クラスター オートスケーラーによってノードの数が減らされます。 クラスター オートスケーラーによって削除されたノード上のポッドは、クラスター内の他の場所で安全にスケジュールされます。
自動スケーリングを有効にすると、ノード プールのサイズが最小値より小さいか、最大値より大きい場合、スケーリング ルールが適用されます。 次に、オートスケーラーは、ノード プールに新しいノードが必要になるまでの間、または現在のノード プールからノードを安全に削除できるようになるまでの間、有効になるまで待機します。 詳細については、「スケールダウンの仕組み」をご覧ください。
クラスター オートスケーラーは、以下の状況のように、ポッドが移動できない場合はスケールダウンできないことがあります。
- 直接作成されたポッドが、デプロイやレプリカ セットなどのコントローラー オブジェクトによってサポートされていない。
- ポッド中断バジェット (PDB) の制限が非常に厳しく、ポッドの数が特定のしきい値を下回ることが許可されていない。
- ポッドが、別のノードでスケジュールされた場合に適用できないノード セレクターまたはアンチ アフィニティーを使用している。
詳細については、「クラスター オートスケーラーによるノード削除の妨げとなる可能性があるポッドの種類」を参照してください。
クラスター オートスケーラーは、スケール イベント間の時間間隔やリソースしきい値などに対して開始パラメーターを使用します。 クラスター オートスケーラーが使用するパラメーターの詳細については、オートスケーラー プロファイルの使用に関する記事を参照してください。
クラスター オートスケーラーと水平ポッド オートスケーラーは連携させることができ、多くの場合、両方がクラスターにデプロイされます。 組み合わせると、水平ポッド オートスケーラーはアプリケーションの需要を満たすために必要なポッドの数を実行し、クラスター オートスケーラーはスケジュールされたポッドをサポートするために必要なノードの数を実行します。
Note
クラスター オートスケーラーを使用する場合、手動スケーリングは無効になります。 必要なノード数は、クラスター オートスケーラーによって決定されるようにします。 クラスターを手動でスケーリングする場合は、クラスター オートスケーラーを無効化します。
AKS クラスターでクラスター オートスケーラーを使用する
新しいクラスターでクラスター オートスケーラーを有効にする
重要
クラスター オートスケーラーは、Kubernetes のコンポーネントです。 AKS クラスターは、ノードに仮想マシン スケール セットを使用しますが、Azure portal で、または Azure CLI を使用して、スケール セットの自動スケーリングの設定を手動で有効にしたり編集したりしないでください。 必要なスケール設定の管理は、Kubernetes クラスター オートスケーラーが行います。 詳細については、ノード リソース グループ内の AKS リソースを変更可能かどうかに関するセクションを参照してください。
az group create
コマンドを使用して、リソース グループを作成します。az group create --name myResourceGroup --location eastus
az aks create
コマンドを使用して AKS クラスターを作成し、--enable-cluster-autoscaler
パラメーターを使用して--min-count
と--max-count
のノードを指定して、クラスターのノード プールでクラスター オートスケーラーを有効にして構成します。 次のコマンド例では、仮想マシン スケール セットによってサポートされる 1 つのノードを持つクラスターを作成し、クラスター オートスケーラーを有効にし、最小値を 1 ノード、最大値を 3 ノードに設定しています。az aks create \ --resource-group myResourceGroup \ --name myAKSCluster \ --node-count 1 \ --vm-set-type VirtualMachineScaleSets \ --load-balancer-sku standard \ --enable-cluster-autoscaler \ --min-count 1 \ --max-count 3
このクラスターを作成して、クラスター オートスケーラーの設定を構成するには数分かかります。
既存のクラスター上でクラスター自動スケーラーを有効にする
重要
クラスター オートスケーラーは、Kubernetes のコンポーネントです。 AKS クラスターは、ノードに仮想マシン スケール セットを使用しますが、Azure portal で、または Azure CLI を使用して、スケール セットの自動スケーリングの設定を手動で有効にしたり編集したりしないでください。 必要なスケール設定の管理は、Kubernetes クラスター オートスケーラーが行います。 詳細については、ノード リソース グループ内の AKS リソースを変更可能かどうかに関するセクションを参照してください。
az aks update
コマンドを使用して既存のクラスターを更新し、--enable-cluster-autoscaler
パラメーターを使用して--min-count
と--max-count
のノードを指定して、ノード プールでクラスター オートスケーラーを有効にして構成します。 次のコマンド例では、既存の AKS クラスターを更新して、クラスターのノードプール上でクラスター オートスケーラーを有効にし、最小値を 1 ノード、最大値を 3 ノードに設定しています。az aks update \ --resource-group myResourceGroup \ --name myAKSCluster \ --enable-cluster-autoscaler \ --min-count 1 \ --max-count 3
このクラスターを更新してクラスター オートスケーラーの設定を構成するには、数分かかります。
クラスターでクラスター オートスケーラーを無効にする
az aks update
コマンドと--disable-cluster-autoscaler
パラメーターを使用して、クラスター オートスケーラーを無効にします。az aks update \ --resource-group myResourceGroup \ --name myAKSCluster \ --disable-cluster-autoscaler
クラスター オートスケーラーが無効になってもノードは削除されません。
Note
クラスター オートスケーラーを無効にした後、az aks scale
コマンドを使用して、クラスターを手動でスケーリングできます。 ポッドの水平オートスケーラーを使用している場合、その機能はクラスター オートスケーラーを無効にしても引き続き実行されますが、ノード リソースがすべて使用中になると、ポッドをスケジュールできなくなる可能性があります。
無効なクラスター オートスケーラーを再度有効にする
az aks update
コマンドで --enable-cluster-autoscaler
、--min-count
、および --max-count
のパラメーターを指定することで、既存のクラスター上でクラスター オートスケーラーを再度有効にすることができます。
クラスター オートスケーラーの設定の変更
重要
AKS クラスターに複数のノード プールがある場合は、複数のエージェント プールを使用した自動スケーリングのセクションに進んでください。 複数のエージェント プールがあるクラスターの場合、az aks
の代わりに az aks nodepool
コマンドが必要です。
クラスターの自動スケーリングを有効にする例では、クラスター オートスケーラーの最小ノード数が 1 に設定され、最大ノード数が 3 に設定されています。 アプリケーション需要の変化に応じて、効率的にスケーリングするためにクラスター オートスケーラーのノード数を調整する必要があります。
az aks update
コマンドを使用してノード数を変更し、--update-cluster-autoscaler
パラメーターを使用して、更新したノードの--min-count
と--max-count
を指定して、クラスター オートスケーラーを更新します。az aks update \ --resource-group myResourceGroup \ --name myAKSCluster \ --update-cluster-autoscaler \ --min-count 1 \ --max-count 5
Note
スポット削除中である場合や、AKS API から最小カウント値を変更した場合など、外部的な要因によって実際の数が最小値を下回った場合、クラスター オートスケーラーによって最小数が適用されます。
アプリケーションとサービスのパフォーマンスをモニターして、必要なパフォーマンスに一致するようにクラスター オートスケーラーのノード数を調整してください。
クラスター オートスケーラー プロファイルを使用する
クラスター全体のオートスケーラー プロファイルで既定値を変更することで、クラスター オートスケーラーの詳細をよりきめ細かに構成することもできます。 たとえばスケールダウン イベントは、ノードの使用率が低い状態で 10 分経過した後に発生します。 15 分ごとに実行されるワークロードがある場合は、15 分または 20 分経過後に使用率が低いノードをスケールダウンするようにオートスケーラー プロファイルを変更できます。 クラスター オートスケーラーを有効にすると、異なる設定を指定しない限り既定のプロファイルが使用されます。 クラスター オートスケーラー プロファイルでは、以下の設定を更新できます。
15 分後にスケーリングされ、アイドル状態の使用の 10 分後に変更されるプロファイル更新の例。
az aks update \ -g learn-aks-cluster-scalability \ -n learn-aks-cluster-scalability \ --cluster-autoscaler-profile scan-interval=5s \ scale-down-unready-time=10m \ scale-down-delay-after-add=15m
設定 | 説明 | 既定値 |
---|---|---|
scan-interval | スケールアップまたはスケールダウンに関してクラスターが再評価される頻度 | 10 秒 |
scale-down-delay-after-add | スケールアップ後に、スケールダウンの評価が再開されるまでの時間 | 10 分 |
scale-down-delay-after-delete | ノードの削除後に、スケールダウンの評価が再開されるまでの時間 | scan-interval |
scale-down-delay-after-failure | スケールダウンの失敗後に、スケールダウンの評価が再開されるまでの時間 | 3 分 |
scale-down-unneeded-time | ノードが不要になってからスケールダウンの対象になるまでの時間 | 10 分 |
scale-down-unready-time | 準備ができていないノードが不要になってからスケールダウンの対象になるまでの時間 | 20 分 |
scale-down-utilization-threshold | 要求されたリソースの合計を容量で割った値として定義される、ノード利用レベル。この場合、ノードはスケールダウンの対象と見なすことができます | 0.5 |
max-graceful-termination-sec | ノードのスケールダウンを試みるときに、クラスター オートスケーラーがポッドの終了を待機する最大秒数 | 600 秒 |
balance-similar-node-groups | 類似のノード プールを検出し、その間でノード数のバランスを取ります | false |
expander | スケールアップで使用するノード プール expander の種類 指定できる値: most-pods 、random 、least-waste 、priority |
random |
skip-nodes-with-local-storage | true の場合、EmptyDir や HostPath などのローカル ストレージを備えたポッドがあるノードは、クラスター オートスケーラーによって削除されません | false |
skip-nodes-with-system-pods | true の場合、ポッドのあるノードは、クラスター オートスケーラーによって kube-system から削除されません (DaemonSet またはミラー ポッドを除く) | true |
max-empty-bulk-delete | 同時に削除できる空ノードの最大数 | 10 ノード |
new-pod-scale-up-delay | バーストまたはバッチ スケールのように、Kubernetes スケジューラによってすべてのポッドがスケジュールされる前に CA を動作させたくないシナリオの場合、一定の期間に達する前のスケジュールされていないポッドを無視するように CA に指示できます。 | 0 秒 |
max-total-unready-percentage | クラスター内の準備が完了していないノードの最大割合。 この割合を超えると、CA の動作は停止されます | 45% |
max-node-provision-time | オートスケーラーがノードがプロビジョニングされるのを待機する最大時間 | 約 15 分 |
ok-total-unready-count | max-total-unready-percentage に関係なく、準備が完了していないノードの許可されている数 | 3 つのノード |
重要
オートスケーラー プロファイルを使用するときは、次の点に留意してください。
- クラスター オートスケーラー プロファイルは、クラスター オートスケーラーを使用するすべてのノード プールに影響を及ぼします。 ノード プールごとにオートスケーラー プロファイルを設定することはできません。 プロファイルを設定すると、クラスター オートスケーラーが有効にされた既存のノード プールでは、すぐにプロファイルの使用が開始されます。
- クラスター オートスケーラー プロファイルには、Azure CLI バージョン 2.11.1 以降が必要です。 インストールまたはアップグレードする必要がある場合は、Azure CLI のインストールに関するページを参照してください。
新しいクラスターに対してクラスター オートスケーラー プロファイルを設定する
az aks create
コマンドを使用して AKS クラスターを作成し、cluster-autoscaler-profile
パラメーターを使用してクラスター オートスケーラー プロファイルを設定します。az aks create \ --resource-group myResourceGroup \ --name myAKSCluster \ --node-count 1 \ --enable-cluster-autoscaler \ --min-count 1 \ --max-count 3 \ --cluster-autoscaler-profile scan-interval=30s
既存のクラスターに対してクラスター オートスケーラー プロファイルを設定する
az aks update
コマンドとcluster-autoscaler-profile
パラメーターを使用して 、既存のクラスターにクラスター オートスケーラーを設定します。 次の例では、スキャン間隔の設定を "30 秒" として構成しています。az aks update \ --resource-group myResourceGroup \ --name myAKSCluster \ --cluster-autoscaler-profile scan-interval=30s
クラスター オートスケーラー プロファイルを既定値にリセットする
az aks update
コマンドを使用して、クラスター オートスケーラー プロファイルをリセットします。az aks update \ --resource-group myResourceGroup \ --name myAKSCluster \ --cluster-autoscaler-profile ""
クラスター オートスケーラーのログと状態の更新を取得する
クラスター オートスケーラーからログと状態の更新を取得して、オートスケーラー イベントの診断とデバッグに役立てることができます。 AKS では、ユーザーに代わってクラスター オートスケーラーが管理され、マネージド コントロール プレーンで実行されます。 コントロール プレーン ノードを有効にして、クラスター オートスケーラーからのログと操作を確認できます。
次の手順に従って、クラスター オートスケーラーから Log Analytics にプッシュされるようにログを構成します。
こちらの手順を使用して、Log Analytics にクラスター オートスケーラーのログをプッシュするようにリソース ログのルールを設定します。 [ログ] のオプションを選択するときは、確実に
cluster-autoscaler
のボックスにチェックマークを入れてください。クラスターの [ログ] セクションを選択します。
Log Analytics に次のサンプル クエリを入力します。
AzureDiagnostics | where Category == "cluster-autoscaler"
取得するログがあれば、次のようなログが表示されるはずです。
クラスター オートスケーラーにより、
cluster-autoscaler-status
という名前のconfigmap
に正常性状態も書き込まれます。 これらのログは、次のkubectl
コマンドを使用して取得できます。kubectl get configmap -n kube-system cluster-autoscaler-status -o yaml
オートスケーラーのログについて詳しくは、Kubernetes/オートスケーラー GitHub プロジェクトの FAQ をご覧ください。
複数のノード プールでクラスター オートスケーラーを使用する
複数のノード プールを有効にしてクラスター オートスケーラーを使用する
複数のノード プールを有効にしてクラスター オートスケーラーを使用することができます。 両方の機能を一緒に使用すると、クラスター内の個々のノード プールでクラスター オートスケーラーを有効にし、各ノード プールに一意の自動スケーリング ルールを渡すことができます。
az aks nodepool update
コマンドを使用して、既存のノード プールの設定を更新します。 次のコマンドは、この記事の前の手順からの続きです。az aks nodepool update \ --resource-group myResourceGroup \ --cluster-name myAKSCluster \ --name nodepool1 \ --update-cluster-autoscaler \ --min-count 1 \ --max-count 5
ノード プールでクラスター オートスケーラーを無効にする
az aks nodepool update
コマンドと--disable-cluster-autoscaler
パラメーターを使用して、ノード プールのクラスター オートスケーラーを無効にします。az aks nodepool update \ --resource-group myResourceGroup \ --cluster-name myAKSCluster \ --name nodepool1 \ --disable-cluster-autoscaler
ノード プールでクラスター オートスケーラーを再度有効にする
az aks nodepool update
コマンドを使用し、--enable-cluster-autoscaler
、--min-count
、--max-count
パラメーターを指定して、ノード プールでクラスター オートスケーラーを再度有効にします。az aks nodepool update \ --resource-group myResourceGroup \ --cluster-name myAKSCluster \ --name nodepool1 \ --enable-cluster-autoscaler \ --min-count 1 \ --max-count 5
注意
複数のゾーンにまたがるノード プールでクラスター オートスケーラーを使用して、ボリューム トポロジ スケジュール設定など、ゾーンに関連するスケジュール機能を活用する予定の場合は、ゾーンごとに 1つのノード プールを用意し、オートスケーラー プロファイルを使用して
--balance-similar-node-groups
を有効にすることをお勧めします。 これにより、オートスケーラーは正常にスケールアップし、ノード プールのサイズのバランスを維持できます。
ポッドの水平オートスケーラーを構成する
Kubernetes はポッドの水平自動スケーリングをサポートしており、CPU 使用率などの選ばれたメトリックに応じて、デプロイのポッドの数を調整します。 Metrics Server は、リソース使用率を Kubernetes に提供します。 kubectl autoscale
コマンドまたはマニフェストを使って、ポッドの水平自動スケーリングを構成できます。 水平ポッド オートスケーラーの使用について詳しくは、HorizontalPodAutoscaler のチュートリアルのページをご覧ください。
次のステップ
この記事では、AKS ノードの数を自動的にスケーリングする方法について説明します。 また、ポッドの水平オートスケーラーを使用して、アプリケーションを実行するポッドの数を自動的に調整することもできます。 ポッドの水平オートスケーラーの使用手順については、「AKS でのアプリケーションのスケーリング」を参照してください。
クラスター リソースの使用率を向上させ、他のポッドの CPU とメモリを解放する方法については、Vertical Pod Autoscaler に関するページを参照してください。