本页面介绍了在遇到以下情况时,如何解决 AlloyDB Omni for Kubernetes 的问题:
- 您在 Kubernetes 中有一个处于崩溃循环状态的数据库集群,且知道该数据库的名称和命名空间、其内部实例和 Pod。
- 您需要访问数据库 Pod 中的文件,但崩溃循环阻止了访问。
处于崩溃循环状态的数据库 Pod 是指反复启动、崩溃,然后由 Kubernetes 自动重启的 Pod。此循环会无限期地持续下去,直到根本问题得到解决。在此过程中,数据库会变得不可用且不稳定。
准备工作
在按照本文档中的问题排查指导进行操作之前,请尝试以下解决方案:
- 如果高可用性 (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 的 shell 了。解除暂停所有组件。
调查完成后,移除
pause注解,以恢复原始状态。您需要以暂停资源的相反顺序解除暂停资源;例如,先解除暂停实例,然后再解除暂停 DBCluster。 此操作会协调资源并使用其原始命令重启数据库 Pod。对于您暂停的每个资源,请通过在注解名称后附加连字符来移除注解。以下示例从实例中移除了注解:
kubectl annotate instances.alloydbomni.internal.dbadmin.goog -n NAMESPACE INSTANCE_NAME ctrlfwk.internal.gdc.goog/pause-替换以下内容:
NAMESPACE:您感兴趣的命名空间的名称。INSTANCE_NAME:您在上一步中找到的实例的名称。
针对您在第一步中暂停的所有其他资源重复此过程。