ELK Stack

김홍석·2024년 7월 21일

모니터링

목록 보기
3/3

ELK + Filebeats

1. 정의

ELK란 (Elasticsearch + Logstash + Kibana) 를 합쳐놓은것을 ELK라고 한다. Beats를 합쳐놓은 것을 형태를 ELK Stack이라고 한다.

  • 시스템 구조

fIlebeat에서 Logstash로 전송을 하고 Logstash에서 필터릴를 해서 Elasticsearch로 보내고 저장하고 그걸 Kibana로 시각화 해서 볼 수 있다.

FIlebeats

파일에 저장된 로그파일을 실시간으로 수집해서 Logstash나 Elasticsearch로 보낸다. 경량화 로그 수집기 이다.

Logstash

다양한 로그들을 수집하고 그걸 필요한 데이터들로만 필터를 하고 추출해 Elasticsearch로 넘겨준다.

Elasticsearch

검색엔진인데 이게 용도가 로그 데이터, 메트릭스, 분석 쿼리 등을 저장하고 빠르게 검색하는 데 사용이된다.

Kibana

Elasticsearch에서 수집된 데이터를 기반으로 다양한 시각화(차트, 그래프 등)를 할 수 있다.

2. 코드

  • 코드경로
── monitoring
│   ├── elk
│   │   ├── elasticsearch
│   │   │   └── elasticsearch.yml
│   │   ├── filebeat
│   │   │   └── filebeat.yml
│   │   ├── kibana
│   │   │   └── kibana.yml
│   │   └── logstash
│   │       ├── logstash.yml
│   │       └── pipeline
│   │           └── logstash.conf

elasticsearch.yml

cluster.name: docker-cluster //elasticsearch의 클러스트 이름
network.host: 0.0.0.0 //Elasticsearch가 모든 네트워크 인터페이스에서 접근 가능

xpack.security.enabled: true //xpack.security.enabled는 Elasticsearch의 X-Pack 보안 기능을 활성화

filebeat.yml

filebeat.inputs: //Filebeat가 수집할 로그 파일들의 입력 설정을 정의
  - type: log //로그 타입
    enabled: true //입력소스 활성화
    paths:
      - /app/logs/ *.log   // 수집할 로그파일의 경로를 설정

output.logstash: //수집한 데이터를 logstash로 전송하는 출력 설정을 정의
  hosts: ["logstash:5044"] //logstash 호스트의 5044 포트로 설정

kibana.yml

server.port: 5601 //kibana가 서버 수신할 포트
server.host: "0.0.0.0"//모든 IPv4 인터페이스에서 접속을 허용
elasticsearch.hosts: ["http://elasticsearch:9200"] //Kibana가 연결할 Elasticsearch 인스턴스의 URL

logstash.conf

input { //Logstash가 데이터를 수집할 입력 소스를 정의
  beats { //Beats 입력 플러그인
    port => 5044 //Logstash가 Beats 에이전트로부터 데이터를 수신할 포트
  }
}

output { //Logstash가 수집한 데이터를 전송할 출력 소스를 정의
  elasticsearch { //Elasticsearch 출력 플러그인
    hosts => ["elasticsearch:9200"]//데이터를 전송할 Elasticsearch 인스턴스의 URL
    index => "logs-%{+YYYY.MM.dd}" //데이터를 저장할 인덱스 이름
  }
}

logstash.yml

http.host: "0.0.0.0"  //모든 인터페이스에서 수신 대기
log.level: info  // 로그 레벨 설정
path.logs: /var/log/logstash //저장할 위치(도커)

docker-compose.yml

  elasticsearch:
    container_name: elasticsearch //컨테이너 이름
    image: docker.elastic.co/elasticsearch/elasticsearch:7.17.4  
    environment:
      - discovery.type=single-node // 단일 노드로 클러스터
    ports:
      - "9200:9200" //호스트의 포트 9200을 컨테이너의 포트 9200
    networks:
      - teamhnet //teamhnet 네트워크에 연결

  logstash:
    container_name: logstash //컨테이너 이름
    image: docker.elastic.co/logstash/logstash:7.17.4  
    ports:
      - "5044:5044" //호스트의 포트 5044를 컨테이너의 포트 5044에 매핑
    volumes:
      - ./monitoring/elk/logstash/pipeline/logstash.conf:/usr/share/logstash/pipeline/logstash.conf
      - ./monitoring/elk/logstash/logstash.yml:/usr/share/logstash/config/logstash.yml
      // :를 기준으로 왼쪽(로컬)을 오른쪽(도커 (컨테이너))로 매핑함
    networks:
      - teamhnet //teamhnet 네트워크에 연결

  kibana:
    container_name: kibana //컨테이너 이름
    image: docker.elastic.co/kibana/kibana:7.17.4
    ports:
      - "5601:5601" //호스트의 포트 5601를 컨테이너의 포트 5044에 매핑
    environment:
      ELASTICSEARCH_HOSTS: "http://elasticsearch:9200" //ELASTICSEARCH_HOSTS: Kibana가 Elasticsearch에 연결할 때 사용할 호스트 주소
    networks:
      - teamhnet//teamhnet 네트워크에 연결

  filebeat:
    container_name: filebeat //컨테이너 이름
    image: docker.elastic.co/beats/filebeat:7.17.4
    volumes:
      - ./monitoring/elk/filebeat/filebeat.yml:/usr/share/filebeat/filebeat.yml  
      // :를 기준으로 왼쪽(로컬)을 오른쪽(도커 (컨테이너))로 매핑함
      - ./app/logs:/app/logs:ro //로컬 /app/logs 디렉토리를 컨테이너의 /app/logs 경로로 읽기 전용으로 매핑
    depends_on:
      - logstash //filebeat 컨테이너가 logstash 컨테이너에 의존
    networks:
      - teamhnet//teamhnet 네트워크에 연결
  1. curl -X GET "localhost:9200/_cat/indices?v" 를 통해 Elastickserch의 데이터 확인이 가능하다.
  2. http://localhost:5601/ 를 통해 키바나로 들어갈 수 있다.
  3. 이제 키바나에서 index pattern 을 정의를 함
  4. 대시보드를 꾸미면 가능
profile
코린이 행동일지

0개의 댓글