EKS를 사용하면서, 로그를 어떻게 넘기는 것이 좋을까 고민을 많이하였습니다.
Log Stdout을 fluentd ds로 넘기려하다가 각 노드에 ds가 많아지면
노드가 하나 생성될 때, 기본적으로 차지하는 리소스 및 IP수 때문에,
실 서비스만 구동하여 관리하려던 설계와 방향이 맞지 않았습니다.
따라서 Spring Logback에서 부터 FluentD 서버로 FluentD -> ES Service로 시행착오를 거쳐 잘 진행된 부분입니다.
관리를 편하게 하기 위해서 UI가 있는 FluentD UI를 설치해보겠습니다.
Amazon Linux2에서 아래 쉘을 통해 루비 및 FluentD를 설치해줍니다.
sudo amazon-linux-extras install -y epel
sudo amazon-linux-extras install -y ruby2.6
sudo yum install -y gcc ruby-devel libxml2 libxml2-devel libxslt libxslt-devel patch redhat-rpm-config sqlite-devel
sudo yum install -y gcc gcc-c++ openssl-devel ruby-devel.noarch patch
gem install rdoc
gem install bundle
gem install rails
gem install -V fluentd-ui
설치를 완료했다면 아래 명령어를 통해 FluentD를 실행시켜주시고,
aws es service로 던질 수 있도록 플러그인을 설치해줍니다.
fluentd-ui start --daemonize
fluent-gem install fluent-plugin-aws-elasticsearch-service
이제, localhost:9292 로 접속하여, admin/changeme 로 로그인 한 후 config 파일을 아래와 같이 수정하도록 하겠습니다.
<source>
@type forward
port 24224
deny_keepalive false
</source>
<source>
@type http
port 8888
</source>
<match *.applog>
@type copy
<store>
@type stdout
</store>
<store>
@type "aws-elasticsearch-service"
logstash_format true
logstash_prefix ${tag}
logstash_dateformat %Y%m
include_timestamp true
include_tag_key true
time_key timestamp
reload_connections false
reconnect_on_error true
reload_on_failure true
flush_interval 1s
chunk_limit_size 1m
flush_thread_interval 0.1
flush_thread_burst_interval 0.01
flush_thread_count 15
<endpoint>
url "https://{your-es-endpoint}.ap-northeast-2.es.amazonaws.com"
region ap-northeast-2
</endpoint>
</store>
</match>
대략적으로 설명하면, 24224 포트로 logback에서 connection으로 받겠다는 옵션이며,
해당 커넥션이 keepalive가 되게 해준다는 뜻입니다.
만약 true로 할 경우, fluentd가 커넥션을 계속 끊어버리기 때문에
서버쪽에서는 커넥션이 broken되었다거나, refuse되었다는 에러로그가 찍힐 수 있습니다.
로그백 설정에서 tag.label으로 로그를 쏠 것인데, 해당 태그값을 가지고 match하여서 stdout을 찍어 debuggin을하고,
es로 tag.label.202101 이러한 index로 던진다는 뜻입니다.
<endpoint> 안에서는 사실 assume role을 통해 iam을 매핑해서
ES에서 정해진 Role을 가진 FluentD에서만 데이터를 쏠 수 있도록 추가적인 설정을해주는 것이 좋습니다.
이제 다시 대시보드 화면에서 FluentD를 Start해주고, 아래 명령어를 통해 테스트 해보시면 됩니다.
curl -X POST -d 'json={"data":"test"}' localhost:8888/test.applog
해당 부분이 문제없이 아래와 같이 stdout에 찍히고,
위와 같이 나왔다면 정상적으로 잘 구동되는 것을 확인하실 수 있습니다.
또한 ES에서도 아래와 같이 잘 Index가 생성된 것을 확인할 수 있습니다.
다음 게시글에서는 Spring Logback 세팅을 해보도록 하겠습니다.
'Log Aggregation > FluentD' 카테고리의 다른 글
Spring Logback -> FluentD -> ES 연동 - 3. FluentD Systemd Service 구성 (0) | 2021.01.12 |
---|---|
Spring Logback -> FluentD -> ES 연동 - 2. Spring Logback 설정 (0) | 2021.01.07 |