k3s에서 애플리케이션 로그를 모아보자

jeonghyeon·2022년 10월 24일
0

Logging Architecture

Cluter-level logging architecture

Kubernetes cluster-level logging 중 컨테이너 엔진에서 남기는 로그를 logging-agent를 사용해 logging-backend로 전송하는 아래 두 가지 방법이 있습니다.

Using node logging agent

https://d33wubrfki0l68.cloudfront.net/2585cf9757d316b9030cf36d6a4e6b8ea7eedf5a/1509f/images/docs/user-guide/logging/logging-with-node-agent.png

  • application은 stdout/stderr로 로그를 출력합니다.
  • 컨테이너 엔진은 application이 stdout/stderr로 내보낸 로그를 파일에 기록합니다.
  • logging-agent는 컨테이너 엔진이 생성한 로그 파일을 수집애서 Logging Backend로 전송합니다.
  • logging-agent는 모든 노드에 실행돼야 하기 때문에 DaemonSet으로 생성합니다.

Using a sidecar container with the logging agent

https://d33wubrfki0l68.cloudfront.net/5bde4953b3b232c97a744496aa92e3bbfadda9ce/39767/images/docs/user-guide/logging/logging-with-streaming-sidecar.png

  • application에서 stdout으로 로그를 출력하지 못할 경우 volume을 생성(emtpyDir 등)하고 생성된 volume에 로그 파일을 작성합니다. (로테이트는 애플리케이션의 책임)
  • Sidecar로 appolication과 같은 Pod에 stream container(tail이나 fluentd 등)를 실행하고 volume을 마운트해서 로그를 읽습니다. 읽은 로그는 stdout/stderr로 출력합니다.
  • 컨테이너 엔진이 sidecar에서 stdout/stderr로 출력한 로그를 파일로 기록합니다.
  • DaemonSet logging-agent가 컨테이너 엔진이 생성한 로그를 수집해서 logging backend로 전송합니다.

k3s 컨테이너 로그 수집

fluentd docker image

https://github.com/fluent/fluentd-kubernetes-daemonset

kubernetes 로그를 수집하기 위한 설정과 logging-backend 가 미리 설정된 fluentd docker 이미지를 사용합니다.

로그 타입 설정

FLUENT_CONTAINER_TAIL_PARSER_TYPE를 cri로 설정해서 containerd에서 생성한 로그를 파싱할 수 있게 합니다.

GitHub - fluent/fluentd-kubernetes-daemonset: Fluentd daemonset for Kubernetes and it Docker image

env:
- name: FLUENT_CONTAINER_TAIL_PARSER_TYPE
  value: cri

timeformat 설정

FLUENT_CONTAINER_TAIL_PARSER_TIME_FORMAT 환경 변수를 설정해서 시간 값을 parsing을 처리합니다.

env:
- name: FLUENT_CONTAINER_TAIL_PARSER_TIME_FORMAT
  value: '%Y-%m-%dT%H:%M:%S.%N%:z'

배포 yaml

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: fluentd
  namespace: kube-system
  labels:
    k8s-app: fluentd-logging
    version: v1
spec:
  selector:
    matchLabels:
      k8s-app: fluentd-logging
      version: v1
  template:
    metadata:
      labels:
        k8s-app: fluentd-logging
        version: v1
    spec:
      tolerations:
      - key: node-role.kubernetes.io/control-plane
        effect: NoSchedule
      - key: node-role.kubernetes.io/master
        effect: NoSchedule
      containers:
      - name: fluentd
        image: fluent/fluentd-kubernetes-daemonset:v1-debian-elasticsearch
        env:
          - name:  FLUENT_ELASTICSEARCH_HOST
            value: "elasticsearch"
          - name:  FLUENT_ELASTICSEARCH_PORT
            value: "9200"
          - name: FLUENT_ELASTICSEARCH_SCHEME
            value: "http"
          - name: FLUENT_CONTAINER_TAIL_PARSER_TYPE
            value: cri
          - name: FLUENT_CONTAINER_TAIL_PARSER_TIME_FORMAT
            value: '%Y-%m-%dT%H:%M:%S.%N%:z'
        resources:
          limits:
            memory: 200Mi
          requests:
            cpu: 100m
            memory: 200Mi
        volumeMounts:
        - name: varlog
          mountPath: /var/log
        - name: containerlogdirectory
          mountPath: /var/log/containers
          readOnly: true
      terminationGracePeriodSeconds: 30
      volumes:
      - name: varlog
        hostPath:
          path: /var/log
      - name: containerlogdirectory
        hostPath:
          path: /var/log/containers

0개의 댓글