본문 바로가기
개발인생/Kubernetes

Install) EFK(3) - fluent-bit 설치

by DevOps_901126 2023. 5. 8.
반응형

Fluent-bit

  • Fluent-bit는 모든 노드에서 컨테이너 로그를 수집하기 위해 daemonset으로 배포되고, Elasticsearch 서비스 엔드포인트에 연결하여 로그를 전달합니다.
  • Fluent-bit 없이 Fluentd만 설치하여 로그를 보낼 수 있지만 규모가 큰 클러스터에서는 Fluentd의 작업량이 많아져 부하가 생기기 때문에 로그를 전송하는 역할만하는 Fluent-bit을 따로 설치하는게 좋다.
  • Fluent-bit 에서 필요하지 않은 로그를 필터링해 전송하는 로그양을 줄이고 Fluentd에서 파싱을 적절히 하여 ElasticSearch로 전송하는데 도움을 준다.

 

1. Fluent-bit 서비스 계정 생성

: 서비스 계정은 pod가 수행할 수 있는 작업을 결정하는 pod 집합에 대한 Kubernetes API에 대한 액세스를 제어할 수 있는 Kubernetes 리소스입니다. 역할 및 역할 바인딩을 서비스 계정에 연결하여 Kubernetes API에 액세스할 수 있는 특정 권한을 부여할 수 있습니다. 이는 Kubernetes 역할 및 역할 바인딩 리소스를 통해 수행됩니다.

$ vi fluent-bit-sa.yaml

apiVersion: v1
kind: ServiceAccount
metadata:
  name: fluent-bit-sa
  namespace: efk
  labels:
    app: fluent-bit-sa

 

2. Fluent-bit ClusterRole 생성

: 노드 , 포드 및 네임스페이스 개체 와 같은 Kubernetes 리소스의 유창한 비트 서비스 계정에 , get, list, watch 권한을 부여하는 ClusterRole입니다 .

$ vi fluent-bit-cr.yaml

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: fluent-bit-role
  labels:
    app: fluent-bit-role
rules:
  – nonResourceURLs:
      – /metrics
    verbs:
      – get
  – apiGroups: [""]
    resources:
      – namespaces
      – pods
      – pods/logs
    verbs: ["get", "list", "watch"]

 

3. Fluent-bit RoleBinding 만들기

: ClusterRole을 "fluent-bit-sa" 서비스 계정에 바인딩하는 ClusterRoleBinding은 해당 ServiceAccount에 ClusterRole에 정의된 권한을 부여합니다.

$ vi fluent-bit-crb.yaml

kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: fluent-bit-rb
roleRef:
  kind: ClusterRole
  name: fluent-bit-role
  apiGroup: rbac.authorization.k8s.io
subjects:
– kind: ServiceAccount
  name: fluent-bit-sa
  namespace: efk

 

4. Fluent-bit ConfigMap 만들기

: 이 ConfigMap은 pod 정의에서 ConfigMap 필드를 지정하여 Fluent-bit pod를 구성하는 데 사용됩니다. 이렇게 하면 pod가 시작될 때 configmap에 정의된 구성을 사용합니다. ConfigMap은 업데이트 및 변경이 가능하며 pod 자체를 다시 생성할 필요 없이 반영됩니다.

$ vi fluent-bit-configmap.yaml

apiVersion: v1
kind: ConfigMap
metadata:
  name: fluent-bit-config
  namespace: efk
  labels:
    k8s-app: f-bit-pod
data:
  # Configuration files: server, input, filters and output
  # ======================================================
  fluent-bit.conf: |
    [SERVICE]
        Flush         1
        Log_Level     info
        Daemon        off
        Parsers_File  parsers.conf
        HTTP_Server   On
        HTTP_Listen   0.0.0.0
        HTTP_Port     2020
    @INCLUDE input-kubernetes.conf
    @INCLUDE filter-kubernetes.conf
    @INCLUDE output-elasticsearch.conf
  input-kubernetes.conf: |
    [INPUT]
        Name              tail
        Tag               kube.*
        Path              /var/log/containers/*.log
        Parser            docker
        DB                /var/log/flb_kube.db
        Mem_Buf_Limit     5MB
        Skip_Long_Lines   On
        Refresh_Interval  10
  filter-kubernetes.conf: |
    [FILTER]
        Name                kubernetes
        Match               kube.*
        Kube_URL            <https://kubernetes.default.svc:443>
        Kube_CA_File        /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
        Kube_Token_File     /var/run/secrets/kubernetes.io/serviceaccount/token
        Kube_Tag_Prefix     kube.var.log.containers.*
        Merge_Log           On
        Merge_Log_Key       log_processed
        K8S-Logging.Parser  On
        K8S-Logging.Exclude Off
  output-elasticsearch.conf: |
    [OUTPUT]
        Name            es
        Match           *
        Host            ${FLUENT_ELASTICSEARCH_HOST}
        Port            ${FLUENT_ELASTICSEARCH_PORT}
        HTTP_User       ${FLUENT_ELASTICSEARCH_USER}
        HTTP_Passwd     ${FLUENT_ELASTICSEARCH_PASSWORD}
        Logstash_Format On
        Replace_Dots    On
        Retry_Limit     False
  parsers.conf: |
    [PARSER]
        Name   apache
        Format regex
        Regex  ^(?[^ ]*) [^ ]* (?[^ ]*) \\[(?[^\\]]*)\\] "(?\\S+)(?: +(?[^\\"]*?)(?: +\\S*)?)?" (?[^ ]*) (?[^ ]*)(?: "(?[^\\"]*)" "(?[^\\"]*)")?$
        Time_Key time
        Time_Format %d/%b/%Y:%H:%M:%S %z
    [PARSER]
        Name   apache2
        Format regex
        Regex  ^(?[^ ]*) [^ ]* (?[^ ]*) \\[(?[^\\]]*)\\] "(?\\S+)(?: +(?[^ ]*) +\\S*)?" (?[^ ]*) (?[^ ]*)(?: "(?[^\\"]*)" "(?[^\\"]*)")?$
        Time_Key time
        Time_Format %d/%b/%Y:%H:%M:%S %z
    [PARSER]
        Name   apache_error
        Format regex
        Regex  ^\\[[^ ]* (?[^\\]]*)\\] \\[(?[^\\]]*)\\](?: \\[pid (?[^\\]]*)\\])?( \\[client (?[^\\]]*)\\])? (?.*)$
    [PARSER]
        Name   nginx
        Format regex
        Regex ^(?[^ ]*) (?[^ ]*) (?[^ ]*) \\[(?[^\\]]*)\\] "(?\\S+)(?: +(?[^\\"]*?)(?: +\\S*)?)?" (?[^ ]*) (?[^ ]*)(?: "(?[^\\"]*)" "(?[^\\"]*)")?$
        Time_Key time
        Time_Format %d/%b/%Y:%H:%M:%S %z
    [PARSER]
        Name   json
        Format json
        Time_Key time
        Time_Format %d/%b/%Y:%H:%M:%S %z
    [PARSER]
        Name        docker
        Format      json
        Time_Key    time
        Time_Format %Y-%m-%dT%H:%M:%S.%L
        Time_Keep   On
    [PARSER]
        Name        syslog
        Format      regex
        Regex       ^\\<(?[0-9]+)\\>(?[^ ]* {1,2}[^ ]* [^ ]*) (?[^ ]*) (?[a-zA-Z0-9_\\/\\.\\-]*)(?:\\[(?[0-9]+)\\])?(?:[^\\:]*\\:)? *(?.*)$
        Time_Key    time
        Time_Format %b %d %H:%M:%S

이 매니페스트 파일의 구성은 다음을 포함하여 여러 섹션을 지정합니다.

  • [SERVICE]: 서비스의 플러시 시간과 로그 수준을 지정합니다.
  • [INPUT]: Fluent-bit가 로그 데이터를 수집하는 데 사용해야 하는 입력 플러그인을 지정합니다. 이 경우 플러그인은 "tail"이며 지정된 경로의 파일에서 로그를 수집하는 데 사용됩니다. 여기서는 "/var/log/containers/*.log"입니다.
  • [FILTER]: Fluent-bit가 로그 데이터를 처리하는 데 사용해야 하는 필터 플러그인을 지정합니다. 다음은 로그 라인에서 Kubernetes 관련 메타데이터를 구문 분석하는 데 사용되는 "kubernetes"입니다.
  • [OUTPUT]: 여기에서 Fluent-bit가 로그 데이터를 Elasticsearch로 보내는 데 사용해야 하는 출력 플러그인을 지정합니다. 또한 다른 구성과 함께 Elasticsearch 끝점 호스트 및 포트를 포함합니다.
  • [PARSER] 로그 데이터의 형식과 구문 분석 방법을 지정합니다.

 

5. Fluent-bit Daemonset 만들기

: Fluent-bit Daemonset은 자동으로 모든 노드에서 로그 수집을 시작하고 이를 Elasticsearch로 보냅니다.

$ vi fluent-bit-daemonset.yaml

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: f-bit-pod
  namespace: efk
  labels:
    k8s-app: fluent-bit-logging
    version: v1
    kubernetes.io/cluster-service: "true"
spec:
  selector:
    matchLabels:
      k8s-app: fluent-bit-logging
  template:
    metadata:
      labels:
        k8s-app: fluent-bit-logging
        version: v1
        kubernetes.io/cluster-service: "true"
      annotations:
        prometheus.io/scrape: "true"
        prometheus.io/port: "2020"
        prometheus.io/path: /api/v1/metrics/prometheus
    spec:
      containers:
      – name: fluent-bit
        image: fluent/fluent-bit:1.3.11
        imagePullPolicy: Always
        ports:
          – containerPort: 2020
        env:
        – name: FLUENT_ELASTICSEARCH_HOST
          value: "elasticsearch"
        – name: FLUENT_ELASTICSEARCH_PORT
          value: "9200"
        – name: FLUENT_ELASTICSEARCH_USER
          value: "elastic"
        – name: FLUENT_ELASTICSEARCH_PASSWORD
          valueFrom:
            secretKeyRef:
              name: kibana-password
              key: password
        volumeMounts:
        – name: varlog
          mountPath: /var/log
        – name: varlibdockercontainers
          mountPath: /var/lib/docker/containers
          readOnly: true
        – name: fluent-bit-config
          mountPath: /fluent-bit/etc/
      terminationGracePeriodSeconds: 10
      volumes:
      – name: varlog
        hostPath:
          path: /var/log
      – name: varlibdockercontainers
        hostPath:
          path: /var/lib/docker/containers
      – name: fluent-bit-config
        configMap:
          name: fluent-bit-config
      serviceAccountName: fluent-bit-sa
      tolerations:
      – key: node-role.kubernetes.io/master
        operator: Exists
        effect: NoSchedule
      – operator: "Exists"
        effect: "NoExecute"
      – operator: "Exists"
        effect: "NoSchedule"

 

6. Fluent-bit 배포 확인

: 지속적으로 로그를 생성하는 pod를 생성하면 Fluent-bit가 로그를 올바르게 수집하고 Elasticsearch로 전달하는지 확인할 수 있습니다.

로그를 생성하는 스크립트나 프로그램이 있는 이미지를 이용하여 지속적으로 로그를 생성하는 pod를 생성할 수 있습니다. 예를 들어 이미지를 사용 하고 pod 내부의 루프에서 명령을 실행할 수 있습니다.

Fluent-bit용 테스트 포드를 만들어 보겠습니다.

apiVersion: v1
kind: Pod
metadata:
  name: log-generator
spec:
  containers:
  – name: log-generator
    image: busybox
    command: ['sh', '-c', 'i=0; while true; do echo "$i: Log message"; i=$((i+1)); sleep 1; done']

이를 통해 Fluent-bit가 예상대로 작동하는지 확인할 수 있으며 로그를 수집하여 Kibana에서 분석하고 시각화할 수 있는 Elasticsearch로 전달합니다.

반응형