티스토리 뷰

목차

1. 쿠버네티스 구성 살펴보기 

2. 인프라 설정 및 Nginx 띄워보기 

3. ArgoCD 개념 파악 및 배포하기 

4. ELK Stack으로 로그 모니터링 시스템 구축하기 👈 here

5. Prometheus와 Grafana 사용해보기

 

이번 포스팅에서는 ELK Stack을 사용하여 로그를 수집하고 모니터링하는 로그 모니터링 시스템을 구축해 보겠다.

우선 ELK Stack에 대해 알아보자.

ELK Stack이란

ELK Stack이란 ElasticSearch, Kibana, FileBeats, LogStash 서비스를 사용하여 여러 시스템의 로그를 수집하고 전처리한 뒤 데이터 분석과 시각화 시스템을 제공하는 로그 관리 총 집합체이다. ELK Stack을 구성하는 서비스들의 역할은 다음과 같다.

 

FileBeats

FileBeats는 여러 시스템의 로그 데이터를 중앙 집중화하고 ElasticSearch나 LogStash로 전달하는 역할을 한다. 설정 파일에 데이터를 수집할 경로를 지정하고 FileBeats를 실행시키면, 해당 경로에서 로그 파일들을 찾고 harvester라는 컴포넌트가 각 파일의 로그 한줄씩을 읽어 데이터를 수집하고 전달한다.

LogStash

LogStash는 입력된 데이터를 읽어 정의된 데이터 형태에 맞게 구조화한다. 임의의 텍스트를 기준으로 데이터를 필터링한다던가, IP 주소를 읽어 지리적 위치를 추가한다던가 등의 전처리가 가능하다. 전처리된 데이터는 그대로 파일로 다시 쓰거나 데이터독 등 특정 서비스로 전달하는 플러그인을 사용해 전달한다. 우리는 ElasticSearch로 데이터를 전달할 것이다.

ElasticSearch(ES)

ElasticSearch는 RESTful 검색 및 분석 엔진으로, 대용량의 데이터로 검색 속도가 굉장히 빠르다는 특징이 있다. 검색창에 키워드를 칠 때마다 연관 검색어를 그때 그때 제공하는 것도 ES를 사용한다.

Kibana

Kibana는 데이터를 시각화해주는 오픈소스 인터페이스이다.


설치하기

우리는 이전 포스팅에서 살펴본 helm chart 방식으로 관리할 것이다. 오픈 소스로 제공하는 chart 를 가져오고 values.yaml만 업데이트하여 설치할 것이다. (참고)

(처음에는 이 방법을 못찾아서 내 repo에 오픈 소스 코드를 다 추가했었다 ㅎㅎ;)

 

우선 FileBeats의 values.yml을 일부를 살펴보자.

  daemonSet:
    podTemplate:
      spec:
        containers:
          - name: filebeat
            volumeMounts:
              - name: varlogcontainers
                mountPath: /var/log/containers
              - name: varlogpods
                mountPath: /var/log/pods
            env:
            - name: NODE_NAME
              valueFrom:
                fieldRef:
                  fieldPath: spec.nodeName
        volumes:
          - name: varlogcontainers
            hostPath:
              path: /var/log/containers
          - name: varlogpods
            hostPath:
              path: /var/log/pods

데이터를 수집할 /var/log/containers 와 /var/log/pods를 filebeat와 매핑한다. 

그리고 아래와 같이 전달자에 대한 설정을 작성한다.

  config:
    filebeat:
      autodiscover:
        providers:
          - type: kubernetes
            node: ${NODE_NAME}
            hints:
              enabled: true
              default_config:
                type: container
                paths: [ "/var/log/containers/*${data.kubernetes.container.id}.log" ]
    processors:
      - add_cloud_metadata: {}
      - add_host_metadata: {}
    output.logstash:
      hosts: [ logstash-logstash:5044 ]

autodiscover는 모니터링 대상이다. kubernetes로 설정하여 노드,포드 등 서비스의 시작 및 업데이트를 감시한다. output은 LogStash로 데이터를 보낼 것이다. LogStash의 host값을 어디서 찾는지 헤맸는데, svc name을 지정해 주면 된다.


그다음 LogStash의 values.yaml을 살펴보자.

logstashPipeline:
  logstash.conf: |
    input {
      beats {
        port => 5044
      }
    }
    filter {
      mutate {
        remove_field => [ "agent", "container", "ecs", "event", "input", "log", "tags" ]
      }
      mutate {
        rename => {
          "[host][name]" => "node"
          "[kubernetes][namespace]" => "namespace"
          "[kubernetes][pod][name]" => "pod"
          "[kubernetes][container][name]" => "container"
        }
      }
      mutate {
        remove_field => [ "host", "kubernetes" ]
      }
    }
    output {
      elasticsearch {
        hosts => [ "https://eck-elasticsearch-es-http:9200" ]
        ssl_certificate_verification => false
        user => "elastic"
        password => "${elastic}"
        index => "stdout" 
      }
    }

input, filter, output에 대한 파이프라인을 정의하고 있다. input을 보면 beats와 연결되어 5044 포트로 수신받는다. 그리고 output은 ElasticSearch의 stdout으로 인덱싱하도록 세팅되어있다. ES의 hosts 역시 svc name을 확인하면 된다. 마지막으로 filter에서 mutate는 필드의 이름을 삭제하거나 수정할 때 사용된다. 소개 페이지에 더 많은 filter 플러그인이 있다.


다음은 ElasticSearch의 values.yml을 살펴보자.

nodeSets:
- name: default
  count: 1
  config:
    node.store.allow_mmap: false
    xpack.monitoring.collection.enabled: true
  podTemplate:
    spec:
      containers:
      - name: elasticsearch
        resources:
          requests:
            cpu: 1
          limits:
            memory: 1Gi

node roles에 따라 인덱스 수명 주기를 정의할 수 있는데, 우선 나는 가장 기본인 템플릿만 작성하였다. (참고)


마지막으로 kibana values.yaml을 살펴보자.

spec:
  count: 1
  elasticsearchRef:
    name: eck-elasticsearch
  http:
    service:
      spec:
        type: LoadBalancer
    tls:
      selfSignedCertificate:
        disabled: true

kibana에서 웹 UI로 시각화 정보를 확인하므로 외부 접근이 가능해야 한다. LoadBalancer 타입의 서비스를 만들고 elasticsearchRef에 elasticsearch name을 추가한다.

 

ELK Stak 리소스 들의 conf 설정을 완료하면 커밋한 뒤 ArgoCD에서 sync를 통해 배포한다. 그러면 아래와 같이 kibana의 LoadBalancer URL로 페이지 접근이 가능해진다. 

초기 Username은 elastic이고 password는 해당 명령으로 확인할 수 있다.

kubectl get secret eck-elasticsearch-es-elastic-user -o=jsonpath='{.data.elastic}' -n elastic | base64 --decode; echo

수집 로그 확인하기

마지막으로 ES에 stdout 인덱스를 생성하고 데이터 수집 정보를 확인해보자.

인덱스 생성하기

kibana의 Management > Dev Tools > Console에서 API Request를 통해 인덱스를 생성할 수 있다. logstash에서 설정한 stdout 인덱스를 생성해보자.

PUT /stdout
{
  "settings": {
    "number_of_shards": 1,
    "number_of_replicas": 1
  },
  "mappings": {
    "properties": {
      "message": {
        "type": "text"
      },
      "level": {
        "type": "keyword"
      },
      "timestamp": {
        "type": "date"
      }
    }
  }
}

만들고 나면 GET으로 데이터를 조회해볼 수 있다. 아직 데이터가 없다면 임의로 하나 넣어보고 테스트 해봐도 좋다! 응답이 매우 빠르다.

여기서 조건에 따라 다양하게 검색해 볼 수 있다.

 

그리고 Management > Data > Index Management에서 추가된 인덱스도 확인 할 수 있다.

마지막으로 추이 그래프는 Analytics > Discover에서 확인할 수 있다.

 

키워드로 필터링도 가능하다. 아래는 log level이 error인 것을 검색해본 것이다.

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
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
글 보관함