Monitoring

Fluent Bit (With Loki)

Somaz 2024. 3. 8. 17:55
728x90
반응형

Overview

Fluent Bit에 대해서 알아보자.

출처 : https://fluentbit.io/

 


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)

출처 : https://fluentbit.io/how-it-works/

 

 

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: 로그 데이터의 키 이름을 변경한다.
  • 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` 두가지의 형식으로 작성해본다.

 


 

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://fluentbit.io/

https://docs.fluentbit.io/manual/administration/configuring-fluent-bit/classic-mode/format-schema

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

https://fluentbit.io/how-it-works/

728x90
반응형