K8S Logging
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를 둔다
- Node Level Logging과 동일하게 구성
- 각 Node에 Daemonset으로 Agent를 둬서 각 경로에 생성되는 로그를 조회한다.
- 조회된 로그를 수집서버로 전달
2. Sidecar Container Streaming
하나의 Container에서 두개이상의 로그파일을 써야하는 경우, Stdout으로 쓰면 두개의 로그가 섞인다. 이를 예방하는 방법
- Pod에서 로그를 필요에 따라 Stdout으로 출력 -> default 로그파일로 생성 (/var/log/containers/pod_container_id.log)
- 별도의 Container를 2개 생성해서 해당 로그를 읽어서 각각이 Stdout으로 출력
- Agent가 각각의 Container의 로그를 수집해서 수집서버로 전달