On Kubernetes
helm chart 중에 elastic stack 이 있어서 한번 설치해 본 적이 있습니다. 설치 후 kibana에서 모든 Container 로그들을 볼 수 있었습니다. namespace, label, pod 이름등 kubernetes concept에 있는 것들로 filtering도 가능 했습니다.
On mesos marathon
사내 프로젝트 중에 mesos 및 marathon 을 사용 하는 프로젝트가 있었는데 여기에는 helm으로 elastic stack을 설치할 수가 없어서 어떻게 작동하는지 살펴보았습니다.
elastic stack 중에
- elastic search
- kibana
두가지는 marathon에 띄워도 크게 변경하는 사항이 없었습니다.
fluentd의 경우는 달랐습니다.
fluentd configuration line #150 fluentd-elasticsearch chart 에서 comment 부분을 보시면
The Kubernetes kubelet makes a symbolic link to this file on the host machine in the /var/log/containers directory which includes the pod name and the Kubernetes container name: synthetic-logger-0.25lps-pod_default_synth-lgr-997599971ee6366d4a5920d25b79286ad45ff37a74494f262e3bc98d909d0a7b.log -> /var/lib/docker/containers/997599971ee6366d4a5920d25b79286ad45ff37a74494f262e3bc98d909d0a7b/997599971ee6366d4a5920d25b79286ad45ff37a74494f262e3bc98d909d0a7b-json.log
kubelet이 /var/lib/docker/containers 에 있는 log file에 대한 symbolic link를 /var/log/containers directory에 만든다고 나와있습니다. 예제를 보시면 pod 이름 같은 metadata 정보도 symbolic link에 추가해 주고 있습니다.
marathon에 fluentd 들 띄울때는 configuration 을 아래와 같이 했습니다.
@type tail
path /var/lib/docker/containers/*/*-json.log
이렇게 했을때 log file 에는 log, stream, time 정도 정보만 있어서 수집된 log들은 있어도 이게 어떤 container의 로그인지 알기 어려웠습니다.
{"log":"Traceback (most recent call last):\\\\n","stream":"stderr","time":"2019-10-25T02:14:51.347722716Z"}
그래서 marathon에 container를 띄울때 아래와 같은 docker run option을 주었고
--log-opt labels=elastic-stack --label elastic-stack=fluentd
log file에 attrs 라는 field가 생겨서 이 field로 filtering이 가능해졌습니다.
{"log":" 2020-01-31 00:55:37 +0000 [warn]: suppressed same stacktrace\\\\n","stream":"stdout","attrs":{"elastic-stack":"fluentd"},"time":"2020-01-31T00:55:37.720439474Z"}
한국 서버 개발자