このページでは、Google Kubernetes Engine(GKE)クラスタ オートスケーラーによる自動スケーリングについて説明します。
GKE のクラスタ オートスケーラーは、Cloud Logging のログエントリとして使用可能な可視化イベントを発行します。
このガイドで説明するイベントは、クラスタ オートスケーラーによって生成される Kubernetes イベントとは異なります。
可用性の要件
ログに記録されたクラスタ オートスケーラー イベントを表示する機能は、次のクラスタのバージョンで使用できます。
イベントの種類 | クラスタのバージョン |
---|---|
status 、scaleUp 、scaleDown 、eventResult |
1.15.4-gke.7 以降 |
nodePoolCreated 、nodePoolDeleted |
1.15.4-gke.18 以降 |
noScaleUp |
1.16.6-gke.3 以降 |
noScaleDown |
1.16.8-gke.2 以降 |
オートスケーラーのイベントを表示するには、クラスタで Cloud Logging を有効にする必要があります。Logging が無効になっていると、イベントは作成されません。
イベントの表示
クラスタ オートスケーラーの可視性イベントは、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"
}
}
}
}
スケーリングに関する問題のトラブルシューティング
ここでは、スケーリング イベントをトラブルシューティングする方法について説明します。
クラスタがスケールアップしない
シナリオ クラスタに Pod を作成しましたが、過去 1 時間は保留状態のままです。クラスタ オートスケーラーは、Pod に対応する新しいノードをプロビジョニングしませんでした。
解決策:
- ログ エクスプローラーで、イベントの表示セクションの説明に従って、クラスタ オートスケーラー イベントのロギングの詳細を確認します。
triggeringPods
フィールドで目的の Pod を含むscaleUp
イベントを検索します。特定の JSON フィールド値によるフィルタリングなど、ログエントリをフィルタリングできます。詳細については、高度なログクエリをご覧ください。scaleUp
イベントと同じeventId
を含むEventResult
を見つけます。errorMsg
フィールドで、有効な scaleUp エラー メッセージ一覧を調べます。
ScaleUp エラーの例:
scaleUp
イベントの場合、エラーは"scale.up.error.quota.exceeded"
であることがわかります。これは、「割り当ての超過により、MIG の一部を増やすことができなかったため、scaleUP イベントが失敗した」ことを示しています。この問題を解決するには、割り当て設定を確認し、超過しそうな設定を増やします。クラスタ オートスケーラーが新しいノードを追加し、Pod がスケジュールされます。noScaleUp
イベントを検索し、次のフィールドを確認します。unhandledPodGroups
: Pod(または Pod のコントローラ)に関する情報が含まれます。reason
: スケールアップがブロックされる可能性があることを示す代表的な理由を示します。skippedMigs
: 一部の MIG がスキップされる可能性がある理由を示します。
noScaleUp
イベントが発生する理由として考えられるものについては、次のセクションをご覧ください。- NoScaleUp の最上位の理由
- NoScaleUp のノードの自動プロビジョニングの最上位の理由
- NoScaleUp の MIG レベルの理由
- NoScaleUp のノードにおける自動プロビジョニングの Pod グループレベルの理由
NoScaleUp の例: Pod に関して
noScaleUp
イベントがあり、rejectedMigs
フィールド内のすべての MIG に 2 つのパラメータ"NodeAffinity"
と"node(s) did not match node selector"
を指定した同じメッセージ ID"no.scale.up.mig.failing.predicate"
があります。エラー メッセージ一覧を調べたところ、「MIG の述語が失敗したために MIG をスケールアップできない」ことがわかりました。パラメータは、失敗した述語の名前と失敗した理由です。この問題を解決するには、Pod の仕様を調べ、クラスタ内の MIG と一致しないノードセレクタが Pod の仕様に含まれていることを確認します。Pod の仕様からこのセレクタを削除し、Pod を再作成します。クラスタ オートスケーラーが新しいノードを追加し、Pod がスケジュールされます。noScaleUp
イベントがない場合は、他のデバッグ方法を使用して問題を解決します。
クラスタがスケールダウンしない
シナリオ: クラスタ内に、過去数日で CPU とメモリの 10% しか使用していないノードがあります。使用率が低いにもかかわらず、クラスタ オートスケーラーが想定どおりにノードを削除しませんでした。
解決策:
- ログ エクスプローラーで、イベントの表示セクションの説明に従って、クラスタ オートスケーラー イベントのロギングの詳細を確認します。
nodesToBeRemoved
フィールドで目的のノードを含むscaleDown
イベントを検索します。特定の JSON フィールド値によるフィルタリングなど、ログエントリをフィルタリングできます。詳細については、高度なログクエリをご覧ください。scaleDown
イベントで、関連するeventId
を含むEventResult
イベントを検索します。errorMsg
フィールドで、有効な scaleDown エラー メッセージ一覧を調べます。
nodes
フィールドで目的のノードを含むnoScaleDown
イベントを検索します。スケールダウンがブロックされる可能性があることを示す代表的な理由については、reason
フィールドをご覧ください。noScaleDown
イベントが発生する理由として考えられるものについては、次のセクションをご覧ください。NoScaleDown の例: ノードに関し、ノードごとの理由を含む
noScaleDown
イベントが見つかりました。メッセージ ID は"no.scale.down.node.pod.has.local.storage"
で、1 つのパラメータ"test-single-pod"
が指定されています。エラー メッセージ一覧を調べたところ、「Pod がローカル ストレージをリクエストしているため、スケールダウンがブロックされている」ことがわかりました。Kubernetes クラスタ オートスケーラーに関するよくある質問から、Pod に"cluster-autoscaler.kubernetes.io/safe-to-evict": "true"
アノテーションを追加する解決策が見つかります。アノテーションの適用後、クラスタ オートスケーラーはクラスタを正しくスケールダウンします。noScaleDown
イベントがない場合は、他のデバッグ方法を使用して問題を解決します。
メッセージ
クラスタ オートスケーラーが生成したイベントは、パラメータ化されたメッセージを使用してイベントについて説明します。parameters
フィールドは、NoScaleUp イベントのこのログの例のように、messageId
フィールドとともに使用できます。
ここでは、さまざまな messageId
と、対応するパラメータについて説明します。考えられるすべてのメッセージがここに記載されているわけではなく、いつでも拡張できます。
ScaleUp エラー
scaleUp
イベントに関するエラー メッセージは、resultInfo.results[].errorMsg
フィールド内の対応する eventResult
イベントにあります。
メッセージ | 説明 | 緩和策 |
---|---|---|
"scale.up.error.out.of.resources" |
リソース不足で MIG の一部を増やすことができなかったため、scaleUp イベントが失敗しました。
パラメータ: 失敗した MIG ID。 |
リソースの可用性に関するトラブルシューティング手順の説明に従います。 |
"scale.up.error.quota.exceeded" |
Compute Engine の割り当て超過で MIG の一部を増やすことができなかったため、scaleUp イベントが失敗しました。
パラメータ: 失敗した MIG ID。 |
Google Cloud コンソールで MIG の [エラー] タブをチェックして、超過している割り当てを確認します。手順に沿って割り当ての増加をリクエストします。 |
"scale.up.error.waiting.for.instances.timeout" |
一部の MIG のインスタンスが時間内に表示されなかったため、scaleUp イベントが失敗しました。
パラメータ: 失敗した MIG ID。 |
このメッセージは一時的なものです。問題が解決しない場合は、さらに調査するために Google Cloud サポートに問い合わせてください。 |
"scale.up.error.ip.space.exhausted" |
新しいノードや Pod の追加に使用する未割り振りの IP アドレス空間がクラスタにないため、scaleUp イベントが失敗しました。 パラメータ: 失敗した MIG ID。 |
トラブルシューティングの手順を参照して、ノードまたは Pod の IP アドレス空間の不足に対応してください。 |
"scale.up.error.service.account.deleted" |
クラスタ オートスケーラーで使用されているサービス アカウントが削除されたため、scaleUp イベントが失敗しました。 パラメータ: 失敗した MIG ID。 |
さらなる調査のために Google Cloud サポートに問い合わせてください。 |
ScaleDown エラー
scaleDown
イベントに関するエラー メッセージは、resultInfo.results[].errorMsg
フィールド内の対応する eventResult
イベントにあります。
メッセージ | 説明 | 緩和策 |
---|---|---|
"scale.down.error.failed.to.mark.to.be.deleted" |
ノードを削除対象としてマークできなかったため、scaleDown イベントが失敗しました。
パラメータ: 失敗したノード名。 |
このメッセージは一時的なものです。問題が解決しない場合は、さらに調査するために Google Cloud サポートに問い合わせてください。 |
"scale.down.error.failed.to.evict.pods" |
一部の Pod をノードからエビクションできなかったため、scaleDown イベントが失敗しました。
パラメータ: 失敗したノード名。 |
必要であれば、ルールによってアプリケーション レプリカのエビクションが許可されるようにするために、Pod 停止予算のベスト プラクティスを確認します。 |
"scale.down.error.failed.to.delete.node.min.size.reached" |
クラスタがすでに最小サイズになっていてノードを削除できなかったため、scaleDown イベントが失敗しました。
パラメータ: 失敗したノード名。 |
ノードプールの自動スケーリングに設定された最小値を確認し、必要に応じて設定を調整します。 |
NoScaleUp イベントが発生する理由
NoScaleUp の最上位の理由
noScaleUp
イベントの最上位の理由メッセージが noDecisionStatus.noScaleUp.reason
フィールドに表示されます。このメッセージには、クラスタ オートスケーラーがクラスタをスケールアップできない最上位の理由が含まれています。
メッセージ | 説明 | 緩和策 | |
---|---|---|---|
"no.scale.up.in.backoff" |
スケールアップがバックオフ期間中(一時的にブロック中)であるため、noScaleUp が発生しました。これは、多数の Pod のスケールアップ イベント中に発生する可能性のある、一時的なメッセージです。 | このメッセージが続く場合は、Google 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" |
MIG が保留中の Pod の述語要件を満たしていないため、MIG をスケールアップできません。 パラメータ: 失敗した述語の名前。人が読める形式の、失敗した理由。 |
アフィニティ ルール、taint、容認機能、リソース要件などの 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 の要件を確認します。 |
NoScaleDown イベントが発生する理由
NoScaleDown の最上位の理由
noScaleDown
イベントの最上位の理由メッセージが noDecisionStatus.noScaleDown.reason
フィールドに表示されます。このメッセージには、クラスタ オートスケーラーがクラスタをスケールダウンできない最上位の理由が含まれています。
メッセージ | 説明 | 緩和策 |
---|---|---|
"no.scale.down.in.backoff" |
スケールダウンがバックオフ期間中(一時的にブロック中)であるため、noScaleDown が発生しました。このイベントは一時的なもので、直近でスケールアップ イベントがあった場合に発生する可能性があります。 | スケールダウンの失敗の下位レベルの理由に関連する緩和策を行います。根本的な原因が解決されると、クラスタ オートスケーラーはバックオフを終了します。根本的な原因に対応した後もメッセージが引き続き表示される場合は、Google Cloud サポートに問い合わせてください。 |
"no.scale.down.in.progress" |
削除がスケジュールされている以前のノードが削除されるまでスケールダウンがブロックされるため、noScaleDown イベントが発生しました。 | Pod はいずれ強制的に削除されるため、このイベントは一過性のものになるはずです。このメッセージが頻繁に発生する場合は、スケールダウンをブロックする Pod の gracefulTerminationPeriod 値を確認します。解決を早めるには、不要になった Pod を強制的に削除することもできます。 |
NoScaleDown のノードレベルの理由
noScaleDown
イベントのノードレベルの理由メッセージが noDecisionStatus.noScaleDown.nodes[].reason
フィールドに表示されます。このメッセージには、クラスタ オートスケーラーが特定のノードを削除できない理由が含まれています。
メッセージ | 説明 | 緩和策 |
---|---|---|
"no.scale.down.node.scale.down.disabled.annotation" |
ノードに scale-down-disabled アノテーションがあるため、削除できません。 |
Kubernetes クラスタ オートスケーラーのよくある質問の手順に沿って、スケールダウンを妨げるアノテーションを確認します。 |
"no.scale.down.node.node.group.min.size.reached" |
ノードグループがすでに最小サイズになっているため、ノードを削除できません。 | ノードプールの自動スケーリングに設定された最小値を確認して調整します。 |
"no.scale.down.node.minimal.resource.limits.exceeded" |
使用率の低いノードのスケールダウンは、ノードの自動プロビジョニングに設定されているクラスタ全体の最小リソース上限に違反するため、ブロックされます。 | クラスタ全体の最小リソースの上限を確認します。 |
"no.scale.down.node.no.place.to.move.pods" |
使用率の低いノードのスケールダウンは、動作中の Pod をクラスタ内の別のノードに移動できないためブロックされます。 | Pod の再スケジュールが予想される場合は、使用率の低いノード上の Pod のスケジューリング要件を確認し、クラスタ内の別のノードに移動できるかどうかを判断します。このメッセージは、スケジュールできるノードが他に存在しないため、Pod の再スケジュールが期待されない場合に表示されます。 |
"no.scale.down.node.pod.not.backed.by.controller" |
Pod に Kubernetes クラスタ オートスケーラー(ReplicationController、DaemonSet、Job、StatefulSet、ReplicaSet)に認識されるコントローラがないため、Pod は使用率の低いノードのスケールダウンをブロックします。クラスタ オートスケーラーによるノードの削除を防ぐ Pod の種類については、Kubernetes のクラスタ オートスケーラーのよくある質問をご覧ください。 パラメータ: ブロックしている Pod の名前。 |
Pod にアノテーション "cluster-autoscaler.kubernetes.io/safe-to-evict": "true" を設定するか、コントローラ(ReplicationController、DaemonSet、Job、StatefulSet、ReplicaSet など)を定義します。 |
"no.scale.down.node.pod.has.local.storage" |
Pod がローカル ストレージをリクエストしているため、スケールダウンがブロックされています。クラスタ オートスケーラーによるノードの削除を防ぐ Pod の種類については、Kubernetes のクラスタ オートスケーラーのよくある質問をご覧ください。 パラメータ: ブロックしている Pod の名前。 |
Pod のローカル ストレージ データが重要でない場合は、Pod のアノテーション "cluster-autoscaler.kubernetes.io/safe-to-evict": "true" を設定します。 |
"no.scale.down.node.pod.not.safe.to.evict.annotation" |
Pod に「安全でない削除」アノテーションがあるため、スケールダウンがブロックされています。詳細については、Kubernetes クラスタ オートスケーラーのよくある質問をご覧ください。
パラメータ: ブロックしている Pod の名前。 |
Pod を安全にエビクションできる場合は、アノテーションを "cluster-autoscaler.kubernetes.io/safe-to-evict": "true" に更新します。 |
"no.scale.down.node.pod.kube.system.unmovable" |
Pod が非 DaemonSet で、ミラーリングのない、kube-system Namespace に PodDisruptionBudget のない Pod であるため、スケールダウンがブロックされています。パラメータ: ブロックしている Pod の名前。 |
Kubernetes クラスタ オートスケーラーのよくある質問の手順に沿って、PodDisruptionBudget を設定して、クラスタ オートスケーラーが kube-system Namespace で Pod を移動できるようにします。 |
"no.scale.down.node.pod.not.enough.pdb" |
Pod に十分な PodDisruptionBudget が残っていないため、スケールダウンがブロックされています。詳細については、Kubernetes クラスタ オートスケーラーのよくある質問をご覧ください。パラメータ: ブロックしている Pod の名前。 |
Pod の PodDisruptionBudget を確認して、PodDisruptionBudget のベスト プラクティスをご覧ください。アプリケーションをスケーリングするか、PodDisruptionBudget を変更して使用できない Pod が増えるようにすると、メッセージを解決できることがあります。 |
"no.scale.down.node.pod.controller.not.found" |
Pod のコントローラ(Deployment や ReplicaSet など)が見つからないため、スケールダウンがブロックされています。 | ログを確認して、コントローラが削除された後に Pod を動作したままにしているアクションを特定します。この問題を解決するために、Pod を手動で削除できます。 |
"no.scale.down.node.pod.unexpected.error" |
予期しないエラー状態の Pod があるため、使用率の低いノードのスケールダウンはブロックされます。 | さらに詳しく調査する場合は、GCP サポートに問い合わせてください。 |