일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- CD
- ECR
- scraping
- 모의해킹
- gitlab ci
- Kubernetes
- 크롤링
- 스크레이핑
- Resource
- eks
- Jenkins
- Prometheus
- gitlab cd
- 웹 해킹
- helm
- sonarqube
- Service Mesh
- GitLab
- linkerd
- argocd
- Monitoring
- docker
- Crawling
- CI
- 웹 취약점
- deploy
- opentelemetry
- DevOps
- Grafana
- CI/CD
- Today
- Total
ㅡ.ㅡ
[Logging] APP Logging/Fluentd&Fluentbit 본문
통신 구조
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에 로그가 저장된것을 볼수있다.
'Observabillity' 카테고리의 다른 글
[Monitoring] JVM Exporter(Micrometer) (0) | 2022.01.20 |
---|---|
[Monitoring] Prometheus-Stack (0) | 2021.10.31 |
[K8S] Kubernetes Dashboard (0) | 2021.01.30 |
[Monitoring] snmp_exporter(fortigate) (0) | 2021.01.23 |
[Monitoring] 도커 컨테이너(호스트) 모니터링 (0) | 2021.01.23 |