このトピックでは、ノードの高速スケーリング機能を使用する際の一般的な問題と解決策について説明します。
インデックス
カテゴリ | サブカテゴリ | ジャンプリンク |
ノードの高速スケーリングのスケーリング動作 | ||
カスタムスケーリング動作 | ||
既知の制限
機能の制限
ノードの高速スケーリングは swift モードをサポートしていません。
ノードプールには、スケールアウトバッチごとに最大 180 個のノードを含めることができます。
特定のクラスターに対してスケールインを無効にすることはできません。
説明特定のノードのスケールインを無効にする方法については、「ノードの高速スケーリングが特定のノードを削除しないようにするにはどうすればよいですか?」をご参照ください。
ノードの高速スケーリングソリューションは、プリエンプティブルインスタンスの在庫の確認をサポートしていません。ノードプールの [請求方法] がプリエンプティブルインスタンスに設定され、ノードプールで [プリエンプティブル容量を補うために従量課金インスタンスを使用する] オプションが有効になっている場合、プリエンプティブルインスタンスの在庫が十分であっても、従量課金インスタンスがスケールアウトされます。
不正確なノードリソースの推定
ECS インスタンスの基盤となるシステムは、一部のリソースを消費します。これは、インスタンスの利用可能なメモリが、そのインスタンスタイプで定義されている量よりも少ないことを意味します。詳細については、「購入したインスタンスのメモリサイズがインスタンスタイプで定義されたメモリサイズと異なるのはなぜですか?」をご参照ください。その結果、ノードの高速スケーリングコンポーネントによって推定されたノードのスケジューリング可能なリソースが、実際のスケジューリング可能なリソースよりも大きくなる可能性があります。この推定は 100% 正確ではありません。Pod リクエストを構成する際は、次の点に注意してください。
Pod リクエストを構成する場合、CPU、メモリ、ディスクを含む合計リクエストリソースは、インスタンスタイプの仕様よりも小さくする必要があります。合計リクエストリソースは、ノードのリソースの 70% を超えないようにしてください。
ノードの高速スケーリングコンポーネントがノードに十分なリソースがあるかどうかを確認する場合、保留中の Pod や DaemonSet Pod などの Kubernetes Pod リソースのみを考慮します。DaemonSet によって管理されていない静的 Pod がノードに存在する場合、これらの Pod のために事前にリソースを予約する必要があります。
Pod が大量のリソース (たとえば、ノードのリソースの 70% 以上) をリクエストする場合、その Pod が同じインスタンスタイプのノードにスケジューリングできることを事前にテストして確認する必要があります。
シミュレート可能なリソースタイプの制限
ノードの高速スケーリングコンポーネントは、スケーリング操作を実行するかどうかをシミュレートおよび決定するために、限られた数のリソースタイプのみをサポートします。詳細については、「ノードの高速スケーリングがシミュレートできるリソースタイプ」をご参照ください。
スケールアウト動作
ノードの高速スケーリングがシミュレートできるリソースタイプ
スケーリング動作のシミュレーションと決定には、次のリソースタイプがサポートされています。
cpu
memory
ephemeral-storage
aliyun.com/gpu-mem # 共有 GPU のみがサポートされています。
nvidia.com/gpuノードの高速スケーリングは、Pod リソースリクエストに基づいてノードプールから適切なインスタンスタイプのノードをスケールアウトすることをサポートしていますか?
はい、サポートしています。たとえば、Auto Scaling が有効になっているノードプールに、4 コア 8 GB と 12 コア 48 GB の 2 つのインスタンスタイプを構成します。ある Pod が 2 CPU コアをリクエストします。ノードの高速スケーリングがスケールアウトを実行すると、Pod を 4 コア 8 GB のノードに優先的にスケジューリングします。後で 4 コア 8 GB のインスタンスタイプが 8 コア 16 GB にアップグレードされた場合、ノードの高速スケーリングは自動的に 8 コア 16 GB のノードで Pod を実行します。
ノードプールに複数のインスタンスタイプがある場合、ノードの高速スケーリングはデフォルトでどのように 1 つを選択しますか?
ノードプールに構成されているインスタンスタイプに基づいて、ノードの高速スケーリングは在庫が不十分なインスタンスタイプを定期的に除外します。次に、残りのタイプを CPU コア数でソートし、それぞれがスケジューリング不可能な Pod のリソースリクエストを満たしているかどうかを確認します。インスタンスタイプが要件を満たすと、ノードの高速スケーリングはそのインスタンスタイプを選択し、残りのタイプはチェックしません。
ノードの高速スケーリングを使用している場合、ノードプールのインスタンスタイプの在庫のリアルタイムの変更を監視するにはどうすればよいですか?
ノードの高速スケーリングは、Auto Scaling が有効になっているノードプール内のインスタンスタイプの在庫を定期的に更新するヘルス メトリックを提供します。インスタンスタイプの在庫ステータスが変更されると、ノードの高速スケーリングは InstanceInventoryStatusChanged という名前の Kubernetes イベントを送信します。このイベント通知をサブスクライブして、ノードプールの在庫の健全性を監視し、現在のステータスを評価し、事前にインスタンスタイプの構成を調整できます。詳細については、「ノードの高速スケーリングのヘルスステータスを表示する」をご参照ください。
在庫不足によるスケールアウトの失敗を防ぐために、ノードプールの構成を最適化するにはどうすればよいですか?
利用可能なインスタンスタイプの範囲を拡大するために、次の構成の提案を検討してください。
ノードプールに複数のオプションのインスタンスタイプを構成するか、一般化された構成を使用します。
ノードプールに複数のゾーンを構成します。
ノードの高速スケーリングがノードの追加に失敗するのはなぜですか?
次のシナリオを確認してください。
ノードプールに構成されているインスタンスタイプの在庫が不十分です。
ノードプールに構成されているインスタンスタイプが Pod のリソースリクエストを満たせません。ECS インスタンスタイプのリソースサイズは、リストされている仕様です。ランタイム中に次のリソース予約を考慮してください。
インスタンスの作成中に、一部のリソースが仮想化とオペレーティングシステムによって消費されます。詳細については、「購入したインスタンスのメモリサイズがインスタンスタイプで定義されたメモリサイズと異なるのはなぜですか?」をご参照ください。
ACK は、kubelet、kube-proxy、Terway、コンテナーランタイムなどの Kubernetes コンポーネントとシステムプロセスを実行するために、一定量のノードリソースを必要とします。予約ポリシーの詳細な説明については、「ノードリソースの予約ポリシー」をご参照ください。
デフォルトでは、システムコンポーネントはノードにインストールされます。Pod によってリクエストされるリソースは、インスタンスの仕様よりも小さくする必要があります。
「ノードの高速弾力性を有効にする」で説明されているように、権限付与を完了しました。
Auto Scaling が有効になっているノードプールがインスタンスのスケールアウトに失敗します。
後続のスケーリングの精度とシステムの安定性を確保するために、ノードの高速スケーリングコンポーネントは、異常なノードの問題が解決されるまでスケーリング操作を実行しません。
ノードの高速スケーリングが有効になっているノードプールにカスタムリソースを構成するにはどうすればよいですか?
ノードの高速スケーリングが有効になっているノードプールに、次の固定プレフィックスを持つ ECS タグを構成できます。これにより、スケーリングコンポーネントは、ノードプールで利用可能なカスタムリソースまたは指定されたリソースの正確な値を識別できます。
ノードの高速スケーリングコンポーネント ACK GOATScaler のバージョンは v0.2.18 以降である必要があります。コンポーネントをアップグレードする方法については、「アドオンの管理」をご参照ください。
goatscaler.io/node-template/resource/{resource-name}:{resource-size}例:
goatscaler.io/node-template/resource/hugepages-1Gi:2Giスケールイン動作
ノードの高速スケーリングがノードの削除に失敗するのはなぜですか?
次のシナリオを検討してください。
空のノードのみをスケールインするオプションが有効になっていますが、チェックされているノードは空ではありません。
ノード上の Pod のリソースリクエストのしきい値が、構成されているスケールインのしきい値よりも高くなっています。
kube-system 名前空間の Pod がノードで実行されています。
ノード上の Pod には、他のノードがそれらを実行するのを妨げる強制的なスケジューリングポリシーがあります。
ノード上の Pod には PodDisruptionBudget があり、利用可能な Pod の最小数に達しています。
新しいノードが追加された場合、ノードの高速スケーリングは 10 分以内にそのノードでスケールイン操作を実行しません。
オフラインノードが存在します。オフラインノードは、対応するノードオブジェクトを持たない実行中のインスタンスです。ノードの高速スケーリングコンポーネントは、v0.5.3 以降で自動クリーンアップ機能をサポートしています。それ以前のバージョンでは、これらの残存インスタンスを手動で削除する必要があります。
バージョン v0.5.3 は段階的リリース中です。アクセスをリクエストするには、チケットを送信してください。コンポーネントのアップグレード方法については、「コンポーネント」をご参照ください。
[ノードプール] ページで、[ノードプールの同期] をクリックし、次に [詳細] をクリックします。[ノード管理] タブで、オフライン状態のノードがあるかどうかを確認します。
ノードの高速スケーリングによるノードの削除を妨げる可能性がある Pod のタイプは何ですか?
Pod がデプロイメント、ReplicaSet、ジョブ、StatefulSet などのネイティブ Kubernetes コントローラーによって作成されていない場合、またはノード上の Pod を安全に終了または移行できない場合、ノードの高速スケーリングコンポーネントがノードを削除できなくなる可能性があります。
Pod を使用したスケーリング動作の制御
Pod を使用してノードの高速スケーリングのノードスケールインを制御するにはどうすればよいですか?
Pod アノテーション goatscaler.io/safe-to-evict を使用して、ノードの高速スケーリングのスケールイン中に Pod がノードのスケールインを妨げるかどうかを指定できます。
ノードがスケールインされないようにするには、アノテーション
"goatscaler.io/safe-to-evict": "false"を Pod に追加します。ノードのスケールインを許可するには、アノテーション
"goatscaler.io/safe-to-evict": "true"を Pod に追加します。
ノードを使用したスケーリング動作の制御
ノードの高速スケーリングのスケールイン中に削除するノードを指定するにはどうすればよいですか?
削除したいノードに goatscaler.io/force-to-delete:true:NoSchedule Taint を追加できます。この Taint を追加すると、ノードの高速スケーリングは Pod のステータスを確認したり Pod をドレインしたりすることなく、ノードを直接削除します。この機能はサービスの中断やデータの損失を引き起こす可能性があるため、注意して使用してください。
ノードの高速スケーリングが特定のノードを削除しないようにするにはどうすればよいですか?
ターゲットノードにノードアノテーション "goatscaler.io/scale-down-disabled": "true" を構成して、ノードの高速スケーリングコンポーネントによるスケールインを防ぐことができます。以下は、アノテーションを追加するためのサンプルコマンドです。
kubectl annotate node <nodename> goatscaler.io/scale-down-disabled=trueノードの高速スケーリングは空のノードのみをスケールインできますか?
ノードレベルまたはクラスターレベルで、空のノードのみをスケールインするかどうかを構成できます。両方のレベルでこの機能を構成した場合、ノードレベルの構成が優先されます。
ノードレベル: ノードにラベル
goatscaler.io/scale-down-only-empty:trueまたはgoatscaler.io/scale-down-only-empty:falseを追加して、空のノードのみのスケールインを有効または無効にします。クラスターレベル: Container Service for Kubernetes コンソールで、[アドオン] ページに移動します。ノードの高速スケーリングコンポーネント ACK GOATScaler を見つけ、画面の指示に従って ScaleDownOnlyEmptyNodes を true または false に設定します。これにより、空のノードのみのスケールインが有効または無効になります。
ノードの高速スケーリングコンポーネントについて
ノードの高速スケーリングコンポーネントの自動更新をトリガーする操作はありますか?
いいえ。ACK は、システムのメンテナンスやアップグレード中を除き、ノードの高速スケーリングコンポーネントである ACK GOATScaler を自動的に更新しません。Container Service 管理コンソール の [コンポーネント管理] ページでコンポーネントを手動でアップグレードする必要があります。
ACK マネージドクラスターのロール権限付与は完了していますが、ノードスケーリングアクティビティがまだ機能しません。なぜですか?
これは、シークレット addon.aliyuncsmanagedautoscalerrole.token が kube-system 名前空間に存在しないためである可能性があります。デフォルトでは、ACK は WorkerRole を使用して関連機能を実装します。以下のプロシージャに従って、専用クラスターの WorkerRole に AliyunCSManagedAutoScalerRolePolicy 権限を付与します。
[クラスター] ページで、ターゲットクラスターの名前をクリックします。左側のナビゲーションウィンドウで、[クラスター情報] を選択します。
クラスター ページで、管理するクラスターを見つけてその名前をクリックします。左のナビゲーションウィンドウで、 を選択します。
画面の指示に従って、KubernetesWorkerRole ロールと AliyunCSManagedAutoScalerRolePolicy システムポリシーに権限を付与します。エントリポイントは図に示されています。

権限をすぐに有効にするには、kube-system 名前空間で cluster-autoscaler デプロイメント (ノードの自動スケーリング) または ack-goatscaler デプロイメント (リアルタイムノードスケーリング) を手動で再起動します。