Docker 安装 ELK 8.2.2

简介

ELK是Elasticsearch、Logstash、Kibana三大开源框架首字母大写简称(但是后期出现的Filebeat(beats中的一种)可以用来替代Logstash的数据收集功能,比较轻量级)。市面上也被成为Elastic Stack。

Filebeat是用于转发和集中日志数据的轻量级传送工具。Filebeat监视您指定的日志文件或位置,收集日志事件,并将它们转发到Elasticsearch或 Logstash进行索引。Filebeat的工作方式如下:启动Filebeat时,它将启动一个或多个输入,这些输入将在为日志数据指定的位置中查找。对于Filebeat所找到的每个日志,Filebeat都会启动收集器。每个收集器都读取单个日志以获取新内容,并将新日志数据发送到libbeat,libbeat将聚集事件,并将聚集的数据发送到为Filebeat配置的输出。

Logstash是免费且开放的服务器端数据处理管道,能够从多个来源采集数据,转换数据,然后将数据发送到您最喜欢的“存储库”中。Logstash能够动态地采集、转换和传输数据,不受格式或复杂度的影响。利用Grok从非结构化数据中派生出结构,从IP地址解码出地理坐标,匿名化或排除敏感字段,并简化整体处理过程。

Elasticsearch是Elastic Stack核心的分布式搜索和分析引擎,是一个基于Lucene、分布式、通过Restful方式进行交互的近实时搜索平台框架。Elasticsearch为所有类型的数据提供近乎实时的搜索和分析。无论您是结构化文本还是非结构化文本,数字数据或地理空间数据,Elasticsearch都能以支持快速搜索的方式有效地对其进行存储和索引。

Kibana是一个针对Elasticsearch的开源分析及可视化平台,用来搜索、查看交互存储在Elasticsearch索引中的数据。使用Kibana,可以通过各种图表进行高级数据分析及展示。并且可以为Logstash和ElasticSearch提供的日志分析友好的 Web 界面,可以汇总、分析和搜索重要数据日志。还可以让海量数据更容易理解。它操作简单,基于浏览器的用户界面可以快速创建仪表板(Dashboard)实时显示Elasticsearch查询动态。

为什么要使用ELK

日志主要包括系统日志、应用程序日志和安全日志。系统运维和开发人员可以通过日志了解服务器软硬件信息、检查配置过程中的错误及错误发生的原因。经常分析日志可以了解服务器的负荷,性能安全性,从而及时采取措施纠正错误。

往往单台机器的日志我们使用grep、awk等工具就能基本实现简单分析,但是当日志被分散的储存不同的设备上。如果你管理数十上百台服务器,你还在使用依次登录每台机器的传统方法查阅日志。这样是不是感觉很繁琐和效率低下。当务之急我们使用集中化的日志管理,例如:开源的Syslog,将所有服务器上的日志收集汇总。集中化管理日志后,日志的统计和检索又成为一件比较麻烦的事情,一般我们使用grep、awk和wc等Linux命令能实现检索和统计,但是对于要求更高的查询、排序和统计等要求和庞大的机器数量依然使用这样的方法难免有点力不从心。

一般大型系统是一个分布式部署的架构,不同的服务模块部署在不同的服务器上,问题出现时,大部分情况需要根据问题暴露的关键信息,定位到具体的服务器和服务模块,构建一套集中式日志系统,可以提高定位问题的效率。

目录结构参考

1.elasticsearch.yml 配置

cluster:
  name: docker-cluster
network:
  host: 0.0.0.0

path:
  data: /usr/share/elasticsearch/data

discovery:
  type: single-node

# 这个需要打开
xpack:
  security:
    enabled: true
    http:
      ssl:
        enabled: false
# basic
  license:
    self_generated:
      type: basic

# chmod 777 ./elasticsearch/data
# docker exec -it elasticsearch bash
# 创建内置的用户  elastic, kibana等用户都会创建,按照步骤操作即可
# elasticsearch-setup-passwords interactive

2.filebeat.yml 配置

filebeat:
  inputs:
    - type: log
      enabled: true
      paths:
        - /var/log/filebeat/logs/*.log

setup:
  ilm:
    enabled: false

  template:
    settings:
      index:
        number_of_shards: 1
        number_of_replicas: 0
    name: "filebeat"
    pattern: "filebeat-*"
  kibana:
    host: "kibana:5601"

output:
  logstash:
    hosts: ["logstash:5044"]

3.kibana.yml 配置

server:
  name: kibana
  host: 0.0.0.0
  shutdownTimeout: 10s
  publicBaseUrl: http://0.0.0.0
## 增加中文配置
i18n:
  locale: zh-CN
## es 设置的kibana用户名称
elasticsearch:
  hosts: ["http://elasticsearch:9200"]
  username: kibana_system
  password: 123456

xpack:
  monitoring:
    ui:
      container:
        elasticsearch:
          enabled: true

4.logstash.yml 配置

http:
  host: 0.0.0.0
xpack:
  monitoring:
    elasticsearch:
      username: logstash_system
      password: 123456
path:
  config: /data/docker/logstash/conf.d/*.conf
  logs: /var/log/logstash

logstash.conf

input {
    beats {
	   type => "beats-5044"
       port => 5044
    }
}

filter {
	if [type] == "beats-5044" { 
	}
}

output {
	if [type] == "beats-5044" { 
		elasticsearch {
			hosts =>["http://elasticsearch:9200"]
			index => "logstash-%{+yyyy.MM.dd}"
			user => "elastic"
			password => "123456"
		}
	}
}

syslog.conf ,文件位置同 logstash.conf 目录

input {
  syslog {
	type => "tdp-7777"
    port => 7777
  }
}

filter {
	if [type] == "tdp-7777" { 
		json {
			source => "message"
		}
	}
}

output {
	if [type] == "tdp-7777" {
		elasticsearch {
			hosts =>["http://elasticsearch:9200"]
			index => "tdp-7777-%{+yyyy.MM.dd}"
			user => "elastic"
			password => "123456"
		}
	}
}


template.json

{
  "template": "*",
  "settings": {
    "number_of_shards": 1,
    "number_of_replicas": 0
  }
}

5.compose.yml 配置

version: '3'

networks:
  elk-networks:
    driver: bridge

services:
  elasticsearch:
    image: elasticsearch:8.2.2
    restart: always
    container_name: elasticsearch
    ports:
      - 9200:9200
      - 9300:9300
    environment:
      #- discovery.type=single-node
      #- ES_JAVA_OPTS=-Xms512m -Xmx1024m
      - TZ=Asia/Shanghai
    volumes:
      - ./elasticsearch/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml
      - ./elasticsearch/data:/usr/share/elasticsearch/data
      - ./elasticsearch/download:/usr/share/elasticsearch/download
    networks:
      - elk-networks
    healthcheck:
      test: ["CMD","curl","-sS","http://localhost:9200"]
      interval: 5s
      timeout: 10s
      retries: 50

  kibana:
    image: kibana:8.2.2
    restart: always
    container_name: kibana
    ports:
      - 5601:5601
    environment:
      #- elasticsearch.hosts=http://elasticsearch:9200
      - TZ=Asia/Shanghai
    links:
      - "elasticsearch:elasticsearch"
    volumes:
      - ./kibana/kibana.yml:/usr/share/kibana/config/kibana.yml
    depends_on:
      elasticsearch:
        condition: service_healthy
    networks:
      - elk-networks
    healthcheck:
      test: ["CMD","curl","-f","http://localhost:5601"]
      interval: 5s
      timeout: 10s
      retries: 30

  filebeat:
    image: elastic/filebeat:8.2.2
    restart: always
    container_name: filebeat
    volumes:
      - ./filebeat/filebeat.yml:/usr/share/filebeat/filebeat.yml
      - ./filebeat/logs:/var/log/filebeat/logs
    depends_on:
      elasticsearch:
        condition: service_healthy
      kibana:
        condition: service_healthy
    networks:
      - elk-networks
      
  logstash:
    image: logstash:8.2.2
    restart: always
    container_name: logstash
    volumes:
      - ./logstash/logstash.yml:/usr/share/logstash/config/logstash.yml
      - ./logstash/conf/:/data/docker/logstash/conf.d/
      - ./logstash/tmpl/:/etc/logstash/tmpl/
    ports:
      - "5044:5044"
      - "5044:5044/udp"
      - "7776:7776"
      - "7776:7776/udp"
      - "7777:7777"
      - "7777:7777/udp"
      - "9600:9600"
      - "9600:9600/udp"
    environment:
      #- ES_JAVA_OPTS=-Xms512m -Xmx1024m
      - TZ=Asia/Shanghai
    depends_on:
      elasticsearch:
        condition: service_healthy
    links:
      - "elasticsearch:elasticsearch"
    networks:
      - elk-networks

注意,在启动前,需要把elasticsearch的data目录设置权限,另外需要注意端口是否开放udp协议。

chmod 777 ./elasticsearch/data

启动/删除

# 启动
docker-compose up -d

# 删除
docker-compose down

启动后,进行es进行密码设置

docker exec -it elasticsearch bash
# 创建内置的用户  elastic, kibana等用户都会创建,按照步骤操作即可
elasticsearch-setup-passwords interactive

索引可能会yellow,进入kibana,查看索引状态。

如果存在黄色状态

PUT /_template/template_http_request_record
{
    "index_patterns": [
      "*"
    ],
    "settings": {
      "lifecycle":{"name": "180-days-default"},
      "number_of_shards": 1,
      "number_of_replicas": 0,
      "auto_expand_replicas": "0-1"
    }
}

PUT /_all/_settings
{
  "settings": {
    "lifecycle":{"name": "180-days-default"},
    "number_of_replicas": "0",
    "auto_expand_replicas": "0-1"
  }
}

http://***:9200

This entry was posted in 应用. Bookmark the permalink.