ELK简介和docker版安装

发布于:2025-05-21 ⋅ 阅读:(15) ⋅ 点赞:(0)

使用场景

主要还是给开发人员“打捞日志”用的。

ELK 是由三个开源工具组成的套件(Elasticsearch、Logstash 和 Kibana),主要用于日志的收集、分析和可视化。以下是 ELK 常见的使用场景:
日志集中化管理
收集来自多个服务器或服务的日志,集中存储在 Elasticsearch 中。
开发人员可以通过 Kibana 快速查找和分析日志,用于排查问题。
实时日志分析
通过 Logstash 或 Filebeat 收集实时日志数据,并进行结构化处理。
利用 Elasticsearch 提供强大的搜索能力,快速检索特定的日志信息。
监控与告警
可以结合其他工具(如 Metricbeat)监控系统性能指标。
实现对异常行为或错误日志的实时告警。
安全审计与合规性检查
记录并分析用户访问、操作等行为日志,满足安全审计需求。
追踪潜在的安全威胁或非法活动。
业务数据分析
不仅限于技术日志,还可以用来分析业务数据,例如用户行为、点击流数据等。
开发调试支持
确实,ELK 被广泛用于开发人员“打捞”日志,帮助定位生产环境中的问题。
结合时间戳、请求 ID、用户 ID 等信息,可以快速找到特定请求链路的日志。
总结: ELK 并不只是为开发人员“打捞日志”而设计,但它的确是一个非常强大的工具,能够帮助开发、运维以及安全团队更好地理解和利用日志数据。

什么规模和需求需要部署ELK

应考虑部署 ELK 的典型场景包括:
服务器数量 ≥ 3 台
每天日志总量 ≥ 1GB
需要跨服务、跨时间点的日志关联查询
需要实时监控、告警、可视化
有开发排查、运维巡检、安全审计等多角色协作需求
如果你目前只是几个小型项目,日志量不大,也可以先使用轻量级方案(如 Filebeat + Elasticsearch 单节点),逐步过渡到完整 ELK 架构。

docker部署http版

docker部署 http版 这个版本基本上不需要踩坑,适合开发测试环境搭建

Dockerfile

version: '3.7'

services:
  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:8.11.3
    container_name: elasticsearch
    environment:
      - discovery.type=single-node
      - ES_JAVA_OPTS=-Xms1g -Xmx1g
      - xpack.security.enabled=false
      - TZ=Asia/Shanghai
    ports:
      - "9200:9200"
      - "9300:9300"
    volumes:
      - es_data:/usr/share/elasticsearch/data
    networks:
      - elk

  logstash:
    image: docker.elastic.co/logstash/logstash:8.11.3
    container_name: logstash
    depends_on:
      - elasticsearch
    ports:
      - "5044:5044"     # Beats 输入
      - "9600:9600"     # 监控端口
    environment:
      - LOGSTASH_KEYSTORE_PASSWORD=secret
      - TZ=Asia/Shanghai
    volumes:
      - ./logstash/pipeline:/usr/share/logstash/pipeline
      #- ./logstash/config:/usr/share/logstash/config
    networks:
      - elk

  kibana:
    image: docker.elastic.co/kibana/kibana:8.11.3
    container_name: kibana
    depends_on:
      - elasticsearch
    ports:
      - "5601:5601"
    environment:
      - ELASTICSEARCH_HOSTS=http://elasticsearch:9200
      - TZ=Asia/Shanghai
    networks:
      - elk

networks:
  elk:
volumes:
  es_data:

用到的文件

./logstash/pipeline/main.conf

input {
  beats {
    port => 5044
  }
}

filter {
  grok {
    match => { "message" => "%{TIMESTAMP_ISO8601:timestamp} $$%{DATA:thread}$$ %{LOGLEVEL:level} %{JAVACLASS:logger} - %{GREEDYDATA:message}" }
  }
  date {
    match => [ "timestamp", "yyyy-MM-dd HH:mm:ss" ]
  }
}

output {
  elasticsearch {
    hosts => ["http://elasticsearch:9200"]
    index => "app-logs-%{+YYYY.MM.dd}"
  }
}

logstash.yml

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

测试访问
elasticsearch:
http://ip:9200/
logstash:
http://ip:9600/
kibana:
http://ip:5601/

docker部署https版

docker部署 https版 这个版本需要解决证书问题,授权账号问题 适合生产环境

Dockerfile

version: '3.7'

services:
  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:8.11.3
    container_name: elasticsearch
	hostname: elasticsearch
    environment:
      - discovery.type=single-node
      - ES_JAVA_OPTS=-Xms1g -Xmx1g
      - xpack.security.enabled=false
      - TZ=Asia/Shanghai
    ports:
      - "9200:9200"
      - "9300:9300"
    volumes:
      - es_data:/usr/share/elasticsearch/data
    networks:
      - elk

  logstash:
    image: docker.elastic.co/logstash/logstash:8.11.3
    container_name: logstash
    depends_on:
      - elasticsearch
    ports:
      - "5044:5044"     # Beats 输入
      - "9600:9600"     # 监控端口
    environment:
      - LOGSTASH_KEYSTORE_PASSWORD=secret
      - TZ=Asia/Shanghai
    volumes:
      - ./logstash/pipeline:/usr/share/logstash/pipeline
      #- ./logstash/config:/usr/share/logstash/config
    networks:
      - elk

  kibana:
    image: docker.elastic.co/kibana/kibana:8.11.3
    container_name: kibana
    depends_on:
      - elasticsearch
    ports:
      - "5601:5601"
    environment:
      - ELASTICSEARCH_HOSTS=https://elasticsearch:9200
      - TZ=Asia/Shanghai
    networks:
      - elk

networks:
  elk:
volumes:
  es_data:

用到的文件

./logstash/pipeline/main.conf

input {
  beats {
    port => 5044
  }
}

filter {
  grok {
    match => { "message" => "%{TIMESTAMP_ISO8601:timestamp} $$%{DATA:thread}$$ %{LOGLEVEL:level} %{JAVACLASS:logger} - %{GREEDYDATA:message}" }
  }
  date {
    match => [ "timestamp", "yyyy-MM-dd HH:mm:ss" ]
  }
}

output {
  elasticsearch {
    hosts => ["http://elasticsearch:9200"]
    index => "app-logs-%{+YYYY.MM.dd}"
  }
}

./logstash/pipeline/logstash.yml

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

测试访问
elasticsearch:
https://ip:9200/ 账号elastic 密码通过下面命令设置 注意这里是https
logstash:
http://ip:9600/
kibana:
http://ip:5601/ 账号 kibana 密码通过下面命令设置


先设置elasticsearch密码
docker exec -u 0 -it elasticsearch /bin/bash
cd /usr/share/elasticsearch/bin
elasticsearch-setup-passwords interactive
 


早期版本授权

早期的版本是需要输入 elasticsearch的token和kibana的六位授权码

elasticsearch令牌生成

docker exec -it elasticsearch bash
cd /usr/share/elasticsearch/bin
elasticsearch-create-enrollment-token --scope kibana

生成token

eyJ2ZXIiOiI4LjExLjMiLCJhZHIiOlsiMTcyLjIxLjAuMjo5MjAwIl0sImZnciI6Ijg1ODI4ZWJjZTQzOWQzMzJhZDkzODg5YzRkMTQ4Y2RhZWFmYzQyYmY1ZmM0MDgyN2E2YWEzNmI3MzliYWVlNWQiLCJrZXkiOiJmOXlwNjVZQklPWHhvUF9pNWF1UTpTZHpoczFDZFNqQ0ZVMmZ5M1B4aTN3In0=

kibana的六位授权码获取

docker exec -it kibana bash
cd /usr/share/kibana/bin
./kibana-verification-code


(实际上执行 docker logs kibana 也能看到)


最新版本授权


先解决自签证书问题


elasticsearch的ca证书导入到kibana并配置

docker cp elasticsearch:/usr/share/elasticsearch/config/certs/http_ca.crt .
docker cp http_ca.crt kibana:/usr/share/kibana/config/certs/


kibana的yaml文件(/usr/share/kibana/config/kibana.yml)配置 添加

elasticsearch.ssl.certificateAuthorities: "/usr/share/kibana/config/certs/http_ca.crt"

再解决elasticsearch的授权问题

添加后还报错,需要解决kibana访问elasticsearch的授权问题

[2025-05-20T14:29:50.568+08:00][ERROR][elasticsearch-service] Unable to retrieve version information from Elasticsearch nodes. security_exception
        Root causes:
                security_exception: missing authentication credentials for REST request [/_nodes?filter_path=nodes.*.version%2Cnodes.*.http.publish_address%2Cnodes.*.ip]
[2025-05-20T14:29:59.072+08:00][INFO ][plugins.screenshotting.chromium] Browser executable: /usr/share/kibana/node_modules/@kbn/screenshotting-plugin/chromium/headless_shell-linux_x64/headless_shell


解决方法 进 elasticsearch 重置 kibana_system密码,然后配置到kibana.yml
重置kibana_system密码

docker exec -it elasticsearch bash
cd /usr/share/elasticsearch/bin
elasticsearch-reset-password -u kibana_system --interactive

kibana_system添加 

# 安全认证配置
elasticsearch.username: "kibana_system"
elasticsearch.password: "password"


重置后访问 http://ip:5601/
不能用kibana_system账号,重置elastic密码用elastic登录,或者用kibana账号登录
 


网站公告

今日签到

点亮在社区的每一天
去签到