Google Kubernetes Engine (GKE)에서 포드가 실패하거나 서비스가 예상대로 작동하지 않는 경우 문제를 야기한 이벤트의 순서를 파악하는 것이 중요합니다. 현재 상태를 검사하는 것만으로는 근본 원인을 찾을 수 없는 경우가 많으므로 이전 로그 데이터가 매우 중요합니다.
이 페이지를 사용하여 Cloud Logging을 통해 GKE 로그를 쿼리하고 분석하여 과거 실패 (예: 포드가 시작되지 않은 이유 또는 누가 중요한 배포를 삭제했는지)를 조사하는 방법을 알아봅니다.
이 정보는 클러스터 전체 문제에 대한 근본 원인 분석을 실행하고, 변경사항을 감사하고, 시스템 동작 추세를 파악해야 하는 플랫폼 관리자 및 운영자에게 중요합니다. 또한 애플리케이션 개발자가 애플리케이션별 오류를 디버깅하고, 요청 경로를 추적하고, 시간이 지남에 따라 GKE 환경에서 코드가 어떻게 작동하는지 이해하는 데도 필수적입니다. Google Cloud 콘텐츠에서 참조하는 일반적인 역할과 예시 태스크에 대한 자세한 내용은 일반 GKE 사용자 역할 및 태스크를 참고하세요.
문제 해결을 위한 주요 로그 유형 이해하기
문제 해결을 지원하기 위해 Cloud Logging은 GKE 클러스터, 컨테이너화된 앱, 기타Google Cloud 서비스에서 다음과 같은 여러 주요 로그 유형을 자동으로 수집하고 집계합니다.
노드 및 런타임 로그 (
kubelet
,containerd
): 기본 노드 서비스의 로그입니다.kubelet
는 노드의 모든 포드의 수명 주기를 관리하므로 컨테이너 시작, 메모리 부족 (OOM) 이벤트, 프로브 실패, 볼륨 마운트 오류와 같은 문제를 해결하는 데 로그가 필수적입니다. 이러한 로그는NotReady
상태인 노드와 같은 노드 수준 문제를 진단하는 데도 중요합니다.containerd는 이미지를 가져오는 것을 비롯해 컨테이너의 수명 주기를 관리하므로 kubelet이 컨테이너를 시작하기 전에 발생하는 문제를 해결하는 데 로그가 중요합니다. containerd 로그는 컨테이너 런타임의 구체적인 활동과 잠재적인 오류를 문서화하므로 GKE에서 노드 수준 문제를 진단하는 데 도움이 됩니다.
앱 로그 (
stdout
,stderr
): 컨테이너화된 프로세스의 표준 출력 및 오류 스트림입니다. 이러한 로그는 비정상 종료, 오류, 예기치 않은 동작과 같은 앱 관련 문제를 디버깅하는 데 필수적입니다.감사 로그: 이러한 로그는 클러스터에 대해 '누가, 언제, 어디서, 무엇을 했는지'를 알려줍니다. 구성 변경 또는 무단 액세스로 인해 발생하는 문제를 진단하는 데 유용한 Kubernetes API 서버에 대한 관리 작업 및 API 호출을 추적합니다.
일반적인 문제 해결 시나리오
문제를 식별한 후 이러한 로그를 쿼리하여 발생한 상황을 확인할 수 있습니다. 시작하는 데 도움이 되도록 로그를 검토하면 다음 문제를 해결하는 데 도움이 됩니다.
- 노드 상태가
NotReady
이면 노드 로그를 검토합니다.kubelet
및containerd
로그는 네트워크 문제나 리소스 제약과 같은 근본 원인을 자주 보여줍니다. - 새 노드가 프로비저닝되고 클러스터에 참여하지 못하면 노드의 직렬 포트 로그를 검토하세요. 이러한 로그는 노드의 로깅 에이전트가 완전히 활성화되기 전의 초기 부팅 및 kubelet 시작 활동을 캡처합니다.
- 이전에 포드가 시작되지 않은 경우 해당 포드의 앱 로그를 검토하여 비정상 종료가 있는지 확인합니다. 로그가 비어 있거나 포드를 예약할 수 없는 경우 감사 로그에서 관련 이벤트를 확인하거나 타겟 노드의 노드 로그에서 리소스 압력 또는 이미지 가져오기 오류에 관한 단서를 확인합니다.
- 중요한 배포가 삭제되었는데 이유를 모르는 경우 관리자 활동 감사 로그를 쿼리합니다. 이러한 로그는 삭제 API 호출을 실행한 사용자 또는 서비스 계정을 식별하는 데 도움이 되므로 조사를 시작할 명확한 시작점을 제공합니다.
로그에 액세스하는 방법
로그 탐색기를 사용하여 Google Cloud 콘솔에서 GKE 로그를 쿼리, 보기, 분석합니다. 로그 탐색기는 문제를 격리하는 데 도움이 되는 강력한 필터링 옵션을 제공합니다.
로그 탐색기에 액세스하고 사용하려면 다음 단계를 완료하세요.
Google Cloud 콘솔에서 로그 탐색기 페이지로 이동합니다.
쿼리 창에 쿼리를 입력합니다. 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 관련 쿼리를 참고하세요.
쿼리 실행을 클릭합니다.
JSON 페이로드, 메타데이터, 타임스탬프를 비롯한 전체 로그 메시지를 보려면 로그 항목을 클릭합니다.
GKE 로그에 대한 자세한 내용은 GKE 로그 정보를 참고하세요.
다음 단계
Cloud Monitoring으로 사전 모니터링 실행(이 시리즈의 다음 페이지)을 읽어보세요.
문제 해결 시나리오 예에서 이러한 개념이 적용된 것을 확인하세요.
특정 문제 해결에 관한 조언은 GKE 문제 해결 가이드를 참고하세요.
문서에서 문제 해결 방법을 찾을 수 없으면 지원 받기를 참조하여 다음 주제에 대한 조언을 포함한 추가 도움을 요청하세요.
- Cloud Customer Care에 문의하여 지원 케이스를 엽니다.
- StackOverflow에서 질문하고
google-kubernetes-engine
태그를 사용하여 유사한 문제를 검색해 커뮤니티의 지원을 받습니다.#kubernetes-engine
Slack 채널에 가입하여 더 많은 커뮤니티 지원을 받을 수도 있습니다. - 공개 Issue Tracker를 사용하여 버그나 기능 요청을 엽니다.