이 페이지에서는 다음 상황이 발생할 때 Kubernetes용 AlloyDB Omni 문제를 해결하는 방법을 설명합니다.
- Kubernetes에서 crashlooping 데이터베이스 클러스터가 있고 데이터베이스, 내부 인스턴스, 포드의 이름과 네임스페이스를 알고 있습니다.
- 데이터베이스 포드의 파일에 액세스해야 하지만 비정상 종료 루프로 인해 액세스할 수 없습니다.
crashlooping 데이터베이스 포드는 Kubernetes에 의해 반복적으로 시작되고, 비정상 종료되고, 자동으로 다시 시작되는 포드입니다. 이 주기는 기본 문제가 해결될 때까지 무기한 계속됩니다. 이 과정에서 데이터베이스를 사용할 수 없게 되고 불안정해집니다.
시작하기 전에
이 문서의 문제 해결 안내를 따르기 전에 다음 해결 방법을 시도해 보세요.
- 고가용성 (HA)을 사용할 수 있는 경우 장애 조치를 트리거합니다. HA를 사용하면 동기식 대기 인스턴스가 기본 인스턴스를 대체할 준비가 됩니다.
- 백업이 있는 경우 백업에서 복구합니다. 이 접근 방식은 자동화되어 있으며 오류가 발생할 가능성이 적습니다.
비정상 종료가 반복되는 데이터베이스 포드에서 파일에 액세스할 수 없음
설명: Kubernetes 클러스터의 데이터베이스 포드가 CrashLoopBackOff 상태가 됩니다. 이 상태에서는 kubectl exec를 사용하여 디버깅을 위해 데이터베이스 컨테이너의 파일 시스템에 액세스할 수 없습니다.
권장 해결 방법: 이 문제를 해결하려면 포드의 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: 일시중지할 리소스의 이름입니다.
비정상 종료 루프 포드를 관리하는 내부 인스턴스를 일시중지합니다.
내부 인스턴스의 이름을 찾습니다.
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: 검색된 인스턴스의 이름입니다.
포드가 비정상 종료되는 것을 방지합니다.
기본 컨테이너의 명령어를 재정의하도록 포드의
StatefulSet를 패치합니다. 이 변경사항은 애플리케이션이 시작되고 비정상 종료되는 것을 방지하여 포드에 액세스할 수 있도록 합니다.비정상 종료가 반복되는 포드의 이름을 확인합니다.
kubectl get pod -n NAMESPACENAMESPACE를 관심 있는 네임스페이스의 이름으로 바꿉니다.포드를 소유하는
StatefulSet의 이름을 찾습니다.kubectl get pod -n NAMESPACE POD_NAME -ojsonpath='{.metadata.ownerReferences[0].name}'다음을 바꿉니다.
NAMESPACE: 관심 있는 네임스페이스의 이름입니다.POD_NAME: crashlooping 포드의 이름입니다.
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의 이름입니다.
포드를 삭제하여 패치를 적용합니다.
kubectl delete pod -n NAMESPACE POD_NAME다음을 바꿉니다.
NAMESPACE: 관심 있는 네임스페이스의 이름입니다.POD_NAME: crashlooping 포드의 이름입니다.
포드에서 데이터베이스에 액세스합니다.
kubectl exec -ti -n NAMESPACE POD_NAME -c database -- bash다음을 바꿉니다.
NAMESPACE: 관심 있는 네임스페이스의 이름입니다.POD_NAME: crashlooping 포드의 이름입니다.
새 포드가 시작되면 데이터베이스 애플리케이션 대신
sleep명령어를 실행합니다. 이제 포드의 셸에 액세스할 수 있습니다.모든 구성요소의 일시중지를 해제합니다.
조사 후
pause주석을 삭제하여 원래 상태를 복원합니다. 리소스의 일시중지를 해제할 때는 일시중지한 순서의 역순으로 합니다. 예를 들어 DBCluster의 일시중지를 해제하기 전에 인스턴스의 일시중지를 해제합니다. 이 작업은 리소스를 조정하고 원래 명령으로 데이터베이스 포드를 다시 시작합니다.일시중지한 각 리소스에 대해 주석 이름에 하이픈을 추가하여 주석을 삭제합니다. 다음 예시에서는 인스턴스에서 주석을 삭제합니다.
kubectl annotate instances.alloydbomni.internal.dbadmin.goog -n NAMESPACE INSTANCE_NAME ctrlfwk.internal.gdc.goog/pause-다음을 바꿉니다.
NAMESPACE: 관심 있는 네임스페이스의 이름입니다.INSTANCE_NAME: 이전 단계에서 찾은 인스턴스의 이름입니다.
첫 번째 단계에서 일시중지한 다른 모든 리소스에 대해 이 프로세스를 반복합니다.