docker 部署EFK(elasticsearch,kibana,fluentd)日志系统

  • fluentd对比Logstash
对比方面 Logstash Fluentd
内存占用 启动1G左右 启动60M左右
CPU占用 较高 较低
支持插件 丰富 丰富
通用日志解析 支持grok(基于正则表达式)解析 支持正则表达式解析
特定日志类型 支持JSON等主流格式 支持JSON等主流格式
数据过滤 支持 支持
数据buffer发送 插件支持 插件支持
运行环境 JRuby实现,依赖JVM环境 CRuby、C实现,依赖Ruby环境
线程支持 支持多线程 多线程受GIL限制
  • 使用docker compose部署
    1. 准备es-master.yml,fluent.conf ,kibana.yml配置文件
    2. 执行efk-master-init.sh 创建相应的文件夹、下载启动对应的镜像
注意:
  • 一下的配置文件中的ip地址请更换为对应服务器的ip

  • 刚创建fluentd镜像启动时会失败,因为官方的docker镜像默认没有加入fluent-plugin-elasticsearch 插件,解决步骤如下:

    • 1 . 将fluent.conf 配置文件的关于elasticsearch先删除,再重启docker镜像
      1. 使用root用户进入Fluentd容器内部
    [root@localhost ]# docker exec -it --user root fluentd /bin/sh
    
      1. 安装Fluentd的Elasticsearch插件
    / # fluent-gem install fluent-plugin-elasticsearch
    
      1. 更换fluent.conf配置文件的内容:
    
      @type  forward
     @id    httpd-input
       @label @httpd
    port  24224
    
    @type json
    
    
    
    @type stdout
    
    
    
      1. 重启fluentd容器
  • efk-master-init.sh:

#./bin/bash
# 定义颜色
BLUE_COLOR="\033[36m"
RED_COLOR="\033[31m"
GREEN_COLOR="\033[32m"
VIOLET_COLOR="\033[35m"
RES="\033[0m"

echo -e "${BLUE_COLOR}# ######################################################################${RES}"
echo -e "${BLUE_COLOR}#                       Docker ELK Shell Script                        #${RES}"
echo -e "${BLUE_COLOR}#                       Email:                                                     #${RES}"
echo -e "${BLUE_COLOR}# ######################################################################${RES}"

# 创建目录
echo -e "${BLUE_COLOR}---> create [elasticsearch]directory start.${RES}"
if [ ! -d "./elasticsearch/" ]; then
mkdir -p ./elasticsearch/master/conf ./elasticsearch/master/data ./elasticsearch/master/logs
fi

echo -e "${RED_COLOR}---> create [kibana]directory start.${RES}"
if [ ! -d "./kibana/" ]; then
mkdir -p ./kibana/conf ./kibana/logs
fi

# 目录授权(log 都要授读/写权限)
echo -e "${RED_COLOR}---> create [fluentd]directory start.${RES}"
if [ ! -d "./fluentd/" ]; then
mkdir -p ./fluentd/conf ./fluentd/log
chmod 777 ./fluentd/log
fi

echo -e "${BLUE_COLOR}===> create directory success.${RES}"

# 目录授权(data/logs 都要授读/写权限)
echo -e "${BLUE_COLOR}---> directory authorize start.${RES}"
if [ -d "./elasticsearch/" ]; then
chmod 777 ./elasticsearch/master/data/ ./elasticsearch/master/logs/
fi

echo -e "${BLUE_COLOR}===> directory authorize success.${RES}"

# 移动配置文件
echo -e "${BLUE_COLOR}---> move [elasticsearch]config file start.${RES}"
if [ -f "./es-master.yml" ]; then
mv ./es-master.yml ./elasticsearch/master/conf
fi

echo -e "${RED_COLOR}---> move [kibana]config file start.${RES}"
if [ -f "./kibana.yml" ]; then
mv ./kibana.yml ./kibana/conf
fi

echo -e "${GREEN_COLOR}---> move [fluent]config file start.${RES}"
if [ -f "./fluent.conf" ]; then
mv ./fluent.conf ./fluentd/conf
fi

echo -e "${BLUE_COLOR}===> move config files success.${RES}"
echo -e "${GREEN_COLOR}>>>>>>>>>>>>>>>>>> The End <<<<<<<<<<<<<<<<<<${RES}"

# 部署项目
echo -e "${BLUE_COLOR}==================> Docker deploy Start <==================${RES}"
docker-compose up --build -d

  • docker-compose.yml文件配置:
version: "3"
services:
  web:#方便测试使用,启动完成后执行curl localhost:1080,可以在kibana的discover界面查看
    image: httpd
    container_name: httpd
    ports:
      - 1080:80 #避免和默认的80端口冲突
    links:
      - fluentd
    logging:
      driver: fluentd
      options:
        fluentd-address: localhost:24224
        tag: httpd.access
    environment:
      - "TZ=Asia/Shanghai"

  fluentd:
    image: fluent/fluentd
    container_name: fluentd
    user: root
    volumes:
      - ./fluentd/conf/fluent.conf:/fluentd/etc/fluent.conf
      - ./fluentd/log:/fluentd/log
    ports:
      - 24221:24221
      - 24222:24222
      - 24223:24223
      - 24224:24224
    environment:
      - "TZ=Asia/Shanghai"

  es-master:
    container_name: es-master
    hostname: es-master
    image: elasticsearch:7.1.1
    user: root
    ports:
      - 9200:9200
      - 9300:9300
    volumes:
      - ./elasticsearch/master/conf/es-master.yml:/usr/share/elasticsearch/config/elasticsearch.yml
      - ./elasticsearch/master/data:/usr/share/elasticsearch/data
      - ./elasticsearch/master/logs:/usr/share/elasticsearch/logs
    environment:
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
      - "TZ=Asia/Shanghai"
  kibana:
    container_name: kibana
    hostname: kibana
    image: kibana:7.1.1
    ports:
      - 5601:5601
    volumes:
      - ./kibana/conf/kibana.yml:/usr/share/kibana/config/kibana.yml
    environment:
      - "elasticsearch.hosts=http://ip:9200"
      - "TZ=Asia/Shanghai"
    depends_on:
      - "es-master"
  • es-master.yml文件配置:
# 集群名称
cluster.name: es-cluster
# 节点名称
node.name: es-master
# 是否可以成为master节点
node.master: true
# 是否允许该节点存储数据,默认开启
node.data: true
# 网络绑定
network.host: 0.0.0.0
# 设置对外服务的http端口
http.port: 9200
# 设置节点间交互的tcp端口
transport.port: 9300
# 集群发现
discovery.seed_hosts:
  - es-master
# 手动指定可以成为 mater 的所有节点的 name 或者 ip,这些配置将会在第一次选举中进行计算
cluster.initial_master_nodes:
  - es-master
# 支持跨域访问
http.cors.enabled: true
http.cors.allow-origin: "*"
# 安全认证
xpack.security.enabled: false
#http.cors.allow-headers: "Authorization"

  • 完整的fluent.conf文件配置,用作参考 :

  @type  tcp
  @id    debug-input
  port  24221
  tag debug
  
 @type json
  



  @type  tcp
  @id    error-input
  port  24222
  tag error
  
 @type json
  



  @type  tcp
  @id    business-input
  port  24223
  tag business
  
 @type json
  



  @type  tcp
  @id    record-input
  port  24224
  tag record
  
 @type json
  



  @type parser
  key_name message
  reserve_data true
  remove_key_name_field true
  
    @type json
  



  @type stdout
  output_type json



  @type elasticsearch
  host 192.168.3.101
  port 9200
  type_name docker
  logstash_format true
  logstash_prefix docker-${tag}-logs
  logstash_dateformat %Y-%m-%d
  flush_interval 5s
  include_tag_key true


  • kibana.yml文件配置:
# 服务端口
server.port: 5601
# 服务IP
server.host: "0.0.0.0"
# ES
elasticsearch.hosts: ["http://192.168.1.150:9200"]
# 汉化
i18n.locale: "zh-CN"

你可能感兴趣的:(docker 部署EFK(elasticsearch,kibana,fluentd)日志系统)