AlloyDB Omni for Kubernetes でクラッシュループが発生しているデータベース Pod のトラブルシューティングを行う

ドキュメントのバージョンを選択してください。

このページでは、次の状況で AlloyDB Omni for Kubernetes の問題を解決する方法について説明します。

  • Kubernetes にクラッシュループが発生しているデータベース クラスタがあり、データベースの名前と名前空間、その内部インスタンス、Pod がわかっている。
  • データベース Pod のファイルにアクセスする必要があるが、クラッシュ ループによりアクセスできない。

クラッシュループが発生しているデータベース Pod とは、繰り返し起動してはクラッシュし、Kubernetes によって自動的に再起動される Pod です。根本的な問題が解決するまでこのサイクルが無期限に続きます。このプロセス中、データベースが使用できなくなり、不安定になります。

始める前に

このドキュメントのトラブルシューティング ガイダンスに従う前に、次の解決策を試してください。

  • 高可用性(HA)が利用可能な場合は、フェイルオーバーをトリガーします。HA では、同期スタンバイ インスタンスがプライマリ インスタンスに置き換わる準備ができています。
  • バックアップがある場合は、バックアップから復元します。このアプローチは自動化されており、エラーが発生しにくくなっています。

クラッシュループが発生しているデータベース Pod のファイルにアクセスできない

説明: Kubernetes クラスタ内のデータベース Pod が CrashLoopBackOff 状態になります。この状態では、kubectl exec を使用してデータベース コンテナのデバッグ用ファイル システムにアクセスすることはできません。

推奨される解決策: この問題を解決するには、Pod の StatefulSet をパッチ適用してコンテナのコマンドをオーバーライドし、クラッシュ ループを一時的に停止します。実行する前に、フェイルオーバーのトリガーやバックアップからの復元(バックアップがある場合)など、より簡単な代替手段を検討してください。

Pod にアクセスする手順は次のとおりです。

  1. 関連するすべてのユーザー向け AlloyDB Omni リソースを一時停止して、復元プロセスに影響しないようにします。

    1. AlloyDB Omni Kubernetes カスタム リソース定義をすべて一覧表示します。

      kubectl get crd | grep alloydbomni.dbadmin
      
    2. データベース クラスタのリソースのリストを確認します。後で再開できるように、一時停止したリソースのリストを保存します。少なくとも、dbclusters.alloydbomni.dbadmin.goog リソースを一時停止する必要があります。

    3. ctrlfwk.internal.gdc.goog/pause アノテーションを追加して、各リソースを個別に一時停止します。

      kubectl annotate RESOURCE_TYPE -n NAMESPACE RESOURCE_NAME ctrlfwk.internal.gdc.goog/pause=true
      

      次のように置き換えます。

      • RESOURCE_TYPE: 一時停止するリソースのタイプ(例: dbclusters.alloydbomni.dbadmin.goog)。
      • NAMESPACE: データベース クラスタの名前空間。
      • RESOURCE_NAME: 一時停止するリソースの名前。
  2. クラッシュループが発生している Pod を管理する内部インスタンスを一時停止します。

    1. 内部インスタンスの名前を確認します。

      kubectl get instances.alloydbomni.internal.dbadmin.goog -n NAMESPACE
      

      次のように置き換えます。

      • NAMESPACE: 関心のある名前空間の名前。
    2. インスタンスを一時停止します。ctrlfwk.internal.gdc.goog/pause=true アノテーションは、リソースの管理を一時停止するように AlloyDB Omni コントローラに指示します。これにより、基盤となる StatefulSet のパッチ適用など、トラブルシューティングの手順を手動で実行している間、コントローラがリソースを自動的に調整または変更することを防ぐことができます。

      kubectl annotate instances.alloydbomni.internal.dbadmin.goog -n NAMESPACE INSTANCE_NAME ctrlfwk.internal.gdc.goog/pause=true
      

      次のように置き換えます。

      • NAMESPACE: 関心のある名前空間の名前。
      • INSTANCE_NAME: 見つかったインスタンスの名前。
  3. Pod がクラッシュループしないようにします。

    Pod の StatefulSet にパッチを適用して、メインコンテナのコマンドをオーバーライドします。この変更により、アプリケーションの起動とクラッシュが停止し、Pod にアクセスできるようになります。

    1. クラッシュループが発生している Pod の名前を確認します。

      kubectl get pod -n NAMESPACE
      

      関心のある名前空間である NAMESPACE を置き換えます。

    2. Pod を所有する StatefulSet の名前を確認します。

      kubectl get pod -n NAMESPACE POD_NAME -ojsonpath='{.metadata.ownerReferences[0].name}'
      

      次のように置き換えます。

      • NAMESPACE: 関心のある名前空間の名前。
      • POD_NAME: クラッシュループが発生している Pod の名前。
    3. StatefulSet にパッチを適用して、データベース コンテナのコマンドを sleep infinity に置き換えます。

      kubectl patch statefulset STATEFULSET_NAME -n NAMESPACE --type='strategic' -p '
      {
        "spec": {
          "template": {
            "spec": {
              "containers": [
                {
                  "name": "database",
                  "command": ["sleep"],
                  "args": ["infinity"],
                  "livenessProbe": null,
                  "startupProbe": null
                }
              ]
            }
          }
        }
      }
      '
      

      次のように置き換えます。

      • NAMESPACE: 関心のある名前空間の名前。
      • STATEFULSET_NAME: StatefulSet の名前。
    4. Pod を削除してパッチを適用します。

      kubectl delete pod -n NAMESPACE POD_NAME
      

      次のように置き換えます。

      • NAMESPACE: 関心のある名前空間の名前。
      • POD_NAME: クラッシュループが発生している Pod の名前。
  4. Pod 内のデータベースにアクセスします。

    kubectl exec -ti -n NAMESPACE POD_NAME -c database -- bash
    

    次のように置き換えます。

    • NAMESPACE: 関心のある名前空間の名前。
    • POD_NAME: クラッシュループが発生している Pod の名前。

    新しい Pod が起動すると、データベース アプリケーションではなく sleep コマンドが実行されます。これで、Pod のシェルにアクセスできます。

  5. すべてのコンポーネントの一時停止を解除します。

    調査後、pause アノテーションを削除して元の状態に戻します。リソースの一時停止を解除する順序は、一時停止した順序とは逆です。たとえば、DBCluster の一時停止を解除する前に、インスタンスの一時停止を解除します。このアクションにより、リソースが調整され、データベース Pod が元のコマンドで再起動されます。

    1. 一時停止したリソースごとに、アノテーション名にハイフンを追加してアノテーションを削除します。次の例では、インスタンスからアノテーションを削除します。

      kubectl annotate instances.alloydbomni.internal.dbadmin.goog -n NAMESPACE INSTANCE_NAME ctrlfwk.internal.gdc.goog/pause-
      

      次のように置き換えます。

      • NAMESPACE: 関心のある名前空間の名前。
      • INSTANCE_NAME: 前の手順で特定したインスタンスの名前。
    2. 最初の手順で一時停止した他のリソースすべてについて、このプロセスを繰り返します。