쿠버네티스 로깅 설정

쿠버네티스 로깅 설정


서론


쿠버네티스(Kubernetes)는 컨테이너화된 애플리케이션의 배포, 확장 및 관리를 자동화하는 데 유용한 플랫폼입니다. 그러나 여러 컨테이너와 파드가 실행되는 복잡한 환경에서는 로깅(logging)이 매우 중요합니다. 로깅은 시스템의 상태를 모니터링하고, 문제를 해결하며, 성능을 분석하는 데 필수적입니다. 이번 포스팅에서는 EFK(Elasticsearch, Fluentd, Kibana) 스택을 이용하여 쿠버네티스에서 로깅을 설정하는 방법을 초보자도 이해할 수 있도록 자세히 설명합니다.


본론


EFK 스택 소개


EFK 스택은 Elasticsearch, Fluentd, Kibana로 구성된 로깅 스택입니다. 각 구성 요소의 역할은 다음과 같습니다.


  • Elasticsearch: 수집된 로그 데이터를 저장하고 검색할 수 있는 분산 검색 엔진입니다.
  • Fluentd: 로그 데이터를 수집하고 다양한 출력 대상으로 전달하는 오픈 소스 데이터 수집기입니다.
  • Kibana: Elasticsearch에서 저장된 로그 데이터를 시각화하고 분석할 수 있는 웹 인터페이스입니다.

EFK 스택 설치 및 설정


1. Elasticsearch 설치


Elasticsearch는 로그 데이터를 저장하고 검색하는 역할을 합니다. 다음은 쿠버네티스에 Elasticsearch를 설치하는 예시입니다.


apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: elasticsearch
spec:
  serviceName: "elasticsearch"
  replicas: 1
  selector:
    matchLabels:
      app: elasticsearch
  template:
    metadata:
      labels:
        app: elasticsearch
    spec:
      containers:
      - name: elasticsearch
        image: docker.elastic.co/elasticsearch/elasticsearch:7.10.1
        ports:
        - containerPort: 9200
        - containerPort: 9300
        env:
        - name: discovery.type
          value: single-node
---
apiVersion: v1
kind: Service
metadata:
  name: elasticsearch
spec:
  ports:
  - port: 9200
  selector:
    app: elasticsearch

이 YAML 파일을 사용하여 Elasticsearch를 설치합니다.


kubectl apply -f elasticsearch.yaml

2. Fluentd 설치


Fluentd는 로그 데이터를 수집하고 Elasticsearch로 전송하는 역할을 합니다. 다음은 쿠버네티스에 Fluentd를 설치하는 예시입니다.


apiVersion: v1
kind: ConfigMap
metadata:
  name: fluentd-config
  namespace: kube-system
data:
  fluent.conf: |
    <source>
      @type forward
      port 24224
    </source>
    <match **>
      @type elasticsearch
      host elasticsearch
      port 9200
      logstash_format true
      logstash_prefix fluentd
      logstash_dateformat %Y.%m.%d
      include_tag_key true
      tag_key @log_name
      flush_interval 1s
    </match>
---
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: fluentd
  namespace: kube-system
spec:
  selector:
    matchLabels:
      name: fluentd
  template:
    metadata:
      labels:
        name: fluentd
    spec:
      containers:
      - name: fluentd
        image: fluent/fluentd:v1.11-1
        env:
        - name: FLUENT_ELASTICSEARCH_HOST
          value: "elasticsearch"
        - name: FLUENT_ELASTICSEARCH_PORT
          value: "9200"
        volumeMounts:
        - name: config-volume
          mountPath: /fluentd/etc/fluent.conf
          subPath: fluent.conf
        - name: varlog
          mountPath: /var/log
      volumes:
      - name: config-volume
        configMap:
          name: fluentd-config
      - name: varlog
        hostPath:
          path: /var/log

이 YAML 파일을 사용하여 Fluentd를 설치합니다.


kubectl apply -f fluentd.yaml

3. Kibana 설치


Kibana는 Elasticsearch에 저장된 로그 데이터를 시각화하는 역할을 합니다. 다음은 쿠버네티스에 Kibana를 설치하는 예시입니다.


apiVersion: apps/v1
kind: Deployment
metadata:
  name: kibana
spec:
  replicas: 1
  selector:
    matchLabels:
      app: kibana
  template:
    metadata:
      labels:
        app: kibana
    spec:
      containers:
      - name: kibana
        image: docker.elastic.co/kibana/kibana:7.10.1
        ports:
        - containerPort: 5601
        env:
        - name: ELASTICSEARCH_URL
          value: "http://elasticsearch:9200"
---
apiVersion: v1
kind: Service
metadata:
  name: kibana
spec:
  ports:
  - port: 5601
  selector:
    app: kibana

이 YAML 파일을 사용하여 Kibana를 설치합니다.


kubectl apply -f kibana.yaml

EFK 스택 구성 요소 설명


Elasticsearch


Elasticsearch는 로그 데이터를 저장하고 검색할 수 있는 분산형 검색 엔진입니다. 쿠버네티스 클러스터에서 로그 데이터를 수집하여 중앙 집중식으로 저장하고, Kibana와 같은 도구를 통해 쉽게 검색하고 분석할 수 있습니다.


Fluentd


Fluentd는 로그 데이터를 수집하고 다양한 출력 대상으로 전달하는 오픈 소스 데이터 수집기입니다. Fluentd는 플러그인 기반 아키텍처를 가지고 있어 다양한 로그 소스를 수집하고 처리할 수 있습니다. 쿠버네티스 환경에서는 DaemonSet으로 배포되어 각 노드에서 로그 데이터를 수집합니다.


Kibana


Kibana는 Elasticsearch에 저장된 로그 데이터를 시각화하고 분석할 수 있는 웹 인터페이스입니다. Kibana를 사용하면 로그 데이터를 쉽게 탐색하고, 대시보드를 생성하여 시각화할 수 있습니다. 이를 통해 시스템의 상태를 모니터링하고 문제를 빠르게 감지할 수 있습니다.


EFK 스택 활용 예제


로그 데이터 수집


EFK 스택을 사용하면 애플리케이션 로그, 시스템 로그, 보안 로그 등 다양한 로그 데이터를 수집할 수 있습니다. Fluentd는 로그 데이터를 수집하여 Elasticsearch로 전송하고, Elasticsearch는 데이터를 저장합니다.


로그 데이터 검색


Kibana를 사용하여 Elasticsearch에 저장된 로그 데이터를 검색할 수 있습니다. 특정 시간 범위 내의 로그를 검색하거나, 특정 조건에 맞는 로그를 필터링하여 볼 수 있습니다.


GET /fluentd-*/_search
{
  "query": {
    "match": {
      "log": "error"
    }
  }
}

로그 데이터 시각화


Kibana 대시보드를 사용하여 로그 데이터를 시각화할 수 있습니다. 예를 들어, 특정 시간 범위 내의 에러 로그 수를 그래프로 표시하거나, 각 서비스별 로그 수를 비교하는 차트를 생성할 수 있습니다.


로그 모니터링 및 경고 설정


EFK 스택을 사용하여 로그 데이터를 모니터링하고 경고를 설정할 수 있습니다. 예를 들어, 특정 오류 메시지가 발생할 때 경고를 설정하거나, 로그 수가 일정 임계값을 초과할 때 알림을 받을 수 있습니다.


경고 설정 예제


Elasticsearch와 Kibana를 사용하여 경고를 설정하는 방법은 다음과 같습니다.


  1. Kibana 경고 설정

Kibana에서 "Alerting" 기능을 사용하여 경고를 설정할 수 있습니다. 특정 조건이 만족되면 이메일, Slack, PagerDuty 등으로 알림을 보낼 수 있습니다.


  1. Elasticsearch Watcher 설정

Elasticsearch의 Watcher 기능을 사용하여 경고를 설정할 수 있습니다. Watcher는 Elasticsearch 쿼리를 주기적으로 실행하여 조건을 만족하면 알림을 보냅니다.


PUT _watcher/watch/error_watch
{
  "trigger": {
    "schedule": {
      "interval": "1m"
    }
  },
  "input": {
    "search": {
      "request": {
        "indices": [
          "fluentd-*"
        ],
        "body": {
          "query": {
            "match": {
              "log": "error"
            }
          }
        }
      }
    }
  },
  "actions": {
    "email_admin": {
      "email": {
        "to": "admin@example.com",
        "subject": "Error Logs Detected",
        "body": "There are {{ctx.payload.hits.total}} error logs in the last minute."
      }
    }
  }
}

이 설정은 1분마다 "fluentd-*" 인덱스를 검색하여 "error" 로그가 있는지 확인하고, 발견되면 이메일 알림을 보냅니다.


결론


EFK(Elasticsearch, Fluentd, Kibana) 스택은 쿠버네티스 클러스터에서 로그 데이터를 수집, 저장, 시각화하는 데 매우 유용한 도구입니다. 이번 포스팅에서는 EFK 스택의 개념, 설치 방법, 설정 방법, 그리고 활용 예제에 대해 자세히 설명했습니다. 이를 통해 쿠버네티스 클러스터에서 효과적으로 로그를 관리하고 모니터링할 수 있기를 바랍니다.

다음 이전