本頁說明遇到下列情況時,如何解決 AlloyDB Omni for Kubernetes 的問題:
- 您在 Kubernetes 中有發生當機迴圈的資料庫叢集,且知道資料庫、內部執行個體和 Pod 的名稱和命名空間。
- 您需要存取資料庫 Pod 中的檔案,但當機迴圈會阻礙存取。
不斷當機的資料庫 Pod 會重複啟動、當機,然後由 Kubernetes 自動重新啟動。這個循環會無限期持續進行,直到解決根本問題為止。資料庫在這段期間會無法使用,且不穩定。
事前準備
按照本文的疑難排解指南操作前,請先嘗試下列解決方案:
- 如果高可用性 (HA) 可用,請觸發容錯移轉。有了 HA,同步待命執行個體就能隨時取代主要執行個體。
- 從備份復原 (如有備份)。這種方法是自動執行,較不容易出錯。
無法存取進入當機迴圈的資料庫 Pod 中的檔案
說明:Kubernetes 叢集中的資料庫 Pod 進入 CrashLoopBackOff 狀態。在這個狀態下,您無法使用 kubectl exec 存取資料庫容器的檔案系統進行偵錯。
建議的修正方式:如要解決這個問題,請暫時停止當機迴圈,方法是修補 Pod 的 StatefulSet,覆寫容器的指令。繼續操作前,請先考慮較簡單的替代方案,例如觸發容錯移轉或從備份還原 (如有)。
如要存取膠囊,請按照下列步驟操作:
暫停所有相關的 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:要暫停的資源名稱。
暫停管理 CrashLoopBackOff 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 進入 CrashLoopBackoff 狀態。
修補 Pod 的
StatefulSet,覆寫主要容器的指令。這項變更會停止啟動及當機的應用程式,讓您存取 Pod。確認發生 CrashLoopBackOff 錯誤的 Pod 名稱。
kubectl get pod -n NAMESPACE將
NAMESPACE替換為您感興趣的命名空間名稱。找出擁有 Pod 的
StatefulSet名稱。kubectl get pod -n NAMESPACE POD_NAME -ojsonpath='{.metadata.ownerReferences[0].name}'更改下列內容:
NAMESPACE:您感興趣的命名空間名稱。POD_NAME:發生 CrashLoopBackOff 錯誤的 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:發生 CrashLoopBackOff 錯誤的 Pod 名稱。
存取 Pod 中的資料庫。
kubectl exec -ti -n NAMESPACE POD_NAME -c database -- bash更改下列內容:
NAMESPACE:您感興趣的命名空間名稱。POD_NAME:發生 CrashLoopBackOff 錯誤的 Pod 名稱。
新的 Pod 啟動後,會執行
sleep指令,而不是資料庫應用程式。現在可以存取 Pod 的 Shell。取消暫停所有元件。
調查完畢後,請移除
pause註解,還原原始狀態。以暫停資源時的相反順序取消暫停資源;例如,先取消暫停執行個體,再取消暫停 DBCluster。這項動作會協調資源,並使用原始指令重新啟動資料庫 Pod。針對暫停的每個資源,在註解名稱後方加上連字號,即可移除註解。以下範例會從執行個體中移除註解:
kubectl annotate instances.alloydbomni.internal.dbadmin.goog -n NAMESPACE INSTANCE_NAME ctrlfwk.internal.gdc.goog/pause-更改下列內容:
NAMESPACE:您感興趣的命名空間名稱。INSTANCE_NAME:您在上一個步驟中找到的執行個體名稱。
針對您在第一個步驟中暫停的所有其他資源,重複執行這個程序。