Halaman ini menjelaskan cara menyelesaikan masalah terkait AlloyDB Omni untuk Kubernetes saat Anda mengalami situasi berikut:
- Anda memiliki cluster database yang mengalami crashloop di Kubernetes, dan Anda mengetahui nama dan namespace database, instance internalnya, dan pod.
- Anda perlu mengakses file di pod database, tetapi loop error mencegah akses.
Pod database yang crashlooping adalah pod yang berulang kali dimulai, error, dan kemudian dimulai ulang secara otomatis oleh Kubernetes. Siklus ini berlanjut tanpa batas hingga masalah yang mendasarinya teratasi. Database menjadi tidak tersedia dan tidak stabil selama proses ini.
Sebelum memulai
Sebelum Anda mengikuti panduan pemecahan masalah dalam dokumen ini, coba solusi berikut:
- Jika ketersediaan tinggi (HA) tersedia, picu failover. Dengan HA, instance standby sinkron siap menggantikan instance utama.
- Pulihkan dari cadangan, jika tersedia. Pendekatan ini otomatis dan lebih sedikit rentan terhadap error.
Tidak dapat mengakses file di pod database yang mengalami crashloop
Deskripsi: Pod database di cluster Kubernetes Anda memasuki status
CrashLoopBackOff. Status ini mencegah Anda menggunakan kubectl exec untuk mengakses sistem file penampung database untuk proses debug.
Perbaikan yang direkomendasikan: Untuk mengatasi masalah ini, hentikan sementara loop error dengan
membuat patch StatefulSet pod untuk menggantikan perintah penampung. Sebelum
melanjutkan, pertimbangkan alternatif yang lebih sederhana, seperti memicu failover atau
memulihkan dari cadangan, jika tersedia.
Untuk mengakses pod, ikuti langkah-langkah berikut:
Jeda semua resource AlloyDB Omni yang terkait dan ditampilkan kepada pengguna untuk mencegahnya mengganggu proses pemulihan.
Mencantumkan semua definisi resource kustom Kubernetes AlloyDB Omni:
kubectl get crd | grep alloydbomni.dbadminTinjau daftar resource untuk cluster database Anda. Simpan daftar resource yang Anda jeda agar Anda dapat melanjutkan jedanya nanti. Minimal, Anda harus menjeda resource
dbclusters.alloydbomni.dbadmin.goog.Jeda setiap resource secara terpisah dengan menambahkan anotasi
ctrlfwk.internal.gdc.goog/pausekubectl annotate RESOURCE_TYPE -n NAMESPACE RESOURCE_NAME ctrlfwk.internal.gdc.goog/pause=trueGanti kode berikut:
RESOURCE_TYPE: jenis resource yang akan dijeda, misalnya,dbclusters.alloydbomni.dbadmin.goog.NAMESPACE: namespace cluster database.RESOURCE_NAME: nama resource yang akan dijeda.
Jeda instance internal yang mengelola pod crashlooping.
Temukan nama instance internal.
kubectl get instances.alloydbomni.internal.dbadmin.goog -n NAMESPACEGanti kode berikut:
NAMESPACE: nama namespace yang Anda minati.
Jeda instance. Anotasi
ctrlfwk.internal.gdc.goog/pause=truememberi tahu pengontrol AlloyDB Omni untuk menjeda pengelolaan resource. Hal ini mencegah pengontrol merekonsiliasi atau mengubah resource secara otomatis saat Anda melakukan langkah-langkah pemecahan masalah secara manual, seperti menerapkan patch padaStatefulSetyang mendasarinya.kubectl annotate instances.alloydbomni.internal.dbadmin.goog -n NAMESPACE INSTANCE_NAME ctrlfwk.internal.gdc.goog/pause=trueGanti kode berikut:
NAMESPACE: nama namespace yang Anda minati.INSTANCE_NAME: nama instance yang Anda temukan.
Mencegah pod mengalami crashloop.
Patch
StatefulSetpod untuk mengganti perintah container utama. Perubahan ini menghentikan aplikasi agar tidak dimulai dan mengalami error, sehingga Anda dapat mengakses pod.Konfirmasi nama pod yang mengalami crashloop.
kubectl get pod -n NAMESPACEGanti
NAMESPACE, yang merupakan nama namespace yang Anda minati.Temukan nama
StatefulSetyang memiliki pod.kubectl get pod -n NAMESPACE POD_NAME -ojsonpath='{.metadata.ownerReferences[0].name}'Ganti kode berikut:
NAMESPACE: nama namespace yang Anda minati.POD_NAME: nama pod yang mengalami crashlooping.
Patch
StatefulSetuntuk mengganti perintah penampung database dengansleep 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 } ] } } } } 'Ganti kode berikut:
NAMESPACE: nama namespace yang Anda minati.STATEFULSET_NAME: namaStatefulSet.
Hapus pod untuk menerapkan patch.
kubectl delete pod -n NAMESPACE POD_NAMEGanti kode berikut:
NAMESPACE: nama namespace yang Anda minati.POD_NAME: nama pod yang mengalami crashlooping.
Akses database di pod.
kubectl exec -ti -n NAMESPACE POD_NAME -c database -- bashGanti kode berikut:
NAMESPACE: nama namespace yang Anda minati.POD_NAME: nama pod yang mengalami crashlooping.
Setelah pod baru dimulai, pod tersebut menjalankan perintah
sleep, bukan aplikasi database. Sekarang Anda dapat mengakses shell pod.Lanjutkan semua komponen.
Setelah menyelidiki, pulihkan status asli dengan menghapus anotasi
pause. Anda membatalkan jeda resource dalam urutan terbalik dari saat menjedanya; misalnya, batalkan jeda instance sebelum Anda membatalkan jeda DBCluster. Tindakan ini akan menyelaraskan resource dan memulai ulang pod database dengan perintah aslinya.Untuk setiap resource yang Anda jeda, hapus anotasi dengan menambahkan tanda hubung ke nama anotasi. Contoh berikut menghapus anotasi dari instance:
kubectl annotate instances.alloydbomni.internal.dbadmin.goog -n NAMESPACE INSTANCE_NAME ctrlfwk.internal.gdc.goog/pause-Ganti kode berikut:
NAMESPACE: nama namespace yang Anda minati.INSTANCE_NAME: nama instance yang Anda temukan pada langkah sebelumnya.
Ulangi proses ini untuk semua resource lain yang Anda jeda pada langkah pertama.