从零开始搭建单节点 ELK

Posted by Li Hui on Tuesday, August 27, 2024

最近上了一个新项目,在这个项目中开发环境中暂时没有基础设施,需要通过原始的方式进行部署和查询日志,因此最近参与了搭建 ELK 的项目,其实这里有一个问题,为啥要使用 ELK ? 这个技术选型的主要原因有两点,第一点项目成员对于 ELK 都有一定的使用经验,选择 ELK 可以减少项目同学的上手成本,第二点,ELK 是一个成熟的框架,了解其搭建过程也可以帮助更好的了解 ELK 软件之间的交互。

首先有一个问题,ELK 指的是什么?指的是 elastic search(数据存储), logstash(数据过滤), kibana(数据展示)。这三个便是 ELK 的三部分,当然也会有其他厂商的适配的其他版本,比如 Amazon OpenSeach, 或者。

当然除此之外还有一个向 ELK 发送数据的服务,比如收集日志用的比较多的 filebeat (beats 中的一种,其他 beats 可以参照 beats 的官网 ),我们这边因为只涉及到日志的收集,因此此处采用对应的 filebeat 即可,当然使用其他家的也可以。 基本流程是如上所示

elk-log-logic

整理流程如上所示。

  1. 监听文件并发送
  2. 过滤转换数据
  3. 保存数据
  4. 查询 es 数据并展示

解析来我们一起来看下安装的教程 首先需要启动起来后三个部分, 即 logstash, es, 以及 kibana.

本文采用 docker compose 方式启动, 安装 docker compose 参照 docker compose 安装

对应的 docker-compose 文件如下:

docker-compose.yml

version: '3'
services:
  elasticsearch:
    image: elasticsearch:7.13.0
    container_name: elasticsearch
    ports:
      - "9200:9200"
      - "9300:9300"
    volumes:
      - test_data:/usr/share/elasticsearch/data/
      - ./elk-config/elasticsearch/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml
    environment:
      - discovery.type=single-node
      - http.host=0.0.0.0
      - transport.host=0.0.0.0
      - xpack.security.enabled=false
      - xpack.monitoring.enabled=false
      - cluster.name=elasticsearch
      - bootstrap.memory_lock=true
    networks:
      - elk

  logstash:
    image: logstash:7.13.0
    container_name: logstash
    ports:
      - "5044:5044"
      - "9600:9600"
    volumes:
      - ./elk-config/logstash/logstash.conf:/usr/share/logstash/pipeline/logstash.conf
      - ./elk-config/logstash/logstash.yml:/usr/share/logstash/config/logstash.yml
      - ls_data:/usr/share/logstash/data

    networks:
      - elk
    depends_on:
      - elasticsearch

  kibana:
    image: kibana:7.13.0
    container_name: kibana
    ports:
      - "5601:5601"
    volumes:
      - ./elk-config/kibana/kibana.yml:/usr/share/kibana/config/kibana.yml
      - kb_data:/usr/share/kibana/data
    networks:
      - elk
    depends_on:
      - elasticsearch

networks:
  elk:
    driver: bridge

volumes:
  test_data:
  ls_data:
  kb_data:

从上述文件中我们可以看到我们有一些配置文件需要配置下

./elk-config/logstash/logstash.conf

input {
   beats{
   port => 5044
   }
}

filter {
}

output {
 if "hero-app" in [tags] {
    elasticsearch {
      hosts => ["http://elasticsearch:9200"]
      index => "[hero-app]-%{+YYYY.MM.dd}"
      user => "elastic"
      password => "password"
    }
 }
 if "another-hero-app" in [tags] {
    elasticsearch {
      hosts => ["http://elasticsearch:9200"]
      index => "[another-hero-app]-%{+YYYY.MM.dd}"
      user => "elastic"
      password => "password"
    }
 }
}

Logstash.yml

http.host: 0.0.0.0
xpack.monitoring.elasticsearch.hosts: ["http://elasticsearch:9200"]

elasticsearch.yml

cluster.name: "elasticsearch"
network.host: localhost

kibana.yml

server.name: kibana
server.host: "0"
elasticsearch.hosts: [ "http://elasticsearch:9200" ]
monitoring.ui.container.elasticsearch.enabled: true

然后 我们使用 docker-compose up -d 即可启动 ELK 框架,如果 es 无法启动成功,可以尝试增加 docker 内存,比如 colima 配置如下

colima start --cpu 4 --memory 8

然后我们继续做后续的步骤, 即 filebeat 的内容,可以从网站中下载对应的文件(注意要下载对应的架构,系统以及和 ELK 版本)

download-elk-page

解压之后可以查看对应的配置文件 filebeat.yml

增加监听的文件的配置

# ============================== Filebeat inputs ===============================

filebeat.inputs:

# Each - is an input. Most options can be set at the input level, so
# you can use different inputs for various configurations.
# Below are the input specific configurations.
- type: log
  enabled: true
  paths:
    - /Users/lihui/Desktop/elk/logs/hero-app-logs/*.log
  tags: ["hero-app"]
  multiline:
    type: pattern
    pattern: '^[0-9]{2}:[0-9]{2}:[0-9]{2}\.[0-9]{3}'
    negate: true
    match: after
- type: log
  enabled: true
  paths:
    - /Users/lihui/Desktop/elk/logs/another-hero-app-logs/*.log
  tags: ["another-hero-app"]
  multiline:
    type: pattern
    pattern: '^[0-9]{2}:[0-9]{2}:[0-9]{2}\.[0-9]{3}'
    negate: true
    match: after

然后采用下面的命令进行启动监听

./filebeat -e -c filebeat.yml

而后登入 kibana 页面进行配置对应的信息。 首先解决单节点 warning 问题 kibana -> stack-management -> index management 将所有的 index 中的配置调整为 0

kibana-stack-managment

kibanan-index-management

修改为 0 之后既可以表明是单节点,保存健康状态即为 health.

修改 Index Patterns 以显示对应的 es 数据

kibana-index-patterns

附录

如何减少对于远程服务器的对于远程服务的侵入呢? 可以参与 sshfs 挂在远程文件到本地目录

sshfs root@10.10.10.100:/home/demouser/hero-app/logs/ /Users/local/Desktop/elk/logs/hero-app-logs/

其他情况

如果本地是 mac 不好解决如果做? 可以采用 brew 安装

# 安装依赖工具 fuse
brew install osxfuse 
# 安装远程同步工具 sshfs
brew install sshfs

brew 对于这两个软件可能存在不兼容的文件,因此可以从官网下载

官网地址:

  1. osxfuse Home - macFUSE 下载对应的 macFuse 软件
  2. sshfs Releases · osxfuse/sshfs

参考资料:

  1. 如何在mac上实现远程挂载方案 | osxfuse & sshfs - 掘金
  2. 2023最新ELK日志平台(elasticsearch+logstash+kibana)搭建 - 掘金
  3. ELK搭建(一):手把手教你搭建分布式微服务日志监控 - 掘金