Azure Kubernetes Service, application logging 뭘 써야할까? - 2

눕눕·2022년 3월 15일
0

AKS logging

목록 보기
2/3

어떤 로그들이 저장될까?

AKS에서 container 안에서 발생되는 로그들은 어떤 로그들을 가져오게 될까? 라는 부분이 가장 먼저 궁금해졌었다.

우선 결론부터 말하자면, container 안에서 발생되는 stdout, stderr 로그들이 AKS node에 저장이 되어진다.

stdout, stderr 들은, 각 프레임워크들도 뱉어 내고, 우리가 짜는 코드들 또한 뱉어낼 수 있다.
간단한 예로, python의 경우, 5가지 레벨(DEBUG, INFO, WARNING, ERROR, CRITICAL)을 로그관련하여 제공하는데, default로는 WARNING 부터 stdout으로 나가게 된다. (default에서는 DEBUG나 INFO로 찍히는 부분은 stdout 스트림으로 나가지 않는다.)

그럼 stdout, stderr로 각종 프레임워크들이나, 언어에서 뱉어내는건 알겠는데,
stdout과 stderr 는 뭐지??

stdin, stdout, stderr에 대해 한번씩은 다 들어봤을 수도 있고, 생소할 수도 있다.
나도 이번 로그 관련해서 찾으며, 처음 접하게 되었었다.

stdin, stdout, stderr 이 뭐지?

일반적으로 unix 환경에서 (unix 영향을 강하게 받은 linux도...) 동작하는 프로그램들은 3가지의 스트림이 자동으로 열리는데, 이것들이 stdin, stdout, stderr다.

  • stdin: 입력 스트림 (ex. 키보드로 입력하는 입력 값을 프로세스로 전달)
  • stdout: 출력 스트림 (ex. 프로세스가 모니터로 출력 값 전달)
  • stderr: 오류 출력 스트림 (ex. 프로세스가 모니터로 오류 전달)

위 세가지 스트림은, 프로그래밍 언어 인터페이스 뿐만 아니라, unix 계열 운영 체제에서 컴퓨터 프로그램과 그 환경 사이에 미리 연결된 입출력 통로라고 이해하면 된다.

여기서 드는 의문점은, 갑자기 왜 stdin, stdout, stderr를..?

Container engine이 containerized application의 stdout과 stderr 스트림을 다른 곳으로 redirect하여 로깅을 진행하기 때문이다.

즉, conatainer에서 발생된 stdout과 stderr는 container engine에 의해 특정한 곳으로 redirect 되고, 저장되어 진다.

참고로 해당 stdout과 stderr는, kubectl logs container_이름 명령어로 조회하여 볼 수 있다.

따라서, kubernetes 환경에서의 로그는 app단에서 stdout과 stderr로 뱉게 하여 보는게 정신건강에 이롭다.

요즘 많이 이야기가 들리는 스택들도 container engine이 저장해 놓는 로그를 정해진 storage에 저장하는 느낌이기에, stdout과 stderr를 잘 활용하자.

node 레벨에서의 logging

Container engine이 어디론가 로그를 저장해주는 부분은 알겠는데, 실제 운영 환경에서는 container가 죽을 수도 있고, 그러면 로깅은 어떻게 되는걸까?

먼저, conatiner 기반 구조는, container가 죽는 것을 감안하고 만들어졌다. 기본적으로 container가 재시작 된다면, 종료된 container 하나를 log와 유지하며, pod가 eviction 되면, container와 log를 포함한 연결된 모든 것들 또한 eviction 된다.

node 레벨에서 시사해야 할 점은, log rotation의 적용이다. 로그를 쌓다가 node storage가 꽉차서 시스템이 뻗으면 황당하지 않는가?

AKS에서의 log ration의 default 값은 아래와 같다.

AKS node안, /etc/docker/daemon.json default로 값이다.

{
  "live-restore": true,
  "log-driver": "json-file",
  "log-opts":  {
     "max-size": "50m",
     "max-file": "5"
  }
}

50MB에 5개까지 들고 있는 부분이 AKS에서의 log rotation 관련 default 값이다.

정리해보자면, container가 재시작 되도, 종료된 container를 로그와 함께 유지하는 것이 kubernetes 기본값이고, log rotation 관련해서는 AKS는 50MB 5개를 최대로 들고 있도록 되어있다.

cluster 레벨에서의 logging

복잡한 node 레벨에서의 logging이 끝났으니, cluster는 이해하기 간단하다.

아래와 같은 옵션들을 이용하여 cluster 레벨에서의 logging을 진행할 수 있다.

  • 모든 노드에서 구동되는 node 레벨 logging agent 사용
  • application pod에 대한 logging을 위해 dedicated sidecar container 사용
  • application에서 backend로 log 직접 푸시

이 다음글에서는, 실제로 AKS 노드안으로 들어가서 로그들이 어떻게 저장되어 있는지 확인해 볼 것이다.

profile
n년차 눕눕

0개의 댓글