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 リソースを変更可能かどうかに関するセクションを参照してください。

  1. az group create コマンドを使用して、リソース グループを作成します。

    az group create --name myResourceGroup --location eastus
    
  2. 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-podsrandomleast-wastepriority 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 にプッシュされるようにログを構成します。

  1. こちらの手順を使用して、Log Analytics にクラスター オートスケーラーのログをプッシュするようにリソース ログのルールを設定します。 [ログ] のオプションを選択するときは、確実に cluster-autoscaler のボックスにチェックマークを入れてください。

  2. クラスターの [ログ] セクションを選択します。

  3. Log Analytics に次のサンプル クエリを入力します。

    AzureDiagnostics
    | where Category == "cluster-autoscaler"
    

    取得するログがあれば、次のようなログが表示されるはずです。

    Log Analytics ログのスクリーンショット。

    クラスター オートスケーラーにより、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 に関するページを参照してください。