1 분 소요

1. Node Level Logging

1. Pod

Stdout으로 log를 출력해야 한다

$ app.log #Pod 종료시 함께 삭제된다

$ /dev/termination-log #Pod 재시작 상황에서 죽기전에 이파일에 로그를 쓰면, k8s가 이파일을 읽어서 pod의 상세 status에 이 로그를 표시해 준다. 그 외에도 pod의 restart/scaleout 등의 상황이 발생했을때 그 원인이 되는 로그를 볼 수 있다.

# https://kubetm.github.io/k8s/09-intermediate-architecture/logging/#1-5-termination-log-%ED%99%95%EC%9D%B8
# Pod의 app.js에 termination-log를 쓰는 로직 있음
$ k describe pods <pod_name>
...
Containers:
  container:
    Container ID:   containerd://856889ffc7706fd04e5423b53576814246ceea95b5f81805393abe9b1162c2e0
    Image:          kubetm/app
    Image ID:       docker.io/kubetm/app@sha256:d844d145d23a139c6eb8c4487910065034bcb5b8fa902e9305625c3286a615d7
    Port:           <none>
    Host Port:      <none>
    State:          Running
      Started:      Sun, 13 Oct 2024 21:50:11 +0900
    Last State:     Terminated
      Reason:       Completed
      Message:      User called process.exit()  ## <---------------
      Exit Code:    0
      Started:      Sun, 13 Oct 2024 21:48:40 +0900
      Finished:     Sun, 13 Oct 2024 21:49:45 +0900
    Ready:          True
    Restart Count:  3  ## <---------------

2. Worker Node

$ /var/log/pods/<namespace>_<pod-name>_<pod-id>/container/0.log #원본 위치
$ /var/log/containers/<pod-name>_<container-name>_<container-id>.log #link

2. Cluster Level Logging

1. Node Logging Agent

각각의 Node에 Agent를 둔다

  1. Node Level Logging과 동일하게 구성
  2. 각 Node에 Daemonset으로 Agent를 둬서 각 경로에 생성되는 로그를 조회한다.
  3. 조회된 로그를 수집서버로 전달

2. Sidecar Container Streaming

하나의 Container에서 두개이상의 로그파일을 써야하는 경우, Stdout으로 쓰면 두개의 로그가 섞인다. 이를 예방하는 방법

  1. Pod에서 로그를 필요에 따라 Stdout으로 출력 -> default 로그파일로 생성 (/var/log/containers/pod_container_id.log)
  2. 별도의 Container를 2개 생성해서 해당 로그를 읽어서 각각이 Stdout으로 출력
  3. Agent가 각각의 Container의 로그를 수집해서 수집서버로 전달