고급 문제 해결: Kubernetes 로그, 이벤트 및 메트릭 심층 분석
Kubernetes는 타의 추종을 불허하는 확장성과 복원력을 제공하며 애플리케이션 배포 및 관리 방식을 혁신했습니다. 하지만 분산 시스템의 복잡성은 문제 해결을 어려운 작업으로 만들 수도 있습니다. 파드가 충돌하거나, 배포가 확장되지 않거나, 애플리케이션이 응답하지 않을 때, 어디를 봐야 하고 사용 가능한 데이터를 어떻게 해석해야 하는지를 아는 것이 가장 중요합니다.
이 글에서는 Kubernetes 관찰 가능성 및 고급 문제 해결의 세 가지 기둥인 로그, 이벤트 및 메트릭에 대해 심층적으로 다룹니다. 이러한 진단 도구를 숙달하면 복잡한 문제를 진단할 뿐만 아니라 클러스터의 상태를 사전에 모니터링하고, 문제를 예측하며, 컨테이너화된 애플리케이션의 원활한 작동을 보장할 수 있습니다. 실용적인 명령어를 살펴보고, 일반적인 출력을 해석하며, 가장 파악하기 어려운 문제의 근본 원인을 정확히 찾아내기 위해 정보를 상관시키는 전략에 대해 논의할 것입니다.
Kubernetes 로그: 디버깅의 기초
로그는 애플리케이션이나 시스템 프로세스가 수행하는 작업에 대한 자세한 기록입니다. Kubernetes에서 로그는 파드 내에서 실행되는 컨테이너에 의해 생성됩니다. 애플리케이션이 예상대로 작동하지 않을 때 종종 가장 먼저 확인해야 할 곳입니다.
컨테이너 로그 액세스
kubectl logs 명령어는 파드에서 로그를 검색하는 주요 도구입니다. 이 명령어는 다용도이며 여러 유용한 옵션을 제공합니다.
-
파드의 단일 컨테이너에서 로그 가져오기:
bash kubectl logs <pod-name>
파드에 컨테이너가 하나만 있는 경우 이 명령어가 직접 작동합니다. -
멀티 컨테이너 파드의 특정 컨테이너에서 로그 가져오기:
bash kubectl logs <pod-name> -c <container-name> -
충돌한 컨테이너의 이전 인스턴스에서 로그 보기:
컨테이너가 오류로 인해 다시 시작된 경우--previous플래그를 사용하여 다시 시작하기 전의 로그를 볼 수 있습니다.
bash kubectl logs <pod-name> --previous -
실시간으로 로그 추적:
tail -f와 유사하게-f(또는--follow) 플래그를 사용하면 새 로그 항목이 생성될 때 스트리밍할 수 있어 실시간 문제 디버깅에 매우 유용합니다.
bash kubectl logs -f <pod-name> -c <container-name> -
시간별 로그 필터링:
마지막 N개의 줄을 검색할 (--tail) 또는 특정 기간의 로그를 검색할 (--since) 수 있습니다.
bash kubectl logs <pod-name> --tail=100 # 마지막 100줄 kubectl logs <pod-name> --since=1h # 지난 1시간 동안의 로그
중앙 집중식 로깅 솔루션
kubectl logs는 즉각적인 디버깅에는 훌륭하지만, 대규모 장기 로그 관리에 실용적이지는 않습니다. 프로덕션 환경에서는 중앙 집중식 로깅 솔루션이 필수적입니다. 이러한 솔루션은 일반적으로 다음을 포함합니다.
- 로그 에이전트: 모든 파드의 로그를 수집하기 위해 각 노드에서 에이전트(예: Fluentd, Fluent Bit, Filebeat)를 실행합니다.
- 로그 저장 및 인덱싱: 중앙 저장소(예: Elasticsearch, Loki, Splunk)에 로그를 저장합니다.
- 로그 시각화 및 분석: 로그를 검색, 필터링 및 시각화하는 인터페이스를 제공합니다(예: Kibana, Grafana, Splunk UI).
로깅 모범 사례
- 구조화된 로깅: 중앙 집중식 로깅 시스템에서 쉽게 구문 분석하고 쿼리할 수 있도록 로그를 구조화된 형식(예: JSON)으로 출력합니다.
- 적절한 로그 수준: 메시지를 분류하고 상세도를 제어하기 위해 다양한 로그 수준(DEBUG, INFO, WARN, ERROR, FATAL)을 사용합니다.
- 민감한 정보 피하기: 암호, PII와 같은 민감한 데이터를 직접 로깅하지 마십시오.
Kubernetes 이벤트: 클러스터의 이야기꾼
Kubernetes 이벤트는 클러스터 내에서 발생하는 상태 변경 및 작업에 대한 기록입니다. 이는 Kubernetes 자체가 원하는 상태에 대응하여 수행하는 작업(또는 수행하지 못하는 작업)에 대한 중요한 통찰력을 제공합니다. 이벤트는 파드가 예약되지 않는 이유, 이미지를 가져오지 못하는 이유 또는 볼륨을 마운트하지 못하는 이유를 이해하는 데 매우 유용합니다.
Kubernetes 이벤트 액세스
-
클러스터 전체 이벤트:
bash kubectl get events
이 명령은 현재 네임스페이스의 모든 최근 이벤트를 보여줍니다. 전체 클러스터의 이벤트를 보려면--all-namespaces를 추가할 수 있습니다.일반적인 이벤트 출력은 다음과 같습니다.
```
LAST SEEN TYPE REASON OBJECT MESSAGE
3m21s Normal Scheduled pod/my-app-789c6f66-abcde Successfully assigned default/my-app-789c6f66-abcde to node01
3m20s Normal Pulling pod/my-app-789c6f66-abcde Pulling image "