Azure Kubernetes Service (AKS) でのクラスター オートスケーラーの使用

AKS でのアプリケーションの需要に対応するため、ワークロードを実行するノードの数の調整が必要になる場合があります。 クラスター オートスケーラー コンポーネントは、リソース制約のためにスケジュールできないクラスター内のポッドを監視します。 クラスター オートスケーラーは、問題を検出すると、アプリケーションの需要に合わせてノード プール内のノード数をスケールアップします。 また、実行ポッドの不足について定期的にノードがチェックされ、必要に応じてノードの数がスケールダウンされます。

この記事では、オープンソース Kubernetes バージョンに基づく AKS でクラスター オートスケーラーを有効にして管理する方法について説明します。

開始する前に

この記事では、Azure CLI バージョン 2.0.76 以降が必要です。 バージョンを確認するには、az --version を実行します。 インストールまたはアップグレードする必要がある場合は、Azure CLI のインストールに関するページを参照してください。

AKS クラスターでクラスター オートスケーラーを使用する

重要

クラスター オートスケーラーは、Kubernetes のコンポーネントです。 AKS クラスターは、ノードに仮想マシン スケール セットを使用しますが、スケール セットの自動スケーリングの設定を手動で有効にしたり編集したりしないでください。 必要なスケール設定の管理は、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
    

    このクラスターを作成して、クラスター オートスケーラーの設定を構成するには数分かかります。

既存のクラスター上でクラスター自動スケーラーを有効にする

  • 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 のパラメーターを指定することで、既存のクラスター上でクラスター オートスケーラーを再度有効にすることができます。

ノード プールでクラスター オートスケーラーを使用する

複数のノード プールでクラスター オートスケーラーを使用する

複数のノード プールでクラスター オートスケーラーを使用し、個々のノード プールでクラスター オートスケーラーを有効にして、各ノード プールに一意の自動スケーリング ルールを渡すことができます。

  • 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 のパラメーターを指定することで、ノード プール上でクラスター オートスケーラーを再度有効にすることができます。

Note

複数のゾーンにまたがるノード プールでクラスター オートスケーラーを使用して、ボリューム トポロジ スケジュール設定など、ゾーンに関連するスケジュール機能を活用する予定の場合は、ゾーンごとに 1つのノード プールを用意し、オートスケーラー プロファイルを使用して --balance-similar-node-groups を有効にすることをお勧めします。 これにより、オートスケーラーは正常にスケールアップし、ノード プールのサイズのバランスを維持できます。

クラスター オートスケーラーの設定を更新する

アプリケーション需要の変化に応じて、効率的にスケーリングするためにクラスター オートスケーラーのノード数を調整する必要がある場合があります。

  • 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 分経過後に使用率が低いノードをスケールダウンするようにオートスケーラー プロファイルを変更できます。 クラスター オートスケーラーを有効にすると、異なる設定を指定しない限り既定のプロファイルが使用されます。

重要

クラスター オートスケーラー プロファイルは、クラスター オートスケーラーを使用するすべてのノード プールに影響を及ぼします。 ノード プールごとにオートスケーラー プロファイルを設定することはできません。 プロファイルを設定すると、クラスター オートスケーラーが有効にされた既存のノード プールでは、すぐにプロファイルの使用が開始されます。

クラスター オートスケーラー プロファイルの設定

次の表に、クラスター オートスケーラー プロファイルで使用可能な設定を示します。

設定 Description 規定値
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 分
ignore-daemonsets-utilization (プレビュー) スケールダウンのためにリソース使用率を計算するときに、DaemonSet ポッドを無視するかどうか。 false
daemonset-eviction-for-empty-nodes (プレビュー) 空のノードから DaemonSet ポッドを正常に終了するかどうか。 false
daemonset-eviction-for-occupied-nodes (プレビュー) 空ではないノードから DaemonSet ポッドを正常に終了するかどうか。 true
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 つのノード

新しいクラスターに対してクラスター オートスケーラー プロファイルを設定する

  • 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
    

積極的なスケールダウン用にクラスター オートスケーラー プロファイルを構成する

Note

このような状況ではノードのプロビジョニング時間が長くなる可能性があるため、短い間隔でスケールアウトとスケールインが頻繁に発生するクラスターでは、積極的なスケールダウンは推奨されません。 scale-down-delay-after-add を増やすことで、ノードをより長時間維持し、受信するワークロードを処理できるようになります。

 az aks update \
     --resource-group myResourceGroup \
     --name myAKSCluster \
     --cluster-autoscaler-profile scan-interval=30s, scale-down-delay-after-add=0s,scale-down-delay-after-failure=30s,scale-down-unneeded-time=3m,scale-down-unready-time=3m,max-graceful-termination-sec=30,skip-nodes-with-local-storage=false,max-empty-bulk-delete=1000,max-total-unready-percentage=100,ok-total-unready-count=1000,max-node-provision-time=15m

集中的なワークロード用にクラスター オートスケーラー プロファイルを構成する

 az aks update \   
     --resource-group "myResourceGroup" \
     --name myAKSCluster \ 
     --cluster-autoscaler-profile scan-interval=20s,scale-down-delay-after-add=10m,scale-down-delay-after-failure=1m,scale-down-unneeded-time=5m,scale-down-unready-time=5m,max-graceful-termination-sec=30,skip-nodes-with-local-storage=false,max-empty-bulk-delete=100,max-total-unready-percentage=100,ok-total-unready-count=1000,max-node-provision-time=15m

クラスター オートスケーラー プロファイルを既定値にリセットする

  • az aks update コマンドを使用して、クラスター オートスケーラー プロファイルをリセットします。

    az aks update \
      --resource-group myResourceGroup \
      --name myAKSCluster \
      --cluster-autoscaler-profile ""
    

クラスター オートスケーラーのログと状態を取得する

クラスター オートスケーラーからログと状態の更新を取得して、オートスケーラー イベントの診断とデバッグに役立てることができます。 AKS では、ユーザーに代わってクラスター オートスケーラーが管理され、マネージド コントロール プレーンで実行されます。 コントロール プレーン ノードを有効にして、クラスター オートスケーラーからのログと操作を確認できます。

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

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

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

    AzureDiagnostics
    | where Category == "cluster-autoscaler"
    

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

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

  4. CLI でトリガーされないイベントのクラスター オートスケーラー スケールアップを表示する

    kubectl get events --field-selector source=cluster-autoscaler,reason=NotTriggerScaleUp
    
  5. CLI でクラスター オートスケーラー警告イベントを表示する

    kubectl get events --field-selector source=cluster-autoscaler,type=Warning
    
  6. クラスター オートスケーラーにより、cluster-autoscaler-status という名前の configmap に正常性状態も書き込まれます。 これらのログは、次の kubectl コマンドを使用して取得できます。

    kubectl get configmap -n kube-system cluster-autoscaler-status -o yaml
    

詳細については、「Kubernetes/autoscaler GitHub プロジェクトの FAQ」を参照してください。

クラスター自動スケーラー メトリック

コントロール プレーン メトリック (プレビュー) を有効にすると、Prometheus 用の Azure Monitor マネージド サービスクラスター オートスケーラーからログと操作を確認できます。

次のステップ

この記事では、AKS ノードの数を自動的にスケーリングする方法について説明します。 また、ポッドの水平オートスケーラーを使用して、アプリケーションを実行するポッドの数を自動的に調整することもできます。 ポッドの水平オートスケーラーの使用手順については、「AKS でのアプリケーションのスケーリング」を参照してください。

クラスター リソースの使用率を向上させ、他のポッドの CPU とメモリを解放する方法については、Vertical Pod Autoscaler に関するページを参照してください。