글 작성자: 모두의 근삼이

문제

DC/OS에서는 로그 모니터링을 위해 자체적으로 로그 수집 Agent로 FluentBit을 사용한다. 현재 사용하고 있는 시스템에서는 모니터링 시스템을 구축하기 위해서 FluentBit 을 활용하여 EFK를 구축하여 사용하고 있는데, 아래와 같은 설정을 통해 ElasticSearch에 적재되는 로그들이 매일 다른 Index명을 통해 저장되도록 설정되고 있었다.

[OUTPUT]
    Name es
    Match *
    Host <엘라스틱서치 Host>
    Port <엘라스틱서치 Port>
    Logstash_Format True
    Logstash_Prefix fluent-bit

하지만 적재되고 있는 인덱스에 대해서 특별한 관리가 되지 않고 계속 로그가 쌓이기만 하고 있어서 서버에 과도한 용량이 점유되는 상황이 발생하여, ElasticSearch에서 자체적으로 제공하는 Index lifeCycle Manage(ILM)을 활용하여 일정 기준별로 로그를 삭제하는 정책을 적용하기로 하였다

적용

단순히 오래된 로그 인덱스를 삭제하는 룰을 적용하는 것은 ILM의 Delete Phase를 사용하면 간단하게 해결될 일이지만, 현재 설정되어 있는 FluentBit의 설정으로 인해 아래와 같은 형식으로 로그가 쌓이고 있었다.

yellow open fluent-bit-2021.03.26 -Kte_jJuTM6sncBEIF3Dwg 5 1 5958 0 3.7mb 3.7mb
yellow open fluent-bit-2021.03.25 539AosoxTxGLeGtXEQAOXQ 5 1 5958 0 3.7mb 3.7mb
yellow open fluent-bit-2021.03.24 mRuJFJvTQaG76LF3QFxvwQ 5 1 5958 0 3.7mb 3.7mb
yellow open fluent-bit-2021.03.23 -Kte_jJuTM6sncBEIF3Dwg 5 1 5958 0 3.7mb 3.7mb
yellow open fluent-bit-2021.03.22 -Kte_jJuTM6sncBEIF3Dwg 5 1 5958 0 3.7mb 3.7mb

FluentBit의 설정을 바꾸어서 일별로 인덱스를 분할하지 않고, 단일 인덱스로 로그를 송신하도록 변경하고, ILM의 RollOver 등의 룰을 적용하여 로그를 관리하는 것이 가장 확실한 방법으로 보였지만, 서버의 사정상 설정을 변경하는데 제약이 있어서 다른 방법을 강구해야 하는 상황이었다. 그래서 사용하게 된 것이 Index Template이었다. 인덱스 템플릿에 대해 간단하게 설명하면 정규식과 같은 형태를 활용하여, 여러가지 인덱스들을 그룹화 하여 관리할 수 있는 기능을 제공하는 관리체계였다.

Index Lifecycle manage 생성

인덱스 템플릿을 생성할 때 인덱스 라이프사이클을 지정하여 적용되도록 해야 하기 때문에, 적용할 ILM을 먼저 생성해 주어야 한다. 필요한 사이클은 n일 단위로 삭제되는 룰이고, 이미 일단위로 인덱스가 분할되어 입력 되도록 fluentbit 레벨에서 설정이 되어 있기 때문에 롤업과 같은 작업은 하지 않아도 되었다. (아래 예시에서는 인덱스의 최대 수명을 7일로 설정하는 룰이다.)

curl -XPUT 'http://<엘라스틱서치 주소>/_ilm/policy/deletePhase' \
--header 'Content-Type: application/json' \
--data-raw '{
    "policy": {
        "phases": {
            "hot": {
                "min_age": "0ms",
                "actions": {
                    "set_priority": {
                        "priority": 100
                    }
                }
            },
            "delete": {
                "min_age": "7d",
                "actions": {
                    "delete": {}
                }
            }
        }
    }
}'

Index Template 생성

인덱스 템플릿은 상황에 따라 다양한 옵션을 추가할 수 있었지만, 나에게 필요한 기능은 단순히 인덱스들을 그룹화 하여 묶고, 해당 템플릿에 ILM의 삭제 룰(인덱스 템플릿)을 적용하여 매일 동적으로 추가되는 인덱스에도 ILM이 적절하게 적용될 수 있도록 하는 것이었다.

인덱스 템플릿과 관련하여 더 자세한 내용은 공식 문서를 참고하자

curl -XPUT 'http://<엘라스틱서치 주소>/_template/flbdelete' \
--header 'Content-Type: application/json' \
--data-raw '{
    "index_patterns": [
        "fluent-bit*"
    ],
    "settings": {
        "index": {
            "lifecycle": {
                "name": "deletePhase"
            }
        }
    }
}'

 

확인

설정한 내용이 잘 적용 되었는지 확인하려면, 인덱스 템플릿에 속하는 적당한 인덱스 이름으로 임의의 인덱스를 생성하고, 자동으로 라이프 사이클이 적용되어 있는지 확인하면 된다. 아래 예시를 확인해 보면 lifecycle 로 deletePhase가 적용되어 있는 것을 확인할 수 있다.

curl -XGET 'http://<엘라스틱서치 주소>/<인덱스명>'
# 예시
{
    "fluent-bit-2021.03.29": {
        "aliases": {},
        "mappings": {
         ...중략...
        },
        "settings": {
            "index": {
                "lifecycle": {
                    "name": "deletePhase"
                },
                "number_of_shards": "5",
                "provided_name": "fluent-bit-2021.03.29",
                "creation_date": "1616976003010",
                "priority": "100",
                "number_of_replicas": "1",
                "uuid": "otHUWkPrTRqy5MgVi6yfhA",
                "version": {
                    "created": "6070299"
                }
            }
        }
    }
}

 

  • 주의 사항

템플릿을 생성하여도 기존에 이미 존재하고 있던 인덱스들은 새로 생성한 ILM의 영향을 받지 않는다. 따라서 ILM과 템플릿을 새로 생성했다면, 해당 시점 이후에 새로 생성되는 인덱스들은 정상적으로 동작하지만, 기존에 존재하던 인덱스들은 수동으로 ILM을 지정해 주어야 한다.

반응형