排解 Kubernetes 版 AlloyDB Omni 中發生 CrashLoopBackOff 錯誤的資料庫 Pod

選取說明文件版本:

本頁說明遇到下列情況時,如何解決 AlloyDB Omni for Kubernetes 的問題:

  • 您在 Kubernetes 中有發生當機迴圈的資料庫叢集,且知道資料庫、內部執行個體和 Pod 的名稱和命名空間。
  • 您需要存取資料庫 Pod 中的檔案,但當機迴圈會阻礙存取。

不斷當機的資料庫 Pod 會重複啟動、當機,然後由 Kubernetes 自動重新啟動。這個循環會無限期持續進行,直到解決根本問題為止。資料庫在這段期間會無法使用,且不穩定。

事前準備

按照本文的疑難排解指南操作前,請先嘗試下列解決方案:

  • 如果高可用性 (HA) 可用,請觸發容錯移轉。有了 HA,同步待命執行個體就能隨時取代主要執行個體。
  • 從備份復原 (如有備份)。這種方法是自動執行,較不容易出錯。

無法存取進入當機迴圈的資料庫 Pod 中的檔案

說明:Kubernetes 叢集中的資料庫 Pod 進入 CrashLoopBackOff 狀態。在這個狀態下,您無法使用 kubectl exec 存取資料庫容器的檔案系統進行偵錯。

建議的修正方式:如要解決這個問題,請暫時停止當機迴圈,方法是修補 Pod 的 StatefulSet,覆寫容器的指令。繼續操作前,請先考慮較簡單的替代方案,例如觸發容錯移轉或從備份還原 (如有)。

如要存取膠囊,請按照下列步驟操作:

  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. 暫停管理 CrashLoopBackOff 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 進入 CrashLoopBackoff 狀態。

    修補 Pod 的 StatefulSet,覆寫主要容器的指令。這項變更會停止啟動及當機的應用程式,讓您存取 Pod。

    1. 確認發生 CrashLoopBackOff 錯誤的 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:發生 CrashLoopBackOff 錯誤的 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_NAMEStatefulSet 的名稱。
    4. 刪除 Pod 即可套用修補程式。

      kubectl delete pod -n NAMESPACE POD_NAME
      

      更改下列內容:

      • NAMESPACE:您感興趣的命名空間名稱。
      • POD_NAME:發生 CrashLoopBackOff 錯誤的 Pod 名稱。
  4. 存取 Pod 中的資料庫。

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

    更改下列內容:

    • NAMESPACE:您感興趣的命名空間名稱。
    • POD_NAME:發生 CrashLoopBackOff 錯誤的 Pod 名稱。

    新的 Pod 啟動後,會執行 sleep 指令,而不是資料庫應用程式。現在可以存取 Pod 的 Shell。

  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. 針對您在第一個步驟中暫停的所有其他資源,重複執行這個程序。