このページでは、次の状況で AlloyDB Omni for Kubernetes の問題を解決する方法について説明します。
- Kubernetes にクラッシュループが発生しているデータベース クラスタがあり、データベースの名前と名前空間、その内部インスタンス、Pod がわかっている。
- データベース Pod のファイルにアクセスする必要があるが、クラッシュ ループによりアクセスできない。
クラッシュループが発生しているデータベース Pod とは、繰り返し起動してはクラッシュし、Kubernetes によって自動的に再起動される Pod です。根本的な問題が解決するまでこのサイクルが無期限に続きます。このプロセス中、データベースが使用できなくなり、不安定になります。
始める前に
このドキュメントのトラブルシューティング ガイダンスに従う前に、次の解決策を試してください。
- 高可用性(HA)が利用可能な場合は、フェイルオーバーをトリガーします。HA では、同期スタンバイ インスタンスがプライマリ インスタンスに置き換わる準備ができています。
- バックアップがある場合は、バックアップから復元します。このアプローチは自動化されており、エラーが発生しにくくなっています。
クラッシュループが発生しているデータベース Pod のファイルにアクセスできない
説明: Kubernetes クラスタ内のデータベース Pod が CrashLoopBackOff 状態になります。この状態では、kubectl exec を使用してデータベース コンテナのデバッグ用ファイル システムにアクセスすることはできません。
推奨される解決策: この問題を解決するには、Pod の StatefulSet をパッチ適用してコンテナのコマンドをオーバーライドし、クラッシュ ループを一時的に停止します。実行する前に、フェイルオーバーのトリガーやバックアップからの復元(バックアップがある場合)など、より簡単な代替手段を検討してください。
Pod にアクセスする手順は次のとおりです。
関連するすべてのユーザー向け AlloyDB Omni リソースを一時停止して、復元プロセスに影響しないようにします。
AlloyDB Omni Kubernetes カスタム リソース定義をすべて一覧表示します。
kubectl get crd | grep alloydbomni.dbadminデータベース クラスタのリソースのリストを確認します。後で再開できるように、一時停止したリソースのリストを保存します。少なくとも、
dbclusters.alloydbomni.dbadmin.googリソースを一時停止する必要があります。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: 一時停止するリソースの名前。
クラッシュループが発生している Pod を管理する内部インスタンスを一時停止します。
内部インスタンスの名前を確認します。
kubectl get instances.alloydbomni.internal.dbadmin.goog -n NAMESPACE次のように置き換えます。
NAMESPACE: 関心のある名前空間の名前。
インスタンスを一時停止します。
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: 見つかったインスタンスの名前。
Pod がクラッシュループしないようにします。
Pod の
StatefulSetにパッチを適用して、メインコンテナのコマンドをオーバーライドします。この変更により、アプリケーションの起動とクラッシュが停止し、Pod にアクセスできるようになります。クラッシュループが発生している Pod の名前を確認します。
kubectl get pod -n NAMESPACE関心のある名前空間である
NAMESPACEを置き換えます。Pod を所有する
StatefulSetの名前を確認します。kubectl get pod -n NAMESPACE POD_NAME -ojsonpath='{.metadata.ownerReferences[0].name}'次のように置き換えます。
NAMESPACE: 関心のある名前空間の名前。POD_NAME: クラッシュループが発生している Pod の名前。
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の名前。
Pod を削除してパッチを適用します。
kubectl delete pod -n NAMESPACE POD_NAME次のように置き換えます。
NAMESPACE: 関心のある名前空間の名前。POD_NAME: クラッシュループが発生している Pod の名前。
Pod 内のデータベースにアクセスします。
kubectl exec -ti -n NAMESPACE POD_NAME -c database -- bash次のように置き換えます。
NAMESPACE: 関心のある名前空間の名前。POD_NAME: クラッシュループが発生している Pod の名前。
新しい Pod が起動すると、データベース アプリケーションではなく
sleepコマンドが実行されます。これで、Pod のシェルにアクセスできます。すべてのコンポーネントの一時停止を解除します。
調査後、
pauseアノテーションを削除して元の状態に戻します。リソースの一時停止を解除する順序は、一時停止した順序とは逆です。たとえば、DBCluster の一時停止を解除する前に、インスタンスの一時停止を解除します。このアクションにより、リソースが調整され、データベース Pod が元のコマンドで再起動されます。一時停止したリソースごとに、アノテーション名にハイフンを追加してアノテーションを削除します。次の例では、インスタンスからアノテーションを削除します。
kubectl annotate instances.alloydbomni.internal.dbadmin.goog -n NAMESPACE INSTANCE_NAME ctrlfwk.internal.gdc.goog/pause-次のように置き換えます。
NAMESPACE: 関心のある名前空間の名前。INSTANCE_NAME: 前の手順で特定したインスタンスの名前。
最初の手順で一時停止した他のリソースすべてについて、このプロセスを繰り返します。