ㅡ.ㅡ

[Logging] APP Logging/Fluentd&Fluentbit 본문

Observabillity

[Logging] APP Logging/Fluentd&Fluentbit

ekwkqk12 2021. 10. 17. 13:11

통신 구조

APP << 로그 볼륨 공유 >> Fluentbit(tail/forward) >> Fluentd(forward/file)

APP&Fluentbit

env에 쿠버네티스 메타데이터 값을 추가하여 APP 로깅 및 Fluentbit에서 TAG값으로 사용한다.
fluentbit와 APP Pod간에 동일한 볼륨을 마운트하여 Log를 공유해준다.

Deployment.yaml

  template:
    metadata:
      labels:
        app: {{ .Values.app_name }}
    spec:
      {{- with .Values.imagePullSecrets }}
      imagePullSecrets:
        {{- toYaml . | nindent 8 }}
      {{- end }}
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            - matchExpressions:
              - key: alpha.eksctl.io/nodegroup-name
                operator: In
                values:
                - {{ .Values.label_value }}
      containers:
        - name: {{ .Values.app_name }}
          image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
          env:
            - name: POD_NAME
              valueFrom:
                fieldRef:
                  fieldPath: metadata.name
            - name: NODE_NAME
              valueFrom:
                fieldRef:
                  fieldPath: spec.nodeName 
          ports:
            - containerPort: 8080
              protocol: TCP
          volumeMounts:
            - name: data
              mountPath: /data/logs
        - name: fluent-bit-sidecar
          image: fluent/fluent-bit
          env:
            - name: POD_NAME
              valueFrom:
                fieldRef:
                  fieldPath: metadata.name
            - name: POD_NAMESPACE
              valueFrom:
                fieldRef:
                  fieldPath: metadata.namespace
            - name: NODE_NAME
              valueFrom:
                fieldRef:
                  fieldPath: spec.nodeName
            - name: POD_UID
              valueFrom:
                fieldRef:
                  fieldPath: metadata.uid
            - name: APP_NAME
              valueFrom:
                fieldRef:
                  fieldPath: metadata.labels['app']      
          volumeMounts:
            - name: data
              mountPath: /data/logs
            - name: fluent-bit-sidecar-config
              mountPath: /fluent-bit/etc/
            - name: fluent-bit-buffer
              mountPath: /var/log/buffer
              subPathExpr: ${POD_NAMESPACE}/${POD_NAME}
      volumes:
        - name: data
          emptyDir: {}
        - name: fluent-bit-sidecar-config
          configMap:
            name: fluent-bit-sidecar-config
        - name: fluent-bit-buffer
          hostPath:
            path: /var/log/flb-buffers
            type: DirectoryOrCreate

fluentbit config
APP log가 저장되는 경로의 로그파일들을 모니터링하며 추가된 데이터를 fluentd에 24224포트로 전송해주는 설정이다.
deployment.yaml에서 추가해준 meta data들을 Tag값에 설정하고 Path설정에 * 부분이 값으로 매핑되어 Tag가 생성되게 된다.

apiVersion: v1
kind: ConfigMap
metadata:
  name: fluent-bit-sidecar-config
data:
  # Configuration files: server, input, filters and output
  # ======================================================
  fluent-bit.conf: |
    [SERVICE]
        Flush               1
        Log_Level           info
        Daemon              off
    [INPUT]
        Name                tail
        Path                /data/logs/*.log
        Tag                 ${APP_NAME}-<logname>
        Tag_Regex           /data/logs/(?<logname>[^.]+).log
        Refresh_Interval    10
        Mem_Buf_Limit       50MB        
        Skip_Long_Lines     On      
    [OUTPUT]
        Name                forward
        Match               *
        Host                fluentd 주소
        Port                24224

logback-spring.xml
deployment에 지정해준 환경변수값을 추가하여 로그에 POD가 생성된 노드이름, 파드이름을 추가하여 로그를 남김

<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds"> 
    <springProperty scope="context" name="LOG_LEVEL" source="logging.level.root"/> 

    <property name="LOG_PATH" value="${LOG_HOME}"/>
    <property name="LOG_FILE_NAME" value="stdout"/> 
    <property name="ERR_LOG_FILE_NAME" value="error"/> 

    <property name="LOG_PATTERN_HIGHLIGHTED"
              value="${NODE_NAME} ${POD_NAME} %highlight(%-5level) %d{yy-MM-dd HH:mm:ss} [%logger{0}:%line] - %msg%n"/> 
    <property name="LOG_PATTERN"
              value="${NODE_NAME} ${POD_NAME} %-5level %d{yy-MM-dd HH:mm:ss} [%logger{0}:%line] - %msg%n"/> 

APP에는 access, error, std 로그가 생성됨

Sidecar Fluentbit에서는 해당 파일들을 모니터링

Fluentd

Helm Chart Download
helm repo add fluent https://fluent.github.io/helm-charts
helm repo update
helm pull fluent/fluentd --untar

values.yaml
1~4 : 이름 지정

187~196 : NLB 지정 및 forward 서비스 사용(ALB를 사용하려 했으나 TCP 통신이 아니여서 전송 오류가 계속 발생했었음 forward를 http로 사용하면 해결될거같긴함)

257~261 : grafana dashboard 비활성화(기본값으로 활성화되어있는데 오류발생함)

276~283: kubernetes관련 conf는 모두 제거 후 fluentbit에서 전송해주는 로그를 받는 설정

285~297

match : 태그 안에 Tag값을 입력하여 Tag별로 제어를 할수있음 아래 설정은 다동일하게 파일을 쓰게하는 설정

path, append : 입력받은 데이터를 생성할 파일경로 + 파일명 및 하나의 파일로 생성

format : 해당 설정알 하지않으면 json형태로 데이터를 받은시간, 태그값?, 데이터(log) 형태로 생성되지만 log부분만 파일에 쓰겠다는 설정

  1 nameOverride: "fluentd"
  2 fullnameOverride: "fluentd"
  3
  4 # DaemonSet or Deployment
  5 kind: "Deployment"


187 service:
188   type: "LoadBalancer"
189   annotations: {
190     service.beta.kubernetes.io/aws-load-balancer-type: "nlb-ip",
191     service.beta.kubernetes.io/aws-load-balancer-scheme: internet-facing
192   }
193   ports:
194   - name: "forwarder"
195     protocol: TCP
196     containerPort: 24224

257 dashboards:
258   enabled: "false"
259   namespace: ""
260   labels:
261     grafana_dashboard: '"1"'

276 fileConfigs:
277   custom.conf: |-
278     ## logs from podman
279     <source>
280       @type forward
281       port 24224
282       bind 0.0.0.0
283     </source>
284
285     <match **>
286       @type file 
287       path /data/logs/${tag}.%Y%m%d
288       append true
289       <buffer tag,time>
290         flush_mode interval
291         flush_interval 10s
292       </buffer>
293       <format>
294         @type single_value
295         message_key log
296       </format>
297     </match>

fluentdbit에서 전달받은 데이터가 저장되는 모습으로 2개의 POD에 로그가 저장된것을 볼수있다.