Cloud Logging으로 과거 데이터 분석 수행

Google Kubernetes Engine(GKE)에서 포드가 실패하거나 서비스가 예상대로 작동하지 않는 경우 문제를 발생시킨 이벤트의 순서를 파악해야 합니다. 현재 상태를 검사하는 것만으로는 근본 원인을 찾을 수 없는 경우가 많으므로 이전 로그 데이터가 매우 중요합니다.

이 페이지를 사용하면 Cloud Logging을 사용하여 GKE 로그를 쿼리하고 분석해 과거 실패(예: 포드가 시작할 수 없는 이유 또는 중요한 배포를 삭제한 사용자)를 조사하는 방법을 알 수 있습니다.

이 정보는 클러스터 전체 문제에 대한 근본 원인 분석을 수행하고 변경사항을 감사하고 시스템 동작 추세를 파악해야 하는 플랫폼 관리자와 운영자에게 중요합니다. 또한 애플리케이션 개발자가 애플리케이션별 오류를 디버깅하고 요청 경로를 추적하고 시간 경과에 따른 GKE 환경에서의 코드 작동 방식을 이해하는 데도 필수적입니다. Google Cloud 콘텐츠에서 Google이 참조하는 일반적인 역할과 예시 태스크에 대한 자세한 내용은 일반 GKE 사용자 역할 및 태스크를 참조하세요.

문제 해결을 위한 주요 로그 유형 이해

문제 해결을 지원하기 위해 Cloud Logging은 GKE 클러스터, 컨테이너화된 앱, 기타Google Cloud 서비스에서 다음과 같은 여러 주요 로그 유형을 자동으로 수집하고 집계합니다.

  • 노드 및 런타임 로그(kubelet, containerd): 기본 노드 서비스의 로그입니다. kubelet는 노드의 모든 포드 수명 주기를 관리하므로 컨테이너 시작, 메모리 부족(OOM) 이벤트, 프로브 실패, 볼륨 마운트 오류와 같은 문제를 해결하는 데 로그가 필수입니다. 이러한 로그는 NotReady 상태인 노드와 같은 노드 수준 문제를 진단하는 데도 중요합니다.

    containerd는 이미지 가져오기를 포함해 컨테이너 수명 주기를 관리하므로 kubelet이 컨테이너를 시작하기 전에 발생하는 문제를 해결하는 데 로그가 중요합니다. containerd 로그는 컨테이너 런타임의 구체적인 활동과 잠재적인 오류를 문서화하므로 GKE에서 노드 수준 문제를 진단하는 데 도움이 됩니다.

  • 앱 로그(stdout, stderr): 컨테이너화된 프로세스의 표준 출력 및 오류 스트림입니다. 이러한 로그는 비정상 종료, 오류 또는 예기치 않은 동작과 같은 앱 관련 문제를 디버깅하는 데 필수입니다.

  • 감사 로그: 이러한 로그는 클러스터에 대한 '누가, 언제, 어디서, 무엇을 했는지'를 알려줍니다. 구성 변경이나 무단 액세스로 인해 발생하는 문제를 진단하는 데 유용한 Kubernetes API 서버에 대한 관리 작업과 API 호출을 추적합니다.

일반적인 문제 해결 시나리오

문제를 식별한 후 이러한 로그를 쿼리하여 무엇이 발생했는지 확인할 수 있습니다. 시작하는 데 도움이 되도록 로그를 검토하면 다음과 같은 문제를 해결할 수 있습니다.

  • 노드 상태가 NotReady이면 노드 로그를 검토합니다. kubeletcontainerd 로그를 사용하여 네트워크 문제나 리소스 제약 조건과 같은 근본 원인을 파악할 수 있는 경우가 많습니다.
  • 새 노드가 프로비저닝과 클러스터 조인에 실패하면 노드의 직렬 포트 로그를 검토합니다. 이러한 로그는 노드의 로깅 에이전트가 완전히 활성화되기 전의 초기 부팅 및 kubelet 시작 활동을 캡처합니다.
  • 이전에 포드가 시작할 수 없는 경우 해당 포드의 앱 로그를 검토하여 비정상 종료 여부를 확인합니다. 로그가 비어 있거나 포드를 예약할 수 없는 경우 감사 로그에서 관련 이벤트를 확인하거나 대상 노드의 노드 로그에서 리소스 압력이나 이미지 가져오기 오류에 대한 단서를 확인합니다.
  • 중요한 배포가 삭제되었는데 이유를 모르겠으면 관리자 활동 감사 로그를 쿼리합니다. 이러한 로그는 삭제 API 호출을 실행한 사용자나 서비스 계정을 식별하는 데 도움이 되므로 명확한 조사 시작점을 제공합니다.

로그에 액세스하는 방법

로그 탐색기를 사용하여 Google Cloud 콘솔에서 GKE 로그를 쿼리하고 보고 분석합니다. 로그 탐색기는 문제를 격리하는 데 도움이 되는 강력한 필터링 옵션을 제공합니다.

로그 탐색기에 액세스하고 이를 사용하려면 다음 단계를 완료합니다.

  1. Google Cloud 콘솔에서 로그 탐색기 페이지로 이동합니다.

    로그 탐색기로 이동

  2. 쿼리 창에 쿼리를 입력합니다. Logging 쿼리 언어를 사용하여 타겟팅된 쿼리를 작성합니다. 다음은 시작하는 데 도움이 되는 몇 가지 일반적인 필터입니다.

    필터 유형 설명 예시 값
    resource.type Kubernetes 리소스의 유형입니다. k8s_cluster, k8s_node, k8s_pod, k8s_container
    log_id 리소스의 로그 스트림입니다. stdout, stderr
    resource.labels.RESOURCE_TYPE.name 특정 이름이 있는 리소스를 필터링합니다.
    RESOURCE_TYPE을 쿼리하려는 리소스의 이름으로 바꿉니다. 예를 들면 namespace 또는 pod입니다.
    example-namespace-name, example-pod-name
    severity 로그 심각도 수준입니다. DEFAULT, INFO, WARNING, ERROR, CRITICAL
    jsonPayload.message=~ 로그 메시지 내 텍스트에 대한 정규 표현식 검색입니다. scale.down.error.failed.to.delete.node.min.size.reached

    예를 들어 특정 포드 문제를 해결하기 위해 오류 로그를 격리할 수 있습니다. 해당 포드의 심각도가 ERROR인 로그만 보려면 다음 쿼리를 사용합니다.

    resource.type="k8s_container"
    resource.labels.pod_name="POD_NAME"
    resource.labels.namespace_name="NAMESPACE_NAME"
    severity=ERROR
    

    다음을 바꿉니다.

    • POD_NAME: 문제가 발생하는 포드의 이름
    • NAMESPACE_NAME: 포드가 있는 네임스페이스. 네임스페이스를 잘 모르겠으면 kubectl get pods 명령어 출력에서 Namespace 열을 검토합니다.

    자세한 예시는 Google Cloud Observability 문서의 Kubernetes 관련 쿼리를 참조하세요.

  3. 쿼리 실행을 클릭합니다.

  4. JSON 페이로드, 메타데이터, 타임스탬프를 포함한 전체 로그 메시지를 보려면 로그 항목을 클릭합니다.

GKE 로그에 대한 자세한 내용은 GKE 로그 정보를 참조하세요.

다음 단계