このページでは、Google Kubernetes Engine(GKE)のクラスタ オートスケーラーによって出力される可視化イベントについて説明します。これらのイベントを分析することで、クラスタ オートスケーラーがクラスタのスケーリングを管理する方法に関する分析情報を取得し、決定の背後にある理由を把握できます。
GKE のクラスタ オートスケーラーは、Cloud Logging のログエントリとして使用可能な可視化イベントを発行します。このガイドで説明するイベントは、クラスタ オートスケーラーによって生成される Kubernetes イベントとは異なります。
要件
オートスケーラーのイベントを表示するには、クラスタで Cloud Logging を有効にする必要があります。Logging が無効になっていると、イベントは作成されません。
始める前に
作業を始める前に、次のタスクが完了していることを確認してください。
- Google Kubernetes Engine API を有効にする。 Google Kubernetes Engine API の有効化
- このタスクに Google Cloud CLI を使用する場合は、gcloud CLI をインストールして初期化する。すでに gcloud CLI をインストールしている場合は、
gcloud components updateコマンドを実行して最新のバージョンを取得します。以前のバージョンの gcloud CLI では、このドキュメントのコマンドを実行できない場合があります。
- 既存の Standard クラスタがあることを確認する。必要な場合は、Standard クラスタを作成します。
イベントの表示
クラスタ オートスケーラーの可視性イベントは、GKE クラスタと同じプロジェクト内の Cloud Logging ログに保存されます。これらのイベントは、 Google Cloud コンソールの Google Kubernetes Engine ページの通知からも確認できます。
可視化イベントログの表示
ログを表示するには、次の手順を実施します。
Google Cloud コンソールで [Kubernetes クラスタ] ページに移動します。
クラスタの名前を選択して、[クラスタの詳細] ページを表示します。
[クラスタの詳細] ページで [ログ] タブをクリックします。
[ログ] タブで、[オートスケーラー ログ] タブをクリックしてログを表示します。
(省略可)高度なフィルタを適用して結果を絞り込むには、ページの右側にある矢印のボタンをクリックして、ログ エクスプローラでログを表示します。
可視化イベント通知の表示
Google Kubernetes Engine ページで可視化イベント通知を表示するには、次の操作を行います。
Google Cloud コンソールで [Google Kubernetes Engine] ページに移動します。
特定のクラスタの [通知] 列を確認して、スケーリングに関連する通知を見つけます。
通知をクリックすると、詳細情報や推奨される対応が表示され、このイベントのログにアクセスできます。
イベントの種類
ログに記録されるイベントはすべて JSON 形式で、ログエントリの jsonPayload フィールドで確認できます。イベントのタイムスタンプはすべて UNIX の秒単位のタイムスタンプです。
クラスタ オートスケーラーによって出力されるイベントの種類の概要は次のとおりです。
| イベントの種類 | 説明 |
|---|---|
status | 定期的に発生します。すべての自動スケーリング ノードプールのサイズと、クラスタ オートスケーラーによって観測されるすべての自動スケーリング ノードプールのターゲット サイズを示します。 |
scaleUp | クラスタ オートスケーラーがクラスタをスケールアップすると発生します。 |
scaleDown | クラスタ オートスケーラーがクラスタをスケールダウンすると発生します。 |
eventResult | scaleUp イベントまたは scaleDown イベントが正常に完了したか失敗したときに発生します。 |
nodePoolCreated | ノードの自動プロビジョニングが有効になっているクラスタ オートスケーラーが、新しいノードプールを作成すると発生します。 |
nodePoolDeleted | ノードの自動プロビジョニングが有効になっているクラスタ オートスケーラーが、ノードプールを削除すると発生します。 |
noScaleUp | クラスタ内にスケジュール不可の Pod があり、クラスタ オートスケーラーが Pod に対応するようにクラスタをスケールアップできない場合に発生します。 |
noScaleDown | クラスタ オートスケーラーによる削除がブロックされているノードがある場合に発生します。 |
Status イベント
status イベントは定期的に生成され、すべての自動スケーリング ノードプールの実際のサイズと、クラスタ オートスケーラーによって観測されるすべての自動スケーリング ノードプールのターゲット サイズを示します。
例
次のログサンプルは status イベントを示しています。
{ "status": { "autoscaledNodesCount": 4, "autoscaledNodesTarget": 4, "measureTime": "1582898536" } } scaleUp イベント
scaleUp イベントは、クラスタ オートスケーラーがクラスタをスケールアップするときに生成されます。オートスケーラーは、ノードプールの基盤となるマネージド インスタンス グループ(MIG)をスケールアップして、クラスタのノードプールのサイズを増やします。スケールアップの仕組みについては、Kubernetes のクラスタ オートスケーラーに関するよくある質問のスケールアップの仕組みをご覧ください。
このイベントには、スケールアップされた MIG、ノード数、イベントをトリガーしたスケジュール不可の Pod に関する情報が含まれます。
トリガーとなる Pod のリストは、任意の 50 個のエントリで切り捨てられます。トリガーとなる Pod の実際の数は、triggeringPodsTotalCount フィールドで確認できます。
例
次のログサンプルは scaleUp イベントを示しています。
{ "decision": { "decideTime": "1582124907", "eventId": "ed5cb16d-b06f-457c-a46d-f75dcca1f1ee", "scaleUp": { "increasedMigs": [ { "mig": { "name": "test-cluster-default-pool-a0c72690-grp", "nodepool": "default-pool", "zone": "us-central1-c" }, "requestedNodes": 1 } ], "triggeringPods": [ { "controller": { "apiVersion": "apps/v1", "kind": "ReplicaSet", "name": "test-85958b848b" }, "name": "test-85958b848b-ptc7n", "namespace": "default" } ], "triggeringPodsTotalCount": 1 } } } scaleDown イベント
scaleDown イベントは、クラスタ オートスケーラーがクラスタをスケールダウンするときに生成されます。スケールダウンの仕組みの詳細については、Kubernetes のクラスタ オートスケーラーに関するよくある質問のスケールダウンの仕組みをご覧ください。
cpuRatio フィールドと memRatio フィールドは、ノードの CPU とメモリの使用率をパーセントで示します。この使用率は、Pod リクエストの合計を割り当て可能なノードで割ったもので、実際の使用率ではありません。
削除される Pod のリストは、任意の 50 個のエントリで切り捨てられます。削除される Pod の実際の数は、evictedPodsTotalCount フィールドで確認できます。
次のクエリを使用して、クラスタ オートスケーラーによってノードがスケールダウンされたかどうかを確認します。
resource.type="k8s_cluster" \ resource.labels.location=COMPUTE_REGION \ resource.labels.cluster_name=CLUSTER_NAME \ log_id("container.googleapis.com/cluster-autoscaler-visibility") \ ( "decision" NOT "noDecisionStatus" ) 次のように置き換えます。
CLUSTER_NAME: クラスタの名前。COMPUTE_REGION: クラスタの Compute Engine リージョン(us-central1など)。
例
次のログサンプルは scaleDown イベントを示しています。
{ "decision": { "decideTime": "1580594665", "eventId": "340dac18-8152-46ff-b79a-747f70854c81", "scaleDown": { "nodesToBeRemoved": [ { "evictedPods": [ { "controller": { "apiVersion": "apps/v1", "kind": "ReplicaSet", "name": "kube-dns-5c44c7b6b6" }, "name": "kube-dns-5c44c7b6b6-xvpbk" } ], "evictedPodsTotalCount": 1, "node": { "cpuRatio": 23, "memRatio": 5, "mig": { "name": "test-cluster-default-pool-c47ef39f-grp", "nodepool": "default-pool", "zone": "us-central1-f" }, "name": "test-cluster-default-pool-c47ef39f-p395" } } ] } } } また、ワークロードが実行されていないノードで scale-down イベントを表示することもできます(通常は、DaemonSet によって作成されたシステム Pod のみ)。
次のクエリを使用して、イベントログを表示します。
resource.type="k8s_cluster" \ resource.labels.project_id=PROJECT_ID \ resource.labels.location=COMPUTE_REGION \ resource.labels.cluster_name=CLUSTER_NAME \ severity>=DEFAULT \ logName="projects/PROJECT_ID/logs/events" \ ("Scale-down: removing empty node") 次のように置き換えます。
PROJECT_ID: プロジェクト ID。CLUSTER_NAME: クラスタの名前。COMPUTE_REGION: クラスタの Compute Engine リージョン(us-central1など)。
eventResult イベント
eventResult イベントは、scaleUp イベントまたは scaleDown イベントが正常に完了したときまたは失敗したときに生成されます。このイベントには、イベント ID(scaleUp イベントまたは scaleDown イベントの eventId フィールド)のリストとエラー メッセージが含まれます。空のエラー メッセージは、イベントが正常に完了したことを示します。eventResult イベントのリストは results フィールドに集約されます。
エラーを診断するには、ScaleUp エラーのセクションと ScaleDown エラーのセクションをご覧ください。
例
次のログサンプルは eventResult イベントを示しています。
{ "resultInfo": { "measureTime": "1582878896", "results": [ { "eventId": "2fca91cd-7345-47fc-9770-838e05e28b17" }, { "errorMsg": { "messageId": "scale.down.error.failed.to.delete.node.min.size.reached", "parameters": [ "test-cluster-default-pool-5c90f485-nk80" ] }, "eventId": "ea2e964c-49b8-4cd7-8fa9-fefb0827f9a6" } ] } } NodePoolCreated イベント
ノードの自動プロビジョニングが有効になっているクラスタ オートスケーラーが新しいノードプールを作成すると、nodePoolCreated イベントが生成されます。このイベントには、作成されたノードプールの名前とその基盤となる MIG のリストが含まれます。scaleUp イベントによってノードプールが作成された場合は、対応する scaleUp イベントの eventId が triggeringScaleUpId フィールドに含まれます。
例
次のログサンプルは nodePoolCreated イベントを示しています。
{ "decision": { "decideTime": "1585838544", "eventId": "822d272c-f4f3-44cf-9326-9cad79c58718", "nodePoolCreated": { "nodePools": [ { "migs": [ { "name": "test-cluster-nap-n1-standard--b4fcc348-grp", "nodepool": "nap-n1-standard-1-1kwag2qv", "zone": "us-central1-f" }, { "name": "test-cluster-nap-n1-standard--jfla8215-grp", "nodepool": "nap-n1-standard-1-1kwag2qv", "zone": "us-central1-c" } ], "name": "nap-n1-standard-1-1kwag2qv" } ], "triggeringScaleUpId": "d25e0e6e-25e3-4755-98eb-49b38e54a728" } } } NodePoolDeleted イベント
ノードの自動プロビジョニングが有効になっているクラスタ オートスケーラーがノードプールを削除すると、nodePoolDeleted イベントが生成されます。
例
次のログサンプルは nodePoolDeleted イベントを示しています。
{ "decision": { "decideTime": "1585830461", "eventId": "68b0d1c7-b684-4542-bc19-f030922fb820", "nodePoolDeleted": { "nodePoolNames": [ "nap-n1-highcpu-8-ydj4ewil" ] } } } NoScaleUp イベント
noScaleUp イベントは、クラスタ内にスケジュール不可の Pod があり、クラスタ オートスケーラーが Pod に対応するようにクラスタをスケールアップできない場合に定期的に生成されます。
- noScaleUp イベントはベスト エフォート型です。つまり、このイベントは、クラスタ オートスケーラーがスケールアップできない理由すべてに対応しているわけではありません。
- 生成されるログ容量を制限するため、noScaleUp イベントは抑制されます。永続的な理由のみ、数分ごとに出力されます。
- すべての理由を複数のイベントに任意に分割できます。たとえば、1 つの Pod グループで拒否された MIG の理由がすべて、同じイベントに表示されるという保証はありません。
- 未処理の Pod グループのリストは、任意の 50 個のエントリで切り捨てられます。未処理の Pod グループの実際の数は、
unhandledPodGroupsTotalCountフィールドで確認できます。
Reason フィールド
次のフィールドは、スケールアップが発生しなかった理由を説明するために役立ちます。
reason: クラスタ オートスケーラーがスケールアップされない代表的な理由を示します。詳細については、NoScaleUp の最上位の理由をご覧ください。napFailureReason: クラスタ オートスケーラーが追加のノードプールをプロビジョニングできない代表的な理由(ノードの自動プロビジョニングが無効になっているなど)を示します。詳細については、NoScaleUp のノードの自動プロビジョニングの最上位の理由をご覧ください。skippedMigs[].reason: 特定の MIG がスキップされた理由に関する情報を示します。クラスタ オートスケーラーは、スケールアップの試行中に対象の Pod から一部の MIG をスキップします(別のノードを追加するとクラスタ全体のリソース上限を超えることになるなど)。詳細については、NoScaleUp の MIG レベルの理由をご覧ください。unhandledPodGroups: スケジュール不可の Pod の特定のグループがスケールアップをトリガーしない理由に関する情報が含まれます。Pod は即時コントローラによってグループ化されます。コントローラのない Pod は単独でグループ化されます。各 Pod グループには、任意の Pod の例とグループ内の Pod の数、さらに次の理由が含まれます。napFailureReasons: クラスタ オートスケーラーがこの Pod グループに合わせて新しいノードプールをプロビジョニングできない理由(Pod にアフィニティの制約があるなど)。詳細については、NoScaleUp のノード自動プロビジョニングの Pod レベルの理由をご覧ください。rejectedMigs[].reason: クラスタ オートスケーラーがこの Pod グループに合わせて特定の MIG のサイズを増やすことができない MIG ごとの理由(MIG のノードが Pod に対して小さすぎるなど)。詳細については、NoScaleUp の MIG レベルの理由をご覧ください。
例
次のログサンプルは noScaleUp イベントを示しています。
{ "noDecisionStatus": { "measureTime": "1582523362", "noScaleUp": { "skippedMigs": [ { "mig": { "name": "test-cluster-nap-n1-highmem-4-fbdca585-grp", "nodepool": "nap-n1-highmem-4-1cywzhvf", "zone": "us-central1-f" }, "reason": { "messageId": "no.scale.up.mig.skipped", "parameters": [ "max cluster cpu limit reached" ] } } ], "unhandledPodGroups": [ { "napFailureReasons": [ { "messageId": "no.scale.up.nap.pod.zonal.resources.exceeded", "parameters": [ "us-central1-f" ] } ], "podGroup": { "samplePod": { "controller": { "apiVersion": "v1", "kind": "ReplicationController", "name": "memory-reservation2" }, "name": "memory-reservation2-6zg8m", "namespace": "autoscaling-1661" }, "totalPodCount": 1 }, "rejectedMigs": [ { "mig": { "name": "test-cluster-default-pool-b1808ff9-grp", "nodepool": "default-pool", "zone": "us-central1-f" }, "reason": { "messageId": "no.scale.up.mig.failing.predicate", "parameters": [ "NodeResourcesFit", "Insufficient memory" ] } } ] } ], "unhandledPodGroupsTotalCount": 1 } } } NoScaleDown イベント
noScaleDown イベントは、クラスタ オートスケーラーによる削除がブロックされているノードがある場合に生成されます。
- 使用率が高いために削除できないノードは、noscaleDown イベントに含まれません。
- noScaleDown イベントはベスト エフォート型です。つまり、このイベントは、クラスタ オートスケーラーがスケールダウンできない理由すべてに対応しているわけではありません。
- 生成されるログ容量を制限するため、noScaleDown イベントは抑制されます。永続的な理由のみ、数分ごとに出力されます。
- ノードのリストは任意の 50 個のエントリで切り捨てられます。実際のノード数は
nodesTotalCountフィールドで確認できます。
Reason フィールド
次のフィールドは、スケールダウンが発生しなかった理由を説明するために役立ちます。
reason: クラスタ オートスケーラーがスケールダウンされない代表的な理由を示します(最近スケールアップした後のバックオフ期間など)。詳細については、NoScaleDown の最上位の理由をご覧ください。nodes[].reason: クラスタ オートスケーラーが特定のノードを削除できない理由をノードごとに示します(ノードの Pod を移動する場所がないなど)。詳細については、NoScaleDown のノードレベルの理由をご覧ください。
例
次のログサンプルは noScaleDown イベントを示しています。
{ "noDecisionStatus": { "measureTime": "1582858723", "noScaleDown": { "nodes": [ { "node": { "cpuRatio": 42, "mig": { "name": "test-cluster-default-pool-f74c1617-grp", "nodepool": "default-pool", "zone": "us-central1-c" }, "name": "test-cluster-default-pool-f74c1617-fbhk" }, "reason": { "messageId": "no.scale.down.node.no.place.to.move.pods" } } ], "nodesTotalCount": 1, "reason": { "messageId": "no.scale.down.in.backoff" } } } } メッセージ
クラスタ オートスケーラーが生成したイベントは、パラメータ化されたメッセージを使用してイベントについて説明します。parameters フィールドは、NoScaleUp イベントのこのログの例のように、messageId フィールドとともに使用できます。
ここでは、さまざまな messageId と、対応するパラメータについて説明します。考えられるすべてのメッセージがここに記載されているわけではなく、いつでも拡張できます。
ScaleUp エラー
scaleUp イベントのイベント エラー メッセージは、対応する eventResult イベントの resultInfo.results[].errorMsg フィールドにあります。
割り当て上限を超えたためにスケールアップ オペレーションが失敗すると、ノード作成エラーが発生し、システム バックオフ期間がトリガーされます。この期間は最大 30 分間続くことがあります。詳細については、バックオフ期間をご覧ください。
| メッセージ | 詳細 | パラメータ | 緩和策 |
|---|---|---|---|
"scale.up.error.out.of.resources" | リソースエラーは、GPU や CPU などの Compute Engine リソースが現在利用できないことが原因でリクエストに対応できないゾーンで、新しいリソースをリクエストしようとした場合に発生します。 | 失敗した MIG ID。 | Compute Engine ドキュメントのリソースの可用性に関するトラブルシューティング手順に沿って対応します。 |
"scale.up.error.quota.exceeded" | Compute Engine の割り当て超過で MIG の一部を増やすことができなかったため、scaleUp イベントが失敗しました。 | 失敗した MIG ID。 | Google Cloud コンソールで MIG の [エラー] タブをチェックして、超過している割り当てを確認します。どの割り当てが超過しているかを確認したら、手順に沿って割り当ての増加をリクエストします。 |
"scale.up.error.waiting.for.instances.timeout" | タイムアウトにより、マネージド インスタンス グループのスケールアップに失敗しました。 | 失敗した MIG ID。 | このメッセージは一時的なものです。 問題が解決しない場合は、Cloud カスタマーケアにお問い合わせのうえ、さらに調査を依頼してください。 |
"scale.up.error.ip.space.exhausted" | 一部のマネージド インスタンス グループ内のインスタンスが IP 不足になったため、スケールアップできませんつまり、新しいノードや Pod の追加に使用する未割り振りの IP アドレス空間がクラスタに不足しています。 | 失敗した MIG ID。 | Pod の空き IP アドレス空間が不足しているのトラブルシューティング手順に沿って対応します。 |
"scale.up.error.service.account.deleted" | サービス アカウントが削除されたため、スケールアップできません。 | 失敗した MIG ID。 | サービス アカウントの削除を取り消すことを試みます。 この手順で問題が解決しない場合は、Cloud カスタマーケアにお問い合わせのうえ、さらに調査を依頼してください。 |
noScaleUp イベントが発生する理由
noScaleUp イベントは、クラスタ内にスケジュール不可の Pod があり、クラスタ オートスケーラーが Pod に対応するようにクラスタをスケジュールできない場合に定期的に生成されます。noScaleUp イベントはベスト エフォート型であり、考えられるすべてのケースに対応しているわけではありません。
NoScaleUp の最上位の理由
noScaleUp イベントの最上位の理由メッセージが noDecisionStatus.noScaleUp.reason フィールドに表示されます。このメッセージには、クラスタ オートスケーラーがクラスタをスケールアップできない最上位の理由が含まれています。
| メッセージ | 詳細 | 緩和策 |
|---|---|---|
"no.scale.up.in.backoff" | スケールアップがバックオフ期間中(一時的にブロック中)であるため、スケールアップされません。これは、多数の Pod のスケールアップ イベント中に発生する可能性のあるメッセージです。 | このメッセージは一時的なものです。数分後にこのエラーを確認します。 このメッセージが続く場合は、Cloud カスタマーケアにお問い合わせのうえ、さらに調査を依頼してください。 |
NoScaleUp のノード自動プロビジョニングの最上位の理由
noScaleUp イベントに関するノードの自動プロビジョニングの最上位の理由メッセージが noDecisionStatus.noScaleUp.napFailureReason フィールドに表示されます。このメッセージには、クラスタ オートスケーラーが新しいノードプールをプロビジョニングできない最上位の理由が含まれています。
| メッセージ | 詳細 | 緩和策 |
|---|---|---|
"no.scale.up.nap.disabled" | ノードの自動プロビジョニングがクラスタレベルで有効になっていないため、ノードの自動プロビジョニングをスケールアップできませんでした。 ノード自動プロビジョニングが無効になっている場合、保留中の Pod に既存のノードプールによって満たすことができない要件があると、新しいノードは自動的にプロビジョニングされません。 | クラスタ構成を確認し、ノード自動プロビジョニングの有効化を検討してください。 |
NoScaleUp の MIG レベルの理由
noScaleUp イベントに関する MIG レベルの理由メッセージが noDecisionStatus.noScaleUp.skippedMigs[].reason フィールドと noDecisionStatus.noScaleUp.unhandledPodGroups[].rejectedMigs[].reason フィールドに表示されます。このメッセージには、クラスタ オートスケーラーが特定の MIG のサイズを増やすことができない理由が含まれています。
| メッセージ | 詳細 | パラメータ | 緩和策 |
|---|---|---|---|
"no.scale.up.mig.skipped" | シミュレーション中に MIG がスキップされたため、MIG をスケールアップできません。 | MIG がスキップされた理由(Pod 要件がないなど)。 | エラー メッセージに含まれるパラメータを確認し、MIG がスキップされた理由に対応します。 |
"no.scale.up.mig.failing.predicate" | 保留中の Pod のスケジューリングの述語に問題があるため、ノードプールをスケールアップできません。 | 失敗した述語の名前と失敗した理由。 | アフィニティ ルール、taint、toleration、リソース要件などの Pod の要件を確認します |
NoScaleUp のノード自動プロビジョニングの Pod グループレベルの理由
noScaleUp イベントに関するノード自動プロビジョニングの Pod グループレベルの理由に関するメッセージが noDecisionStatus.noScaleUp.unhandledPodGroups[].napFailureReasons[] フィールドに表示されます。このメッセージには、クラスタ オートスケーラーが特定の Pod グループをスケジュールする新しいノードプールをプロビジョニングできない理由が含まれています。
| メッセージ | 詳細 | パラメータ | 緩和策 |
|---|---|---|---|
"no.scale.up.nap.pod.gpu.no.limit.defined" | 保留中の Pod に GPU リクエストがありますが、GPU リソース上限がクラスタレベルで定義されていないため、ノード自動プロビジョニングでノードグループをプロビジョニングできませんでした。 | リクエストされた GPU タイプ。 | 保留中の Pod の GPU リクエストを確認し、クラスタレベルのノード自動プロビジョニングの GPU 制限についての構成を更新します。 |
"no.scale.up.nap.pod.gpu.type.not.supported" | ノード自動プロビジョニングで不明な GPU タイプに対するリクエストがあったため、Pod のノードグループがプロビジョニングされませんでした。 | リクエストされた GPU タイプ。 | 保留中の Pod の構成で GPU タイプを確認し、サポートされている GPU タイプと一致していることを確認します。 |
"no.scale.up.nap.pod.zonal.resources.exceeded" | ノード自動プロビジョニングでこのゾーン内の Pod のノードグループがプロビジョニングされませんでした。これは、プロビジョニングを実施すると、クラスタ全体の最大リソース上限に違反するか、ゾーン内で使用可能なリソースを超過するか、またはリクエストに対応できるマシンタイプがないためです。 | 対象ゾーンの名前。 | クラスタ全体の最大リソース上限、Pod リソースのリクエスト、またはノード自動プロビジョニングに使用できるゾーンを確認して更新します。 |
"no.scale.up.nap.pod.zonal.failing.predicates" | 述語が失敗したため、ノード自動プロビジョニングで、このゾーン内の Pod のノードグループがプロビジョニングされませんでした。 | 対象ゾーンの名前と、述語が失敗した理由。 | アフィニティ ルール、taint、容認機能、リソースの要件など、保留中の Pod の要件を確認します。 |
ScaleDown エラー
scaleDown イベントのエラーイベント メッセージは、対応する eventResult イベントの resultInfo.results[].errorMsg フィールドにあります。
| イベント メッセージ | 詳細 | パラメータ | 緩和策 |
|---|---|---|---|
"scale.down.error.failed.to.mark.to.be.deleted" | ノードを削除対象としてマークできませんでした。 | 失敗したノード名。 | このメッセージは一時的なものです。 問題が解決しない場合は、Cloud カスタマーケアにお問い合わせのうえ、さらに調査を依頼してください。 |
"scale.down.error.failed.to.evict.pods" | 一部の Pod をノードから強制排除できなかったため、クラスタ オートスケーラーはスケールダウンできません。 | 失敗したノード名。 | Pod の PodDisruptionBudget を確認し、許容可能な場合は、ルールでアプリケーション レプリカの強制排除が許可されていることを確認します。詳細については、Kubernetes ドキュメントでアプリケーションの停止予算の指定をご覧ください。 |
"scale.down.error.failed.to.delete.node.min.size.reached" | クラスタがすでに最小サイズになっているため、ノードを削除できず、クラスタ オートスケーラーはスケールダウンできません。 | 失敗したノード名。 | ノードプールの自動スケーリングに設定された最小値を確認し、必要に応じて設定を調整します。詳細については、エラー: Nodes in the cluster have reached minimum size をご覧ください。 |
noScaleDown イベントが発生する理由
noScaleDown イベントは、クラスタ オートスケーラーによる削除がブロックされているノードがある場合に生成されます。noScaleDown イベントはベスト エフォート型であり、考えられるすべてのケースに対応しているわけではありません。
NoScaleDown の最上位の理由
noScaleDown イベントの最上位の理由メッセージが noDecisionStatus.noScaleDown.reason フィールドに表示されます。このメッセージには、クラスタ オートスケーラーがクラスタをスケールダウンできない最上位の理由が含まれています。
| イベント メッセージ | 詳細 | 緩和策 |
|---|---|---|
"no.scale.down.in.backoff" | スケールダウンがバックオフ期間中(一時的にブロック中)であるため、クラスタ オートスケーラーはスケールダウンできません。 | このメッセージは一時的なもので、直近でスケールアップ イベントがあった場合に発生する可能性があります。 メッセージが続く場合は、Cloud カスタマーケアにお問い合わせください。 |
"no.scale.down.in.progress" | 前のスケールダウンがまだ進行中であるため、クラスタ オートスケーラーはスケールダウンできません。 | Pod はいずれ削除されるため、このメッセージは一過性のものになるはずです。このメッセージが頻繁に発生する場合は、スケールダウンをブロックしている Pod の終了猶予期間を確認します。解決を早めるため、不要になった Pod を削除することもできます。 |
NoScaleDown のノードレベルの理由
noScaleDown イベントのノードレベルの理由メッセージが noDecisionStatus.noScaleDown.nodes[].reason field に表示されます。このメッセージには、クラスタ オートスケーラーが特定のノードを削除できない理由が含まれています。
| イベント メッセージ | 詳細 | パラメータ | 緩和策 |
|---|---|---|---|
"no.scale.down.node.scale.down.disabled.annotation" | ノードに cluster-autoscaler.kubernetes.io/scale-down-disabled: true アノテーションが付いているため、クラスタ オートスケーラーはノードプールからノードを削除できません。 | なし | クラスタ オートスケーラーは、このアノテーションを持つノードの使用率を考慮せずにスキップします。このメッセージは、ノードの使用率に関係なくログに記録されます。クラスタ オートスケーラーでこれらのノードをスケールダウンする場合は、アノテーションを削除します。 |
"no.scale.down.node.node.group.min.size.reached" | ノードグループのサイズが最小サイズの上限を超えている場合、クラスタ オートスケーラーはスケールダウンできません。 これは、ノードを削除すると、ノードの自動プロビジョニング設定で定義されているクラスタ全体の最小リソース上限に違反するためです。 | なし | ノードプールの自動スケーリングに設定された最小値を確認します。クラスタ オートスケーラーでこのノードをスケールダウンする場合は、最小値を調整します。 |
"no.scale.down.node.minimal.resource.limits.exceeded" | クラスタ オートスケーラーは、クラスタ全体の最小リソース上限に違反するため、ノードをスケールダウンできません。 これらは、ノードの自動プロビジョニングに設定されているリソースの上限です。 | 該当なし | メモリと vCPU の制限を確認し、クラスタ オートスケーラーでこのノードをスケールダウンする場合は、制限を引き上げます。 |
"no.scale.down.node.no.place.to.move.pods" | Pod を移動する場所がないため、クラスタ オートスケーラーはスケールダウンできません。 | なし | Pod の再スケジュールが予想される場合は、使用率の低いノード上の Pod のスケジューリング要件を確認し、クラスタ内の別のノードに移動できるかどうかを判断します。詳細については、エラー: No place to move Pods をご覧ください。 |
"no.scale.down.node.pod.not.backed.by.controller" | Pod がコントローラによってサポートされていないため、スケールダウンがブロックされています。 具体的には、認識されたコントローラがない Pod が原因で、クラスタ オートスケーラーは使用率の低いノードをスケールダウンできません。使用できるコントローラには、ReplicationController、DaemonSet、Job、StatefulSet、ReplicaSet などがあります。 | ブロックしている Pod の名前。 | Pod にアノテーション "cluster-autoscaler.kubernetes.io/safe-to-evict": "true" を設定するか、許容されるコントローラを定義します。 |
"no.scale.down.node.pod.not.safe.to.evict.annotation" | ノードの Pod に safe-to-evict=false アノテーションがあります。 | ブロックしている Pod の名前。 | Pod を安全に強制排除できる場合は、Pod のマニフェストを編集して、アノテーションを "cluster-autoscaler.kubernetes.io/safe-to-evict": "true" に更新します。 |
"no.scale.down.node.pod.kube.system.unmovable" | Pod が DaemonSet 以外で、ミラーリングがなく、kube-system 名前空間に PodDisruptionBudget のない Pod であるため、スケールダウンがブロックされています。 | ブロックしている Pod の名前。 | 1.32.4-gke.1236000 より前の GKE バージョンでは、クラスタ オートスケーラーは この問題を解決するには、 |
"no.scale.down.node.pod.not.enough.pdb" | Pod に十分な PodDisruptionBudget がないため、スケールダウンがブロックされています。 | ブロックしている Pod の名前。 | Pod の PodDisruptionBudget を確認し、制限を緩和することを検討します。詳細については、エラー: Not enough PodDisruptionBudget をご覧ください。 |
"no.scale.down.node.pod.controller.not.found" | Pod のコントローラ(Deployment や ReplicaSet など)が見つからないため、スケールダウンがブロックされています。 | なし | コントローラが削除された後に Pod を動作したままにしているアクションを特定するには、ログを確認します。この問題を解決するには、Pod を手動で削除します。 |
"no.scale.down.node.pod.unexpected.error" | 予期しないエラーが発生したため、Pod のスケールダウンがブロックされています。 | なし | このエラーの根本原因は不明です。 詳細な調査については、Cloud カスタマーケアにお問い合わせください。 |
次のステップ
- クラスタ オートスケーラーの詳細を理解する。
- ノード自動プロビジョニングの使用方法について学習する。
- クラスタ オートスケーラーがスケールダウンしない問題のトラブルシューティング
- クラスタ オートスケーラーがスケールアップしない問題のトラブルシューティング
- スケーリングの問題のトラブルシューティングと解決に関する YouTube 動画を見る。