컨테이너 오케스트레이터를 사용하여 AlloyDB Omni에서 비정상 종료 루프 데이터베이스 포드 문제 해결

문서 버전을 선택합니다.

이 페이지에서는 다음 상황이 발생할 때 Kubernetes용 AlloyDB Omni 관련 문제를 해결하는 방법을 설명합니다.

  • Kubernetes에 비정상 종료 루프 데이터베이스 클러스터가 있고 개발자는 데이터베이스의 이름과 네임스페이스, 내부 인스턴스, 해당 포드를 알고 있습니다.
  • 데이터베이스 포드의 파일에 액세스해야 하지만 비정상 종료 루프로 인해 액세스할 수 없습니다.

비정상 종료 루프 데이터베이스 포드는 Kubernetes에 의해 반복적으로 시작되고 비정상 종료된 후 자동으로 다시 시작되는 포드입니다. 이 주기는 근본적인 문제가 해결될 때까지 무기한 계속됩니다. 이 프로세스 중에 데이터베이스는 사용 불가능해지고 불안정해집니다.

시작하기 전에

이 문서의 문제 해결 안내를 따르기 전에 다음 해결책을 시도해 봅니다.

  • 고가용성(HA)을 사용할 수 있는 경우 장애 조치를 트리거합니다. HA를 사용하면 동기 대기 인스턴스가 기본 인스턴스를 대체할 수 있습니다.
  • 백업을 사용할 수 있으면 백업에서 복구합니다. 이 방법은 자동화되어 있으며 오류 발생 가능성이 적습니다.

비정상 종료 루프 데이터베이스 포드의 파일에 액세스할 수 없음

설명: Kubernetes 클러스터의 데이터베이스 포드가 CrashLoopBackOff 상태로 전환됩니다. 이 상태에서는 kubectl exec를 사용하여 데이터베이스 컨테이너의 파일 시스템에 액세스해 디버깅할 수 없습니다.

권장 해결 방법: 이 문제를 해결하려면 포드의 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. 비정상 종료 루프 포드를 관리하는 내부 인스턴스를 일시중지합니다.

    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. 포드의 비정상 종료 루프를 방지합니다.

    포드의 StatefulSet에 패치를 적용하여 기본 컨테이너 명령어를 재정의합니다. 이 변경사항은 애플리케이션 시작 및 비정상 종료를 중지하며 이를 통해 포드에 액세스할 수 있습니다.

    1. 비정상 종료 루프 포드 이름을 확인합니다.

      kubectl get pod -n NAMESPACE
      

      NAMESPACE를 관심 있는 네임스페이스의 이름으로 바꿉니다.

    2. 포드를 소유하는 StatefulSet의 이름을 찾습니다.

      kubectl get pod -n NAMESPACE POD_NAME -ojsonpath='{.metadata.ownerReferences[0].name}'
      

      다음을 바꿉니다.

      • NAMESPACE: 관심 있는 네임스페이스의 이름
      • POD_NAME: 비정상 종료 루프 포드 이름
    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_NAME: StatefulSet 이름
    4. 포드를 삭제하여 패치를 적용합니다.

      kubectl delete pod -n NAMESPACE POD_NAME
      

      다음을 바꿉니다.

      • NAMESPACE: 관심 있는 네임스페이스의 이름
      • POD_NAME: 비정상 종료 루프 포드 이름
  4. 포드의 데이터베이스에 액세스합니다.

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

    다음을 바꿉니다.

    • NAMESPACE: 관심 있는 네임스페이스의 이름
    • POD_NAME: 비정상 종료 루프 포드 이름

    새 포드가 시작되면 데이터베이스 애플리케이션 대신 sleep 명령어를 실행합니다. 이제 포드의 셸에 액세스할 수 있습니다.

  5. 모든 구성요소를 재개합니다.

    조사 후 pause 주석을 삭제하여 원래 상태로 복원합니다. 일시중지 실행 순서의 역순으로 리소스를 재개합니다. 예를 들어 DBCluster를 재개하기 전에 인스턴스를 재개합니다. 이 작업은 리소스를 조정하고 원래 명령어로 데이터베이스 포드를 다시 시작합니다.

    1. 일시중지한 각 리소스에서 주석 이름에 하이픈을 추가하여 주석을 삭제합니다. 다음 예시에서는 인스턴스에서 주석을 삭제합니다.

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

      다음을 바꿉니다.

      • NAMESPACE: 관심 있는 네임스페이스의 이름
      • INSTANCE_NAME: 이전 단계에서 찾은 인스턴스의 이름
    2. 첫 번째 단계에서 일시중지한 다른 모든 리소스에 이 프로세스를 반복합니다.