Azure Kubernetes Service (AKS) でのクラスター オートスケーラーの使用
- [アーティクル]
-
-
AKS でのアプリケーションの需要に対応するため、ワークロードを実行するノードの数の調整が必要になる場合があります。 クラスター オートスケーラー コンポーネントは、リソース制約のためにスケジュールできないクラスター内のポッドを監視します。 クラスター オートスケーラーは、問題を検出すると、アプリケーションの需要に合わせてノード プール内のノード数をスケールアップします。 また、実行ポッドの不足について定期的にノードがチェックされ、必要に応じてノードの数がスケールダウンされます。
この記事では、オープンソース Kubernetes バージョンに基づく AKS でクラスター オートスケーラーを有効にして管理する方法について説明します。
この記事では、Azure CLI バージョン 2.0.76 以降が必要です。 バージョンを確認するには、az --version
を実行します。 インストールまたはアップグレードする必要がある場合は、Azure CLI のインストールに関するページを参照してください。
AKS クラスターでクラスター オートスケーラーを使用する
重要
クラスター オートスケーラーは、Kubernetes のコンポーネントです。 AKS クラスターは、ノードに仮想マシン スケール セットを使用しますが、スケール セットの自動スケーリングの設定を手動で有効にしたり編集したりしないでください。 必要なスケール設定の管理は、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 \
--generate-ssh-keys
このクラスターを作成して、クラスター オートスケーラーの設定を構成するには数分かかります。
既存のクラスター上でクラスター自動スケーラーを有効にする
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
クラスター オートスケーラーが無効になってもノードは削除されません。
注意
クラスター オートスケーラーを無効にした後、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
のパラメーターを指定することで、ノード プール上でクラスター オートスケーラーを再度有効にすることができます。
注意
複数のゾーンにまたがるノード プールでクラスター オートスケーラーを使用して、ボリューム トポロジ スケジュール設定など、ゾーンに関連するスケジュール機能を活用する予定の場合は、ゾーンごとに 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
注意
スポット削除中である場合や、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-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 つのノード |
注意
ignore-daemonsets-utilization、daemonset-eviction-for-empty-nodes、daemonset-eviction-for-occupied-nodes パラメーターは、API バージョン 2024-05-01 から一般提供となります。 CLI を使用してこれらのフラグを更新する場合は、バージョン 2.63 以降を使用していることを確認してください。
新しいクラスターに対してクラスター オートスケーラー プロファイルを設定する
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 \
--generate-ssh-keys
既存のクラスターに対してクラスター オートスケーラー プロファイルを設定する
az aks update
コマンドと cluster-autoscaler-profile
パラメーターを使用して 、既存のクラスターにクラスター オートスケーラーを設定します。 次の例では、スキャン間隔の設定を "30 秒" として構成しています。
az aks update \
--resource-group myResourceGroup \
--name myAKSCluster \
--cluster-autoscaler-profile scan-interval=30s
注意
このような状況ではノードのプロビジョニング時間が長くなる可能性があるため、短い間隔でスケールアウトとスケールインが頻繁に発生するクラスターでは、積極的なスケールダウンは推奨されません。 scale-down-delay-after-add
を増やすことで、ノードをより長時間維持し、受信するワークロードを処理できるようになります。
az aks update \
--resource-group myResourceGroup \
--name myAKSCluster \
--cluster-autoscaler-profile scan-interval=30s,scale-down-delay-after-add=0m,scale-down-delay-after-failure=1m,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
クラスター オートスケーラー プロファイルを既定値にリセットする
クラスター オートスケーラーのログと状態を取得する
クラスター オートスケーラーからログと状態の更新を取得して、オートスケーラー イベントの診断とデバッグに役立てることができます。 AKS では、ユーザーに代わってクラスター オートスケーラーが管理され、マネージド コントロール プレーンで実行されます。 コントロール プレーン ノードを有効にして、クラスター オートスケーラーからのログと操作を確認できます。
こちらの手順を使用して、Log Analytics にクラスター オートスケーラーのログをプッシュするようにリソース ログのルールを設定します。 [ログ] のオプションを選択するときは、確実に cluster-autoscaler
のボックスにチェックマークを入れてください。
クラスターの [ログ] セクションを選択します。
Log Analytics に次のサンプル クエリを入力します。
AzureDiagnostics
| where Category == "cluster-autoscaler"
CLI で、クラスター オートスケーラーのスケールアップがトリガーされないイベントを表示します。
kubectl get events --field-selector source=cluster-autoscaler,reason=NotTriggerScaleUp
CLI で、クラスター オートスケーラーの警告イベントを表示します。
kubectl get events --field-selector source=cluster-autoscaler,type=Warning
クラスター オートスケーラーにより、cluster-autoscaler-status
という名前の configmap
に正常性状態も書き込まれます。 これらのログは、次の kubectl
コマンドを使用して取得できます。
kubectl get configmap -n kube-system cluster-autoscaler-status -o yaml
Azure portal で自分の AKS クラスターに移動します。
サービス メニューの [設定] で、[ノード プール] を選択します。
[自動スケーリング イベント]、[自動スケーリングの警告]、[トリガーされないスケールアップ] のいずれかのタイルを選択して、詳細を取得します。
詳細については、「Kubernetes/autoscaler GitHub プロジェクトの FAQ」を参照してください。
コントロール プレーン メトリック (プレビュー) を有効にすると、Prometheus 用の Azure Monitor マネージド サービスでクラスター オートスケーラーからログと操作を確認できます。
この記事では、AKS ノードの数を自動的にスケーリングする方法について説明します。 また、ポッドの水平オートスケーラーを使用して、アプリケーションを実行するポッドの数を自動的に調整することもできます。 ポッドの水平オートスケーラーの使用手順については、「AKS でのアプリケーションのスケーリング」を参照してください。
クラスター リソースの使用率を向上させ、他のポッドの CPU とメモリを解放する方法については、Vertical Pod Autoscaler に関するページを参照してください。