[K8S] APP Logging/Fluentd&Fluentbit

[K8S] APP Logging/Fluentd&Fluentbit

통신 구조

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

APP

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}- Tag_Regex /data/logs/(?[^.]+).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가 생성된 노드이름, 파드이름을 추가하여 로그를 남김

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 280 @type forward 281 port 24224 282 bind 0.0.0.0 283 284 285 286 @type file 287 path /data/logs/${tag}.%Y%m%d 288 append true 289 290 flush_mode interval 291 flush_interval 10s 292 293 294 @type single_value 295 message_key log 296 297

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

from http://ekwkqk12.tistory.com/43 by ccl(A) rewrite - 2021-10-17 13:27:11