본문 바로가기

Cloud/Kubernetes

Tomcat 로그 EFK로 수집해보기

- 전제조건 : EFK는 이미 Kubernetes Cluster에 배포되어 있는 상태

 쿠버네티스 로깅 아키텍처는 여러가지가 있는데 그 중 sidecar 방식을 택했다. 자꾸 키바나를 키아나라고 부르는 내 처지가 가슴이 웅장해진다... 적당히 정리하는 쪽으로 가겠다.

 EFK는 Elasticsearch + Fluted + Kibana 3개를 뜻한다. 예전인 ELK가 근본이였는데 Kube 환경과 CNCF 재단덕에 Fluted가 더 많이 쓰인다. Fluted가 로그를 elasticsearch로 보내고 수집된 로그들은 kibana를 통해 시각화 된다. 나는 tomcat 로그를 수집해보기로 했다.

docker pull tomcat

톰캣 이미지를 끌어오고, 디플로이먼트를 만들어줬다. 파드로 만들어도 되긴 하는데 관리적인 측면을 위해서이다. 다른 내용보다 fluent 컨테이너에게 로그 넘겨 줄 디렉터리를 하나 지정해줘야 한다. 나는 톰캣 로그를 바로 끌어갈 수 있도록 로그 디렉터리를 지정해주었고, 페이지 하나를 생성해서 마운트 해주었다. 확인을 위해 8080 포트도 열어주었다.

  containers:
    - name: tomcat-log
      image: 'docker.io/library/tomcat:latest'
      ports:
        - containerPort: 8080
          protocol: TCP
      volumeMounts:
        - name: logs-data
          mountPath: /usr/local/tomcat/logs
        - name: hello-home
          mountPath: /usr/local/tomcat/webapps/ROOT

생성하여 제대로 구동이 되는지, 마운트가 정상적으로 되었는지 확인해주었다. 이후 fluted 컨테이너를 추가해주었다.

      containers:
        - name: tomcat-log
          image: 'docker.io/library/tomcat:latest'
          ports:
            - containerPort: 8080
              protocol: TCP
          volumeMounts:
            - name: logs-data
              mountPath: /usr/local/tomcat/logs
            - name: hello-home
              mountPath: /usr/local/tomcat/webapps/ROOT
          imagePullPolicy: Always
        - name: fluent-bit
          image: 'fluent/fluent-bit:1.5-debug'
          volumeMounts:
            - name: custom-parser
              mountPath: /fluent-bit/etc/custom-parser.conf
              subPath: custom-parser.conf
            - name: fluent-bit-config
              mountPath: /fluent-bit/etc/fluent-bit.conf
              subPath: fluent-bit.conf
            - name: logs-data
              mountPath: /tomcat-logs

보면 fluent 컨테이너는 tomcat log 디렉터리 이외에 컨피그맵을 통하여 custom-parser.conf, fluent-bit.conf를 교체해준다. custom-parser.conf를 통해 parser를 설정할 수 있다. 나는 기본으로 주는 아파치 파서 뽀려왔다.

# cat localhost_access_log.2020-09-24.txt
IP - - [24/Sep/2020:06:57:16 +0000] "GET /index.html HTTP/1.1" 200 12
IP - - [24/Sep/2020:06:57:17 +0000] "GET /index.html HTTP/1.1" 304 -

fluent-bit.conf는 IN/OUT을 통해 로그 수집 위치, 어디로 내보낼지 등을 설정할 수 있다.

[SERVICE]
    Flush     5
    Daemon    off
    Log_Level debug
    Parsers_File /fluent-bit/etc/custom-parser.conf
    
[INPUT]
    Name    tail
    Path    /tomcat-logs/localhost_access_log.*
    Tag     access

[FILTER]
    Name    parser
    Match   access
    Parser  custom
    Key_name log
    Reserve_Data On
    Preserve_Key On
    
[OUTPUT]
    Name  es
    Match access
    Host  elasticsearch.kube-logging.svc.cluster.local
    Port  9200
    Logstash_Format True
    Logstash_Prefix access_index

수정이 끝나면 잘 됐는지 확인한다. fluent 컨테이너에 대략 이런 로그가 있으면 된다.

[2020/09/24 07:28:00] [debug] [input:tail:tail.0] 1 new files found on path '/tomcat-logs/localhost_access_log.*'
[2020/09/24 07:28:00] [debug] [output:es:es.0] host=elasticsearch.kube-logging.svc.cluster.local port=9200 uri=/_bulk index=fluent-bit type=_doc
[2020/09/24 07:28:00] [debug] [router] match rule tail.0:es.0
[2020/09/24 07:28:00] [ info] [sp] stream processor started

키바나에 접속해 access에 관련된 패턴을 추가하고 로그 수집을 확인한다.

잘 들어오는 것을 볼 수 있다. 이제 대충 감은 잡았는데 아직 config 설정하는 방법이나 parser에 대해서는 조금 더 알아봐야 할 것 같다.