クラスタのオートスケーラー イベントの表示


Google Kubernetes Engine(GKE)のクラスタ オートスケーラーは、Cloud Logging のログエントリとして使用可能な可視化イベントを発行します。このページでは、GKE クラスタ オートスケーラーが自動スケーリングを行うタイミングと理由について説明します。詳細については、以下のセクションをご覧ください。

可用性の要件

ログに記録されたクラスタ オートスケーラー イベントを表示する機能は、次のクラスタのバージョンで使用できます。

イベントの種類 クラスタのバージョン
statusscaleUpscaleDowneventResult 1.15.4-gke.7 以降
nodePoolCreatednodePoolDeleted 1.15.4-gke.18 以降
noScaleUp 1.16.6-gke.3 以降
noScaleDown 1.16.8-gke.2 以降

オートスケーラーのイベントを表示するには、クラスタで Cloud Operations for GKE を有効にする必要があります。Cloud Operations for GKE が無効になっていると、イベントは作成されません。

イベントの表示

クラスタ オートスケーラーの可視性イベントは、GKE クラスタと同じプロジェクト内の Cloud Logging ログに保存されます。これらのイベントは、Cloud Console の Google Kubernetes Engine ページの通知からでも表示できます。

可視化イベントログの表示

ログを表示するには、次の手順を実施します。

  1. Cloud Console で、Kubernetes クラスタページに移動します。

    Kubernetes クラスタに移動

  2. [クラスタの詳細] ページを表示するクラスタの名前を選択します。

  3. [クラスタの詳細] ページで、[ログ] タブをクリックします。

  4. [ログ] タブで、[オートスケーラー ログ] タブをクリックしてログを表示します。

  5. (省略可)高度なフィルタを適用して結果を絞り込むには、ページの右側にある矢印のボタンをクリックして、ログ エクスプローラでログを表示します。

可視化イベント通知の表示

Google Kubernetes Engine ページで可視化イベント通知を表示するには、次の手順を行います。

  1. Cloud Console で Google Kubernetes Engine ページに移動します。

    Google Kubernetes Engine に移動

  2. 特定のクラスタの [通知] 列を確認して、スケーリングに関連する通知を見つけます。

  3. 通知をクリックすると、詳細情報や推奨される対応、このイベントのログにアクセスできます。

イベントの種類

ログに記録されるイベントはすべて 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)をスケールアップして、クラスタのノードプールのサイズを増やします。

このイベントには、スケールアップされた 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 イベントは、クラスタ オートスケーラーがクラスタをスケールダウンするときに生成されます。このイベントには、削除されるノードと、ノードが削除されたことで削除が必要になる Pod に関する情報が含まれます。

cpuRatio フィールドと memRatio フィールドは、ノードの CPU とメモリの使用率をパーセントで示します。この使用率は、Pod リクエストの合計を割り当て可能なノードで割ったもので、実際の使用率ではありません。

削除される Pod のリストは、任意の 50 個のエントリで切り捨てられます。削除される Pod の実際の数は、evictedPodsTotalCount フィールドで確認できます。

次のログサンプルは 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"
          }
        }
      ]
    }
  }
}

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 イベントの eventIdtriggeringScaleUpId フィールドに含まれます。

次のログサンプルは 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 に対応する新しいノードをプロビジョニングしませんでした。

解決策:

  1. ログ エクスプローラで、イベントの表示セクションの説明にあるように、クラスタ オートスケーラー イベントのロギングの詳細を確認します。
  2. triggeringPods フィールドで目的の Pod を含む scaleUp イベントを検索します。特定の JSON フィールド値によるフィルタリングなど、ログエントリをフィルタリングできます。詳細については、高度なログクエリをご覧ください。

    1. scaleUp イベントと同じ eventId を含む EventResult を見つけます。
    2. errorMsg フィールドで、有効な scaleUp エラー メッセージ一覧を調べます。

    ScaleUp エラーの例: scaleUp イベントの場合、エラーは "scale.up.error.quota.exceeded" であることがわかります。これは、「割り当ての超過により、MIG の一部を増やすことができなかったため、scaleUP イベントが失敗した」ことを示しています。この問題を解決するには、割り当て設定を確認し、超過しそうな設定を増やします。クラスタ オートスケーラーが新しいノードを追加し、Pod がスケジュールされます。

  3. noScaleUp イベントを検索し、次のフィールドを確認します。

    • unhandledPodGroups: Pod(または Pod のコントローラ)に関する情報が含まれます。
    • reason: スケールアップがブロックされる可能性があることを示す代表的な理由を示します。
    • skippedMigs: 一部の MIG がスキップされる可能性がある理由を示します。
  4. noScaleUp イベントが発生する理由として考えられるものについては、次のセクションをご覧ください。

    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 がスケジュールされます。

  5. noScaleUp イベントがない場合は、他のデバッグ方法を使用して問題を解決します。

クラスタがスケールダウンしない

シナリオ: クラスタ内に、過去数日で CPU とメモリの 10% しか使用していないノードがあります。使用率が低いにもかかわらず、クラスタ オートスケーラーが想定どおりにノードを削除しませんでした。

解決策:

  1. ログ エクスプローラで、イベントの表示セクションの説明にあるように、クラスタ オートスケーラー イベントのロギングの詳細を確認します。
  2. nodesToBeRemoved フィールドで目的のノードを含む scaleDown イベントを検索します。特定の JSON フィールド値によるフィルタリングなど、ログエントリをフィルタリングできます。詳細については、高度なログクエリをご覧ください。
    1. scaleDown イベントで、関連する eventId を含む EventResult イベントを検索します。
    2. errorMsg フィールドで、有効な scaleDown エラー メッセージ一覧を調べます。
  3. nodes フィールドで目的のノードを含む noScaleDown イベントを検索します。スケールダウンがブロックされる可能性があることを示す代表的な理由については、reason フィールドをご覧ください。
  4. 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" アノテーションを追加する解決策が見つかります。アノテーションの適用後、クラスタ オートスケーラーはクラスタを正しくスケールダウンします。

  5. 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。

Cloud Console の 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 にコントローラ(Deployment や ReplicaSet など)がないため、使用率の低いノードのスケールダウンがブロックされています。クラスタ オートスケーラーによるノードの削除を防ぐポッドの種類については、Kubernetes クラスタ オートスケーラーのよくある質問をご覧ください。

パラメータ: ブロックしている Pod の名前。

Pod にアノテーション "cluster-autoscaler.kubernetes.io/safe-to-evict": "true" を設定するか、コントローラ(Deployment や ReplicaSet など)を定義します。

"no.scale.down.node.pod.has.local.storage"
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 名前空間で PodDisruptionBudget のない Pod であるため、スケールダウンがブロックされています。

パラメータ: ブロックしている Pod の名前。

Kubernetes クラスタ オートスケーラーのよくある質問の手順に沿って、PodDisruptionBudget を設定して、クラスタ オートスケーラーが kube-system 名前空間で 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 サポートに問い合わせてください

次のステップ