TACO LMA에서는 로그수집기로 fluentbit을 사용하고 있다. fluentbit은 내부적으로 input, filter, output, router 등 다양한 설정이 존재하고 이를 조정하여 다양한 기능을 수행할 수 있다. 기본적으로 설정파일을 통해 모듈을 제어하는데 agent의 특성상 필요에따라 수정 및 재시작하는 경우가 많이 있다. 이에따라 agent의 재시도 없이 자연스레 필요한 설정을 동적으로 하기위한 방법으로 operator를 선정했다.
(사족입니다.) 이에 대한 필요성을 느끼고 개발을 시작한 시점(2019년)에는 공식적은 operator는 없었고 몇몇의 개발시도들이 있었다. 대표적인 것이 banzai cloud와 kubesphere라는 업체에서 개발하는 오픈소스가 있었고 이를 활용할 수 있었다. 두개 모두 완성도가 많이 부족한 상황이었고 kubesphere의 것을 기반으로 부족한 부분을 수정하여 사용하였다. helm chart 역시 존재하지 않았고 이에따라 helm chart도 독자적으로 개발하여 사용하였다. 2021년경 kubesphere의 operator가 fluent의 공식적인 operator로 편입되었고 이후 완성도가 향상되었고, helm chart 역시 함께 개발되어 operator를 배포하는 것까지는 잘 지원하고 있다. 이에따라 현재 TACO LMA에서도 공식 오퍼레이터와 챠트를 사용하고 있다.
fluentbit operator는 내부의 다양한 설정의 요소를 사용자 자원으로 정의하고 있고 이 자원들을 설정함으로써 fluentbit의 동작을 지정할 수 있다. 하지만 설정들은 서로의 연관관계가 있고 설정을 정확하게 이해하지 못하면 수정하기 힘든 경우들이 있다.
siim@adm:~/dev$ kubectl get crd | grep logging
filters.logging.kubesphere.io 2022-05-13T04:46:39Z
fluentbitconfigs.logging.kubesphere.io 2022-05-13T04:46:39Z
fluentbits.logging.kubesphere.io 2022-05-13T04:46:39Z
inputs.logging.kubesphere.io 2022-05-13T04:46:39Z
outputs.logging.kubesphere.io 2022-05-13T04:46:39Z
parsers.logging.kubesphere.io 2022-05-13T04:46:39Z
이에 기존 개발에서도 단순화하고 논리적으로 TACO에서 잘 활용할 수 있도록 하는 기능들을 helm chart에 기술하여 사용하고 있었다. 공식화된 fluentbit operator (현재는 fluent operator로 바뀜, https://github.com/fluent/fluent-operator/tree/master/charts/fluent-operator)에서는 이러한 부분은 지원하지 않고 있고 서로간의 연관관계없이 지정한 값을 바로 사용자 자원에 적용해 만들어주는 형태로 제공되고 있다. (최초 개발시 operator의 배포까지 포함했으므로 fluentbit-operator라고 지정했었다. 현재는 operator의 배포는 없으나 하위 호환을 위해 현재도 본 이름을 유지하고 있었으나 혼동을 줄이기 위해 정리하면서 fluentbit-resource로 챠트명을 변경하였다.)
TACO에서는 로그수집관련하여 다양한 설정을 동적으로 적용할 수 있도록 오퍼레이터를 사용하고 사용자 자원들을 관리한다. 이에 대한 배포는 helm chart를 사용하고 있다. TACO에서 제공하는 챠트는 다음과 같은 특징을 갖고 있다.
- 원 로그의 지정과 이에 대한 처리, 그리고 저장위치를 한번에 지정할 수 있다.
- 하나의 소스에서 발생한 로그를 조건에 따라 다양한 저장위치로 저장할 수 있다.
- 저장소는 ElasticSearch를 기본으로하고 kafka, loki 등을 지원한다
- prometheus와 연동하여 로그 기반으로 알람을 생성할 수 있다.
- ElasticSearch에 초기화를 수행한다.
- 접근용 전용계정생성
- index 관리 기능 설정
- index의 template 지정
본 챠트는 로그를 elasticsearch에 저장하는 것을 기본으로 한다. 모든 log는 설정된 elasticseach의 인덱스로 저장되는 것이 기본이며 그외 output인 kafka, loki등은 추가적으로 해당 위치로도 데이터를 전달하는 컨셉이다.
앞에서 언급한 것처럼 fluentbit의 설정은 연관관계가 있어 복잡하고, 본 챠트에도 복잡도를 줄이기는 했으나 여전히 최소한의 연관관계가 존재한다. 이에따라 value override 값을 설정하는 몇몇 포인트를 설명하겠다. 다음 링크에서는 참조할 수 있는 value override의 예시를 제공하고 있으니 함께 참고하자.
해당 위치에서 multi-es.valueoverride.yaml을 기준으로 설명하니 함께 살펴보자. 해당 파일은 실제 TACO LMA 전체를 구축한 클러스터에 함께 설치된 elasticsearch(taco-es) 및 prometheus 등을 연동하는 파일이고 추가적으로 외부의 elasticsearch(external-es)를 사용하여 필요에따라 함께 사용하는 예제이다.
fluentbit.outputs.es에 다음 내역을 설정할 수 있다.
-
이름지정(name): 이후 이 값으로 지정하는 값을 통해 log의 최종 목적지 클러스터가 지정된다.
-
ElasticSearch cluster 정보(host, port)
-
전용계정관련 (dedicatedUser)
-
TACO LMA를 설치하면 네임스페이스에 eck-elasticsearch-es-elastic-user 라는 시크릿에 계정정보 생성 (dedicatedUser.username, dedicatedUser.password)
- 기존에 동일한 계정이 있었다면 여기 설정내용으로 변경(put)되니 유의한다.
-
elasticPasswordSecret에는 해당 ES cluster의 관리자 계정을 secret 형태로 넣어준 상태에서 이를 전달
- TACO LMA의 easticsearch외 클러스터를 연동하기 위해서는 해당 클러스터에 접근할 수 있는 관리자 계정을 secret으로 만들고 이를 지정해 줘야함
apiVersion: v1 data: elastic: dGAjb3dvcmQ= kind: Secret metadata: name: example-elastic-user namespace: lma type: Opaque
-
-
내부구조에 대한 템플릿 지정(template)
- 인덱스관리 설정(template.ilms): 14일 당 삭제(hot-delete-14days)에 대한 예시이고 이를 참고하여 정책을 추가할 수 있다. 이 정책을 기반으로 템플릿에서 사용하므로 둘간의 연관에 주의하자.
- 인덱스템플릿지정(template.templates): TACO logs(platform)에 대한 예시이고 이를 참조하여 다른 인덱스 템플릿을 지정할 수 있다.
- name: taco-es
host: eck-elasticsearch-es-http
port: 9200
dedicatedUser:
username: taco-fluentbit
password: password
elasticPasswordSecret: eck-elasticsearch-es-elastic-user
template:
enabled: true
ilms:
- name: hot-delete-14days
json:
policy:
phases:
hot:
actions:
rollover:
max_size: 30gb
max_age: 1d
max_docs: 5000000000
set_priority:
priority: 100
delete:
min_age: 14d
actions:
delete: {}
templates:
- name: platform
json:
index_patterns: "platform*"
settings:
refresh_interval: 30s
number_of_shards: 3
number_of_replicas: 1
index.lifecycle.name: hot-delete-14days
index.lifecycle.rollover_alias: platform
kafka나 loki에 대한 지정이 가능하고 kafka를 설정하면 es에 전달되는 설정과 동일하게 최종로그가 설정된 kafka에도 적재된다. loki는 현재 개발중으로 추후 확정되므로 이후 사용을 권장한다. http의 경우는 로그 기반 알람관련하여 설정되는 부분으로 아래에서 다시 설명한다.
http:
enabled: true
kafka:
broker: YOUR_BORKER_INFO
enabled: false
topic: YOUR_TACO_LOG_INFO
fluentbit.targetLogs에 수집하는 로그에 대한 처리를 지정할 수 있다. 정확한 내용은 아래 링크 참조.
- 이름지정(name)
- 대상로그(path)
- 전처리 파서(parser): docker나 syslog를 지정
- 태그정의(tag):
- 버퍼관련 지정(bufferChunkSize, bufferMaxSize,memBufLimit)
- 로그를 저장할 것인지 지정(do_not_store_as_default): 아래에서 멀티로 분기시키는 경우에도 전체를 인덱스로 저장할 것인지 여부
- name: syslog
do_not_store_as_default: false
es_name: taco-es
index: syslog
parser: syslog-rfc5424
path: /var/log/syslog
tag: syslog.*
type: syslog
path를 통해 지정된 로그들은 하나의 인덱스로 전달하거나 내용에 따라 분기하여 여러 인덱스로 전달할수 있다. 각 경우에 따른 예시는 다음을 확인하자.
로그를 저장할 인덱스 정보(es_name, index)
- es_name은 앞 단락의 ElasticSearch 설정부분에서 정의한 name 중 하나의 값 지정
- index는 저장할 인덱스 지정
각 로그별 multi_index 설정을 통해 수집된 로그를 상태에 맞는 elasticsearch 클러스터의 인덱스로 전달한다. 이때 지정하는 값들은 다음과 같다.
- 인덱스 지정 (es_name, index)
- 분류기준 지정
- key: 비교하고자 하는 키 값
- value: 조건입력 (정규표현식 사용, 다음 예시참조)
- kube-system|lma|fed|argo
- cap[a-z,-,0-9]+|ceph[a-z,-,0-9]+
multi_index:
- index: platform
es_name: taco-es
key: $kubernetes['namespace_name']
value: kube-system|lma|fed|argo|openstack|istio-system
fluentbit.exclude에 수집하지 않을 조건을 추가할 수 있다. key, value를 통해 수집하지 않을 조건을 지정하면 해당 조건에 맞는 내역은 수집하지 않는다. 아래 내용은 컨테이너 이름이 kibana, elasticsearch, fluent-bit 이면 이 로그는 수집하지 않는다.
exclude:
- key: $kubernetes['container_name']
value: kibana|elasticsearch|fluent-bit
TACO LMA에서는 log에서 문구기반 알람을 발생할 수 있다. 이를 위해서 다음 단계를 수행한다.
- prometheus 연동을 위한 exporter 활성화
- 알람용 개별 룰 지정
logExporter를 통해 활성화 한다. 이때 serviceMonitor항목을 설정하면 TACO LMA의 경우 자동으로 prometheus에 연동되는 것까지 가능하다. logExporter.serviceMonitor.interval은 prometheus 서버가 알람의 생성을 확인하는 주기이다.
logExporter:
enabled: false
serviceMonitor:
enabled: false
interval: 1m
fluentbit.alerts에 개별 알람을 설정할 수 있다.
- 활성화 여부(enabled)
- 알람 적용 네임스페이스 지정(namespace)
- prometheus alertmanager의 메시지 관련 설정(message, summary)
- 상세 룰 설정(rules)
- 알람이름(name)
- 중요도(severity): prometheus의 중요도 4단계 중 지정(page / critical / warning / info)
- 조건(regex)
다음 예시는 fed 네임스페이스에 정규식(update.?error)에 부합하는 로그가 발생하면 critical 수준으로 알람을 발생시키고 이에 따른 메시지를 정의한 내역이다.
alerts:
enabled: false
namespace: fed
message: |-
{{ $labels.container }} in {{ $labels.pod }} ({{ $labels.taco_cluster }}/{{ $labels.namespace }} ) generate a error due to log = {{ $labels.log }}
summary: |-
{{ $labels.container }} in {{ $labels.pod }} ({{ $labels.taco_cluster }}/{{ $labels.namespace }} ) generate a error
rules:
- name: example
severity: critical
regex: "update.?error"
서문에서 언급한 것처럼 현재버전(fluentbit-operator 1.3.0)에서는 operator 자체의 배포는 삭제되었다. 따라서 공식 챠트를 사용하여 오퍼레이터를 배포하고 본 챠트를 통해 cr을 배포하는 두단계로 fluentbit을 배포한다. 아래 예시는 TACO LMA에서 elasticsearch가 배포되어있는 환경을 가정하였다. 테스트해보고자 하는 환경에 정보에 맞도록 위에 설명한 내용을 토대로 수정하면 별도의 환경에서도 테스트가 가능하다.
공식 챠트는 아래 github에서 코드 형태로 제공하고 있으며 공식 helm repo는 따로 제공하지 않는다.(fluent의 공식 helm repo에서 제공하는 챠트는 오퍼레이터 버전이 아닌 직접 설치하는 버전이니 혼동하지 말자.) 따라서 소스를 받아 설치해야 한다. 여기에서는 TACO의 repo를 통해 공식 챠트를 사용하여 배포하도록 한다. TACO LMA를 통해 배포한 환경이라면 이미 존재한다.
-
helm repo 등록
siim@adm:~$ helm repo add taco https://openinfradev.github.io/helm-repo "taco" has been added to your repositories siim@adm:~$ helm repo update taco Hang tight while we grab the latest from your chart repositories... ...Successfully got an update from the "taco" chart repository Update Complete. ⎈Happy Helming!⎈ siim@adm:~$ helm search repo taco NAME CHART VERSION APP VERSION DESCRIPTION taco/taco-registry 1.0.6 1.0 A Helm chart for Kubernetes taco/taco-watcher 0.1.0 1.0 Monitoring Dashboard for Tacoplay ... taco/fluent-operator 0.1.0 1.1.0 A Helm chart for Kubernetes taco/fluentbit-operator 1.3.0 v1.8.3 Provide easy log collecting definition for kube... taco/fluentbit-resource 1.0.0 v1.8.3 Provide easy log collecting definition for kube... taco/fluentbit-skt 1.0.0 1.8.0 Provide easy log collecting definition for kube... ...
-
operator 설치
siim@adm:~$ cat officail_fb_op_vo.yaml operator: image: "ghcr.io/openinfradev/fluentbit-operator" tag: "25bc31cd4333f7f77435561ec70bc68e0c73a194" resources: operator: # FluentBit operator resources. Usually user needn't to adjust these. resources: limits: cpu: 100m memory: 200Mi requests: cpu: 100m siim@adm:~$ helm install -n lma fluentbit-operator taco/fluent-operator --version 0.1.0 -f officail_fb_op_vo.yaml NAME: fluentbit-operator LAST DEPLOYED: Fri Aug 5 02:24:20 2022 NAMESPACE: lma STATUS: deployed REVISION: 1 TEST SUITE: None NOTES: Thank you for installing fluentbit-operator Your release is named fluentbit-operator To learn more about the release ,try: $ helm status fboperator -n lma $ helm get fboperator -n lma
official 사이트에서 fluentbit-operator의 버전관리를 하지 않고 있어서 taco repo에도 0.1.0 으로 올리고 있으며 공교롭게도 앞에서 언급한 여러가지 이유로 더 높은 버전이 존재하는데 정확한 설치를 위해 명령에서 버전을 지정한다. (--version 0.1.0)
-
설치내역 확인
siim@adm:~$ kubectl get po -n lma NAME READY STATUS RESTARTS AGE fluent-operator-55d8d789bf-g6sjb 1/1 Running 0 2m6s
소개한 챠트를 통해 fluentbit을 구성한다. 설정을 위해서는 값 재지정이 필요하며 이 예시에서는 다음 값들을 사용한다. 참고로 이 값들은 TACO LMA를 Decapod를 통해 배포할때 사용되는 기본값의 최소값이다. 간단하게 설명하면 컨테이너 로그들을 수집하여 네임스페이스가 kube-system이나 lma 인 경우 TACO LMA의 elasticsearch (eck-elasticsearch-es-http)로 저장하는 설정이다.
fullnameOverride: fbcr-taco
fluentbit:
enabled: true
daemonset:
spec:
pod:
tolerations:
- key: node-role.kubernetes.io/master
operator: Exists
- key: node-role.kubernetes.io/node
operator: Exists
job:
spec:
nodeSelector:
taco-lma: enabled
outputs:
es:
- name: taco-es
host: eck-elasticsearch-es-http
port: 9200
dedicatedUser:
username: taco-fluentbit
password: password
elasticPasswordSecret: eck-elasticsearch-es-elastic-user
template:
enabled: true
ilms:
- name: hot-delete-14days
json:
policy:
phases:
hot:
actions:
rollover:
max_size: 30gb
max_age: 1d
max_docs: 5000000000
set_priority:
priority: 100
delete:
min_age: 14d
actions:
delete: {}
- name: hot-delete-7days
json:
policy:
phases:
hot:
actions:
rollover:
max_size: 30gb
max_age: 1d
max_docs: 5000000000
set_priority:
priority: 100
delete:
min_age: 7d
actions:
delete: {}
- name: hot-delete-3hour
json:
policy:
phases:
hot:
actions:
rollover:
max_size: 30gb
max_age: 1h
max_docs: 5000000000
set_priority:
priority: 100
delete:
min_age: 3h
actions:
delete: {}
templates:
- name: platform
json:
index_patterns: "platform*"
settings:
refresh_interval: 30s
number_of_shards: 3
number_of_replicas: 1
index.lifecycle.name: hot-delete-14days
index.lifecycle.rollover_alias: platform
- name: application
json:
index_patterns: "container*"
settings:
refresh_interval: 30s
number_of_shards: 3
number_of_replicas: 1
index.lifecycle.name: hot-delete-3hour
index.lifecycle.rollover_alias: container
- name: syslog
json:
index_patterns: "syslog*"
settings:
refresh_interval: 30s
number_of_shards: 2
number_of_replicas: 1
index.lifecycle.name: hot-delete-14days
index.lifecycle.rollover_alias: syslog
targetLogs:
- tag: kube.*
bufferChunkSize: 2M
bufferMaxSize: 5M
do_not_store_as_default: false
es_name: taco-es
index: container
memBufLimit: 20MB
multi_index:
- index: platform
es_name: taco-es
key: $kubernetes['namespace_name']
value: kube-system|taco-system|lma|argo
parser: docker
path: /var/log/containers/*.log
type: fluent
extraArgs:
multilineParser: docker, cri
- tag: syslog.*
es_name: taco-es
index: syslog
parser: syslog-rfc5424
path: /var/log/syslog
type: syslog
alerts:
enabled: true
namespace: taco-system
message: |-
{{ $labels.container }} in {{ $labels.pod }} ({{ $labels.taco_cluster }}/{{ $labels.namespace }} ) generate a error due to log = {{ $labels.log }}
summary: |-
{{ $labels.container }} in {{ $labels.pod }} ({{ $labels.taco_cluster }}/{{ $labels.namespace }} ) generate a error
rules:
# - name: critical-example
# severity: critical
# regex: "OOM Killed|Evict"
- name: warning-example
severity: warning
regex: "update.?error"
clusterName: taco-cluster.local
exclude:
- key: $kubernetes['container_name']
value: kibana|elasticsearch|fluent-bit
logExporter:
enabled: true
serviceMonitor:
enabled: true
spec:
nodeSelector:
taco-lma: enabled
-
설치하기
siim@adm:~$ helm install fluentbit -n lma taco/fluentbit-resource -f fb-vo.yaml NAME: fluentbit LAST DEPLOYED: Fri Aug 5 03:01:05 2022 NAMESPACE: lma STATUS: deployed REVISION: 1 TEST SUITE: None siim@adm:~$ kubectl get -n lma po | grep fluent-bit fluent-bit-2z8jw 1/1 Running 0 32s fluent-bit-87lxj 1/1 Running 0 32s fluent-bit-gqd97 1/1 Running 0 32s fluent-bit-n6jmc 1/1 Running 0 32s fluent-bit-np547 1/1 Running 0 32s fluent-bit-qcxhb 1/1 Running 0 32s fluent-bit-r5kvw 1/1 Running 0 32s fluent-bit-r7nsg 1/1 Running 0 32s
-
처리내역 확인: 설치된 es를 통해 동작내역을 확인할 수 있다.
본 페이지에서는 로그수집을 위한 fluentbit을 기반으로 다양한 기능을 추가한 TACO LMA의 fluentbit-operator 챠트에 대해 설명하였다. 로그를 수집기를 찾고 있거나 이미 fluentbit을 사용하고 있다면 이 챠트를 사용하면 일관된 형태의 로그수집 파이프라인을 value override로 관리할 수 있다.