Overview
Fluent Bit에 대해서 알아보자.
Fluent Bit이란?
Fluent Bit는 고성능 로그 프로세서 및 로그 전달자로, CNCF(Cloud Native Computing Foundation)에 의해 호스팅되는 오픈 소스 프로젝트이다. 경량화되어 있고, C로 작성되었으며, 로그 데이터를 수집하고, 처리하고, 파이프라인을 통해 다양한 대상으로 전달하는 데 사용된다. Fluent Bit는 컨테이너화된 환경, 클라우드, 온-프레미스 시스템에서 로그 관리를 위해 널리 사용된다.
주요 특징
- 경량화 및 고성능: 컨테이너 및 마이크로서비스 아키텍처에 적합하도록 설계되었다.
- 다양한 입력 플러그인: 로그 파일, 시스템 메트릭, HTTP, MQTT 등 다양한 소스로부터 데이터를 수집할 수 있는 풍부한 입력 플러그인을 제공한다.
- 유연한 처리 파이프라인: 필터를 통해 데이터를 수정하거나 향상시킬 수 있으며, 조건부 로직을 적용하여 데이터를 처리할 수 있다.
- 다양한 출력 대상 지원: Elasticsearch, Kafka, HTTP, Fluentd 등 다양한 대상으로 데이터를 전송할 수 있는 출력 플러그인을 제공한다.
- 스트림 처리: 메모리 또는 파일 기반 버퍼를 사용하여 데이터 스트림을 효율적으로 처리한다.
사용 사례
- 로그 집계: 여러 출처에서 로그를 수집하여 중앙 집중식 로그 시스템으로 전송한다.
- 모니터링: 시스템과 애플리케이션에서 메트릭을 수집하여 모니터링 솔루션에 전송한다.
- 데이터 변환 및 정제: 로그 데이터를 필터링하고, 변환하여 저장소 또는 분석 도구에 전달하기 전에 데이터를 최적화한다.
구성 요소
- 입력 플러그인: 데이터 소스로부터 데이터를 수집한다.
- 파서: 수집된 로그 데이터의 형식을 해석한다.
- 필터: 데이터를 처리하고 변환한다.
- 출력 플러그인: 처리된 데이터를 다양한 대상으로 전송한다.
Fluent Bit vs Fluentd
Fluent Bit와 Fluentd는 모두 CNCF에 의해 호스팅되는 프로젝트이며, 로그 수집 및 전달에 사용된다. 주요 차이점은 Fluent Bit이 더 경량화되어 있고, 고성능을 위해 설계되었다는 점이다. 반면, Fluentd는 보다 많은 플러그인과 유연성을 제공하지만, 리소스 사용량이 더 높을 수 있다. 종종 Fluent Bit는 에지 또는 리소스 제한 환경에서 데이터를 수집하고, 이를 Fluentd로 전송하여 더 복잡한 처리를 수행하는 아키텍처에서 사용한다.
Fluent Bit 형식 및 스키마
Fluent Bit은 구성 파일을 사용하여 서비스 작동 방식을 정의할 수 있다.
스키마는 세 가지 개념으로 정의된다.
- Sections
- Entries: Key/Value
- Indented Configuration Mode (4 spaces ideally)
Sections
섹션은 대괄호 안의 이름이나 제목으로 정의된다.
- 모든 섹션 내용은 들여쓰기되어야 한다(이상적으로는 4칸).
- 동일한 파일에 여러 섹션이 존재할 수 있다.
- 섹션에는 설명과 항목이 있어야 하며 비워둘 수 없다.
- 섹션 아래의 주석 처리된 줄도 들여쓰기해야 한다.
- 줄 끝 주석은 지원되지 않으며 전체 줄 주석만 지원된다.
주요 섹션에는 SERVICE, INPUT, FILTER, OUTPUT, 그리고 PARSER가 있다.
SERVICE
Fluent Bit의 전반적인 동작을 정의한다.
- Flush: 버퍼 데이터를 출력 플러그인으로 플러시하는 시간 간격(초)이다.
- Log_Level: 로그 출력 레벨을 설정한다(info, debug, error 등).
- info : 기본 로그 레벨로, 일반적인 작동 정보와 중요한 이벤트 메시지를 출력한다.
- debug : 더 상세한 로그를 출력하는 레벨로, 시스템의 작동 상태를 더 깊게 이해하기 위한 정보를 포함한다.
- error : 에러 메시지만을 출력한다.
- Parsers_File: 파서 정의를 포함하는 파일의 이름을 지정한다. 이 파일에는 로그 포맷을 해석하기 위한 정규 표현식이 정의된다.
[SERVICE]
Flush 1
Log_Level info
Parsers_File parsers.conf
INPUT
로그 데이터의 입력 소스를 정의한다.
- Name: 입력 플러그인의 이름을 지정한다(tail은 파일의 내용을 실시간으로 읽는다).
- Path: 로그 파일의 경로를 지정한다.
- Parser: 해당 로그 파일을 파싱하기 위해 사용할 PARSER 이름을 지정한다.
- Tag: 입력 데이터에 할당할 태그를 지정한다.
[INPUT]
Name tail
Path /var/log/nginx/access.log
Parser nginx_access_parser
Tag nginx_access
[INPUT]
Name tail
Path /var/log/nginx/error.log
Parser nginx_error_parser
Tag nginx_error
FILTER
입력 데이터를 처리하거나 변형하는 데 사용된다.
- Name: 필터 플러그인의 이름을 지정한다(grep, modify 등).
- grep : 정규 표현식 또는 특정 조건을 사용하여 로그 데이터를 필터링한다.
- Regex : 정규 표현식을 사용하여 로그 데이터 중 특정 패턴에 일치하는 데이터만을 선택한다.
- Exclude : 정규 표현식에 일치하는 데이터를 제외하고 처리한다.
- modify : 그 데이터에 필드를 추가, 삭제 또는 수정하는 작업을 수행한다.
- Add: 새로운 키-값 쌍을 로그 데이터에 추가한다.
- Remove: 지정한 키를 로그 데이터에서 삭제한다.
- Rename: 로그 데이터의 키 이름을 변경한다.
- grep : 정규 표현식 또는 특정 조건을 사용하여 로그 데이터를 필터링한다.
- Match: 이 필터가 적용될 태그 패턴을 지정한다.
- Regex: grep 필터를 사용할 경우, 로그 메시지를 필터링하기 위한 정규 표현식을 지정한다.
- Add: modify 필터를 사용할 경우, 로그 메시지에 추가할 필드를 지정한다.
[FILTER]
Name grep
Match nginx_access
Regex log .*somaz.*
[FILTER]
Name modify
Match nginx_access
Add log_type nginx_access
[FILTER]
Name modify
Match nginx_error
Add log_type nginx_error
OUTPUT
처리된 로그 데이터의 최종 목적지를 정의한다.
- Name: 출력 플러그인의 이름을 지정한다(stdout, loki 등).
- Match: 이 출력이 적용될 태그 패턴을 지정한다.
- Host, Port, URI: 로그 데이터를 전송할 대상 서버의 주소와 포트, URI를 지정한다.
- tls: TLS/SSL을 사용하여 데이터 전송을 암호화할지 여부를 지정한다.
- Labels: 로그 데이터와 함께 전송할 레이블을 지정한다.
[OUTPUT]
Name stdout
Match *
[OUTPUT]
Name loki
Match *
Host loki.somaz.link
Port 443
URI /loki/api/v1/push
tls On
Labels job=fluent-bit, log_type=$log_type
PARSER
로그 데이터의 포맷을 해석하는 규칙을 정의한다.
- Name: 파서의 이름을 지정한다.
- Format: 파싱할 로그 포맷의 유형을 지정한다(regex 등).
- Regex: 로그 메시지를 파싱하기 위한 정규 표현식을 지정한다.
- Time_Key, Time_Format: 로그 메시지에서 시간을 추출하기 위한 키와 시간 포맷을 지정한다.
[PARSER]
Name nginx_access_parser
Format regex
Regex ^(?<remote_addr>[^ ]*) - (?<remote_user>[^ ]*) \\[(?<time>[^\\]]*)\\] "(?<method>\\S+) (?<request>[^ ]*) (?<http_protocol>[^"]*)" (?<status>[^ ]*) (?<body_bytes_sent>[^ ]*) "(?<http_referer>[^"]*)" "(?<http_user_agent>[^"]*)" (?<request_length>[^ ]*) (?<request_time>[^ ]*) \\[(?<upstream_name>[^\\]]*)\\] \\[(?<upstream_addr>[^\\]]*)\\] (?<upstream_response_length>[^ ]*) (?<upstream_response_time>[^ ]*) (?<upstream_status>[^ ]*) (?<request_id>[^ ]*)$
Time_Key time
Time_Format %d/%b/%Y:%H:%M:%S %z
[PARSER]
Name nginx_error_parser
Format regex
Regex ^(?<time>\\d{4}/\\d{2}/\\d{2} \\d{2}:\\d{2}:\\d{2}) \\[(?<log_level>\\w+)\\] (?<process_info>\\d+#\\d+): (?<message>.*)$
Time_Key time
Time_Format %Y/%m/%d %H:%M:%S
nginx_access_parser
- Format: regex - 정규 표현식을 사용하여 로그의 구조를 분석한다.
- Regex: 이 정규 표현식은 Nginx 접근 로그의 일반적인 형식을 분석하기 위해 설계되었다. 각 그룹((?<name>...))은 로그의 특정 부분을 캡처하고, 해당 부분에 이름을 할당한다. 예를 들어, remote_addr, remote_user, time, method, request, http_protocol, status 등의 필드를 추출한다.
- Time_Key: time - 로그에서 시간 정보를 포함하는 필드의 이름이다.
- Time_Format: %d/%b/%Y:%H:%M:%S %z - 로그에 기록된 시간의 형식을 나타냅니다. 이 형식은 파싱 과정에서 시간 정보를 올바르게 해석하기 위해 사용된다.
nginx_error_parser
- Format: regex - 정규 표현식을 사용하여 에러 로그의 구조를 분석한다.
- Regex: Nginx 에러 로그의 특정 패턴을 분석하기 위한 정규 표현식이다. 여기서는 시간(time), 로그 레벨(log_level), 프로세스 정보(process_info), 그리고 실제 메시지(message) 등의 필드를 추출한다.
- Time_Key: time - 에러 로그에서 시간 정보를 담고 있는 필드의 이름이다.
- Time_Format: %Y/%m/%d %H:%M:%S - 에러 로그에 기록된 시간의 형식을 나타낸다.
Fluent Bit 실습
Fluent Bit을 Application의 SideCar로 생성하는 실습을 진행해본다.
`yaml`과 `helm` 두가지의 형식으로 작성해본다.
- https://github.com/somaz94/helm-chart-template/tree/main/onpremise/ke-use-nfs-server-sidecar-fluentbit
- https://github.com/somaz94/cicd-monitoring/tree/main/onpremise/ingress-nginx-sidecar-fluentbit
yaml 형식
아래의 예시는 ingress-nginx로 들어오는 access.log와 error.log을 수집하고 loki로 전송한다.
`fluentbit-config.yaml`
apiVersion: v1
kind: ConfigMap
metadata:
name: fluent-bit-config
namespace: ingress-nginx
data:
fluent-bit.conf: |
[SERVICE]
Flush 1
Log_Level info
Parsers_File parsers.conf
[INPUT]
Name tail
Path /var/log/nginx/access.log
Parser nginx_access_parser
Tag nginx_access
[INPUT]
Name tail
Path /var/log/nginx/error.log
Parser nginx_error_parser
Tag nginx_error
[FILTER]
Name grep
Match nginx_access
Regex log .*somaz.*
[FILTER]
Name modify
Match nginx_access
Add log_type nginx_access
[FILTER]
Name modify
Match nginx_error
Add log_type nginx_error
[OUTPUT]
Name stdout
Match *
[OUTPUT]
Name loki
Match *
Host loki.somaz.link
Port 443
URI /loki/api/v1/push
tls On
Labels job=fluent-bit, log_type=$log_type
parsers.conf: |
[PARSER]
Name nginx_access_parser
Format regex
Regex ^(?<remote_addr>[^ ]*) - (?<remote_user>[^ ]*) \\[(?<time>[^\\]]*)\\] "(?<method>\\S+) (?<request>[^ ]*) (?<http_protocol>[^"]*)" (?<status>[^ ]*) (?<body_bytes_sent>[^ ]*) "(?<http_referer>[^"]*)" "(?<http_user_agent>[^"]*)" (?<request_length>[^ ]*) (?<request_time>[^ ]*) \\[(?<upstream_name>[^\\]]*)\\] \\[(?<upstream_addr>[^\\]]*)\\] (?<upstream_response_length>[^ ]*) (?<upstream_response_time>[^ ]*) (?<upstream_status>[^ ]*) (?<request_id>[^ ]*)$
Time_Key time
Time_Format %d/%b/%Y:%H:%M:%S %z
[PARSER]
Name nginx_error_parser
Format regex
Regex ^(?<time>\\d{4}/\\d{2}/\\d{2} \\d{2}:\\d{2}:\\d{2}) \\[(?<log_level>\\w+)\\] (?<process_info>\\d+#\\d+): (?<message>.*)$
Time_Key time
Time_Format %Y/%m/%d %H:%M:%S
`ingress-nginx/templates/controller-deployment.yaml`
# Source: ingress-nginx/templates/controller-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
helm.sh/chart: ingress-nginx-4.0.1
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/instance: ingress-nginx
app.kubernetes.io/version: "1.0.0"
app.kubernetes.io/managed-by: Helm
app.kubernetes.io/component: controller
name: ingress-nginx-controller
namespace: ingress-nginx
spec:
selector:
matchLabels:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/instance: ingress-nginx
app.kubernetes.io/component: controller
revisionHistoryLimit: 10
minReadySeconds: 0
template:
metadata:
labels:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/instance: ingress-nginx
app.kubernetes.io/component: controller
spec:
dnsPolicy: ClusterFirst
serviceAccountName: ingress-nginx
nodeSelector:
kubernetes.io/os: linux
terminationGracePeriodSeconds: 300
containers:
- name: controller
image: k8s.gcr.io/ingress-nginx/controller:v1.0.0@sha256:0851b34f69f69352bf168e6ccf30e1e20714a264ab1ecd1933e4d8c0fc3215c6
imagePullPolicy: IfNotPresent
lifecycle:
preStop:
exec:
command:
- /wait-shutdown
args:
- /nginx-ingress-controller
- --election-id=ingress-controller-leader
- --controller-class=k8s.io/ingress-nginx
- --configmap=$(POD_NAMESPACE)/ingress-nginx-controller
- --validating-webhook=:8443
- --validating-webhook-certificate=/usr/local/certificates/cert
- --validating-webhook-key=/usr/local/certificates/key
...
# 아래의 내용 추가
- name: fluent-bit
image: fluent/fluent-bit:2.2.2
imagePullPolicy: Always
volumeMounts:
- name: shared-data
mountPath: /var/log/nginx
- name: fluent-bit-config
mountPath: /fluent-bit/etc/
volumes:
- name: webhook-cert
secret:
secretName: ingress-nginx-admission
- name: shared-data
emptyDir: {}
- name: fluent-bit-config
configMap:
name: fluent-bit-config
`fluent-bit sidecar log`
Fluent Bit v2.2.2
* Copyright (C) 2015-2024 The Fluent Bit Authors
* Fluent Bit is a CNCF sub-project under the umbrella of Fluentd
* <https://fluentbit.io>
____________________
< Fluent Bit v2.2.2 >
-------------------
\\
\\
\\ __---__
_- /--______
__--( / \\ )XXXXXXXXXXX\\v.
.-XXX( O O )XXXXXXXXXXXXXXX-
/XXX( U ) XXXXXXX\\
/XXXXX( )--_ XXXXXXXXXXX\\
/XXXXX/ ( O ) XXXXXX \\XXXXX\\
XXXXX/ / XXXXXX \\__ \\XXXXX
XXXXXX__/ XXXXXX \\__---->
---___ XXX__/ XXXXXX \\__ /
\\- --__/ ___/\\ XXXXXX / ___--/=
\\-\\ ___/ XXXXXX '--- XXXXXX
\\-\\/XXX\\ XXXXXX /XXXXX
\\XXXXXXXXX \\ /XXXXX/
\\XXXXXX > _/XXXXX/
\\XXXXX--__/ __-- XXXX/
-XXXXXXXX--------------- XXXXXX-
\\XXXXXXXXXXXXXXXXXXXXXXXXXX/
""VXXXXXXXXXXXXXXXXXXV""
[2024/03/05 06:05:56] [ info] [fluent bit] version=2.2.2, commit=eeea396e88, pid=1
[2024/03/05 06:05:56] [ info] [storage] ver=1.5.1, type=memory, sync=normal, checksum=off, max_chunks_up=128
[2024/03/05 06:05:56] [ info] [cmetrics] version=0.6.6
[2024/03/05 06:05:56] [ info] [ctraces ] version=0.4.0
[2024/03/05 06:05:56] [ info] [input:tail:tail.0] initializing
[2024/03/05 06:05:56] [ info] [input:tail:tail.0] storage_strategy='memory' (memory only)
[2024/03/05 06:05:56] [ info] [output:stdout:stdout.0] worker #0 started
...
helm 형식
아래의 예시는 특정 application pod에 기록되고 있는 log 파일을 수집하고 loki로 전송한다.
`values.yaml`
# Default values for ke-use-nfs-server-sidecar-fluentbit.
# This is a YAML-formatted file.
# Declare variables to be passed into your templates.
replicaCount: 1
image:
repository: harbor.somaz.link/somaz/game
pullPolicy: IfNotPresent
# Overrides the image tag whose default is the chart appVersion.
tag: "dev1-6e5ffce"
imagePullSecrets:
- name: harbor-secret-v1
nameOverride: "ke-use-nfs-server-sidecar-fluentbit"
fullnameOverride: "ke-use-nfs-server-sidecar-fluentbit"
serviceAccount:
# Specifies whether a service account should be created
create: true
# Annotations to add to the service account
annotations: {}
# The name of the service account to use.
# If not set and create is true, a name is generated using the fullname template
name: ""
podAnnotations: {}
podSecurityContext: {}
# fsGroup: 2000
securityContext: {}
# capabilities:
# drop:
# - ALL
# readOnlyRootFilesystem: true
# runAsNonRoot: true
# runAsUser: 1000
service:
type: ClusterIP
port: 80
targetPort: 3000
ingress:
name: ke-use-nfs-server-sidecar-fluentbit-ingress
enabled: true
className: ""
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/rewrite-target: /
cert-manager.io/cluster-issuer: clouddns-issuer # your clusterissuer
hosts:
- host: dev1-game.somaz.link
paths:
- path: /
pathType: Prefix
backend:
service:
name: ke-use-nfs-server-sidecar-fluentbit-svc
port: 80
tls:
- secretName: dev1-game-tls
hosts:
- dev1-game.somaz.link
resources: {}
# We usually recommend not to specify default resources and to leave this as a conscious
# choice for the user. This also increases chances charts run on environments with little
# resources, such as Minikube. If you do want to specify resources, uncomment the following
# lines, adjust them as necessary, and remove the curly braces after 'resources:'.
# limits:
# cpu: 100m
# memory: 128Mi
# requests:
# cpu: 100m
# memory: 128Mi
autoscaling:
enabled: false
minReplicas: 1
maxReplicas: 100
targetCPUUtilizationPercentage: 80
# targetMemoryUtilizationPercentage: 80
nodeSelector: {}
tolerations: []
affinity: {}
revisionHistoryLimit: 1
namespace: ke-use-nfs-server-sidecar-fluentbit-dev1
envConfig:
NODE_ENV: dev1
configs:
- name: ke-use-nfs-server-sidecar-fluentbit-dev1-config
namespace: ke-use-nfs-server-sidecar-fluentbit-dev1
datas:
SERVER_PORT: 3000
REDIS_DB_HOST: dev1-redis.somaz.link
REDIS_DB_PORT: 30480
ADMIN_DB_HOST: dev1-db.somaz.link
ADMIN_DB_PORT: 30737
ADMIN_DB_NAME: admin
ADMIN_DB_ID: somaz
ADMIN_DB_PW: somaz94
ADMIN_DB_SYNCHRONIZE: true
- name: fluent-bit-configmap
namespace: fgn-server-dev1
datas:
fluent-bit.conf: |
[SERVICE]
Flush 10
Log_Level info
Parsers_File parsers.conf
[INPUT]
Name tail
Path /app/logs/system/error.log.*
Tag somaz_game_dev1_error_log
Parser json
[INPUT]
Name tail
Path /app/logs/request/request.log.*
Tag somaz_server_game_dev1_request_log
Parser json
[FILTER]
Name modify
Match somaz_server_game_dev1_error_log
Add log_type error_log
Add app somaz_server_game_dev1
[FILTER]
Name modify
Match somaz_server_game_dev1_request_log
Add log_type request_log
Add app somaz_server_game_dev1
[OUTPUT]
Name stdout
Match *
[OUTPUT]
Name loki
Match *
Host loki.somaz.link
Port 443
URI /loki/api/v1/push
tls On
Labels job=fluent-bit, log_type=$log_type, app=$app
parsers.conf: |
[PARSER]
Name json
Format json
Time_Key timestamp
Time_Format %Y-%m-%dT%H:%M:%S.%LZ
persistentVolumes:
- name: ke-use-nfs-server-sidecar-fluentbit-dev1-data-pv
type: data
storage: 5Gi
volumeMode: Filesystem
accessModes:
- ReadWriteOnce
reclaimPolicy: Retain
storageClassName: nfs-client
path: /data/somaz/gamedata/dev1/data
server: nfs-server.somaz.link
persistentVolumeClaims:
- name: ke-use-nfs-server-sidecar-fluentbit-dev1-data-pv-claim
accessModes:
- ReadWriteOnce
storageClassName: nfs-client
storage: 5Gi
type: data
mountPath: /app/data
# AWS
certificate:
enabled: true
secretName: dev1-game-tls
commonName: dev1-game.somaz.link
duration: 2160h0m0s # 90d
renewBefore: 720h0m0s # 30d
dnsNames:
- dev1-game.somaz.link
issuerName: route53-issuer
issuerKind: ClusterIssuer
# # GCP
# certificate:
# enabled: true
# secretName: dev1-game-tls
# commonName: dev1-game.somaz.link
# duration: 2160h0m0s # 90d
# renewBefore: 720h0m0s # 30d
# dnsNames:
# - dev1-game.somaz.link
# issuerName: clouddns-issuer
# issuerKind: ClusterIssuer
# fluentbit
sidecars:
enabled: true
containers:
- name: fluent-bit
image: fluent/fluent-bit:2.2.2
volumeMounts:
- name: shared-data
mountPath: /app/logs
- name: fluent-bit-config
mountPath: /fluent-bit/etc
volumes:
- name: fluent-bit-config
configMap:
name: fluent-bit-configmap
- name: shared-data
emptyDir: {}
`templates/configmap.yaml`
{{- range $config := .Values.configs }}
---
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ $config.name }}
namespace: {{ $config.namespace }}
data:
{{- range $key, $value := $config.datas }}
{{ $key }}: {{ quote $value }}
{{- end }}
{{- end }}
`templates/deployment.yaml`
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ include "ke-use-nfs-server-sidecar-fluentbit.fullname" . }}
labels:
{{- include "ke-use-nfs-server-sidecar-fluentbit.labels" . | nindent 4 }}
spec:
revisionHistoryLimit: {{ .Values.revisionHistoryLimit }}
{{- if not .Values.autoscaling.enabled }}
replicas: {{ .Values.replicaCount }}
{{- end }}
selector:
matchLabels:
{{- include "ke-use-nfs-server-sidecar-fluentbit.selectorLabels" . | nindent 6 }}
template:
metadata:
{{- with .Values.podAnnotations }}
annotations:
{{- toYaml . | nindent 8 }}
{{- end }}
labels:
{{- include "ke-use-nfs-server-sidecar-fluentbit.selectorLabels" . | nindent 8 }}
spec:
{{- with .Values.imagePullSecrets }}
imagePullSecrets:
{{- toYaml . | nindent 8 }}
{{- end }}
serviceAccountName: {{ include "ke-use-nfs-server-sidecar-fluentbit.serviceAccountName" . }}
securityContext:
{{- toYaml .Values.podSecurityContext | nindent 8 }}
volumes:
{{- range $persistentVolumeClaim := .Values.persistentVolumeClaims }}
- name: {{ $persistentVolumeClaim.type }}
persistentVolumeClaim:
claimName: {{ $persistentVolumeClaim.name }}
{{- end}}
{{- if .Values.sidecars.enabled }}
- name: fluent-bit-config
configMap:
name: fluent-bit-configmap
- name: shared-data
emptyDir: {}
{{- end }}
containers:
- name: {{ .Chart.Name }}
securityContext:
{{- toYaml .Values.securityContext | nindent 12 }}
image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}"
imagePullPolicy: {{ .Values.image.pullPolicy }}
env:
- name: NODE_ENV
value: {{ .Values.envConfig.NODE_ENV }}
- name: ENVIRONMENT
value: {{ .Values.envConfig.ENVIRONMENT }}
envFrom:
{{- range $config := .Values.configs }}
- configMapRef:
name: {{ $config.name }}
{{- end}}
ports:
{{- range .Values.service.ports }}
{{- if eq .name "http" }}
- name: {{ .name }}
containerPort: {{ .targetPort }}
protocol: TCP
{{- end }}
{{- end }}
volumeMounts:
{{- range $persistentVolumeClaim := .Values.persistentVolumeClaims }}
- name: {{ $persistentVolumeClaim.type }}
mountPath: {{ $persistentVolumeClaim.mountPath }}
{{- end}}
{{- if .Values.sidecars.enabled }}
{{- range $container := .Values.sidecars.containers }}
{{- range $volumeMount := $container.volumeMounts }}
- name: {{ $volumeMount.name }}
mountPath: {{ $volumeMount.mountPath }}
{{- end}}
{{- end}}
{{- end}}
{{- if .Values.sidecars.enabled }}
{{- toYaml .Values.sidecars.containers | nindent 8 }}
{{- end }}
# livenessProbe:
# httpGet:
# path: /
# port: http
# readinessProbe:
# httpGet:
# path: /
# port: http
resources:
{{- toYaml .Values.resources | nindent 12 }}
{{- with .Values.nodeSelector }}
nodeSelector:
{{- toYaml . | nindent 8 }}
{{- end }}
{{- with .Values.affinity }}
affinity:
{{- toYaml . | nindent 8 }}
{{- end }}
{{- with .Values.tolerations }}
tolerations:
{{- toYaml . | nindent 8 }}
{{- end }}
Reference
https://docs.fluentbit.io/manual/installation/kubernetes
https://github.com/fluent/helm-charts
https://docs.fluentbit.io/manual/administration/configuring-fluent-bit/classic-mode/format-schema
https://github.com/somaz94/cicd-monitoring/tree/main/onpremise/ingress-nginx-sidecar-fluentbit
'Monitoring' 카테고리의 다른 글
Loki와 Promtail 설치 (5) | 2024.10.02 |
---|---|
Loki란? (4) | 2024.09.26 |
Prometheus 와 Thanos 설치 및 구성 (0) | 2024.09.19 |
Prometheus와 Thanos란? (4) | 2024.09.12 |