Memecahkan masalah pod database yang mengalami crashloop di AlloyDB Omni untuk Kubernetes

Pilih versi dokumentasi:

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:

  1. Jeda semua resource AlloyDB Omni yang terkait dan ditampilkan kepada pengguna untuk mencegahnya mengganggu proses pemulihan.

    1. Mencantumkan semua definisi resource kustom Kubernetes AlloyDB Omni:

      kubectl get crd | grep alloydbomni.dbadmin
      
    2. Tinjau 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.

    3. Jeda setiap resource secara terpisah dengan menambahkan anotasi ctrlfwk.internal.gdc.goog/pause

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

      Ganti 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.
  2. Jeda instance internal yang mengelola pod crashlooping.

    1. Temukan nama instance internal.

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

      Ganti kode berikut:

      • NAMESPACE: nama namespace yang Anda minati.
    2. Jeda instance. Anotasi ctrlfwk.internal.gdc.goog/pause=true memberi 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 pada StatefulSet yang mendasarinya.

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

      Ganti kode berikut:

      • NAMESPACE: nama namespace yang Anda minati.
      • INSTANCE_NAME: nama instance yang Anda temukan.
  3. Mencegah pod mengalami crashloop.

    Patch StatefulSet pod untuk mengganti perintah container utama. Perubahan ini menghentikan aplikasi agar tidak dimulai dan mengalami error, sehingga Anda dapat mengakses pod.

    1. Konfirmasi nama pod yang mengalami crashloop.

      kubectl get pod -n NAMESPACE
      

      Ganti NAMESPACE, yang merupakan nama namespace yang Anda minati.

    2. Temukan nama StatefulSet yang 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.
    3. Patch StatefulSet untuk mengganti perintah penampung database dengan 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
                }
              ]
            }
          }
        }
      }
      '
      

      Ganti kode berikut:

      • NAMESPACE: nama namespace yang Anda minati.
      • STATEFULSET_NAME: nama StatefulSet.
    4. Hapus pod untuk menerapkan patch.

      kubectl delete pod -n NAMESPACE POD_NAME
      

      Ganti kode berikut:

      • NAMESPACE: nama namespace yang Anda minati.
      • POD_NAME: nama pod yang mengalami crashlooping.
  4. Akses database di pod.

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

    Ganti 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.

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

    1. 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.
    2. Ulangi proses ini untuk semua resource lain yang Anda jeda pada langkah pertama.