侧边栏壁纸
  • 累计撰写 78 篇文章
  • 累计创建 37 个标签
  • 累计收到 8 条评论

目 录CONTENT

文章目录

记一次基于Docker环境 搭建ELk过程

散漫的老何
2021-05-08 / 0 评论 / 0 点赞 / 489 阅读 / 9,747 字 / 正在检测是否收录...
温馨提示:
本文最后更新于 2021-05-25,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

部署环境

CentOS Linux release 7.9.2009 (Core)
ElasticSearch:7.12.0
ElasticSearch-head:5
Kibana:7.12.0
logstash:7.12.0

安装docker

使用yum命令安装docker
yum install -y docker

安装docker-compose

下载docker-compose 执行文件

sudo curl -L "https://github.com/docker/compose/releases/download/1.29.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

添加执行权限

sudo chmod +x /usr/local/bin/docker-compose

创建软链接

sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

查看是否安装成功,查看版本信息

[root@docker ~]# docker-compose --version
docker-compose version 1.29.1, build c34c88b2

拉取镜像

# docker pull docker.elastic.co/elasticsearch/elasticsearch:7.12.0
--elasticsearch
# docker pull docker.elastic.co/kibana/kibana:7.12.0
--kibana
# docker pull docker.elastic.co/logstash/logstash:7.12.0
--logstash
# docker pull mobz/elasticsearch-head:5
--elasticsearch-head

查看拉取镜像列表

docker images

docker-images

elasticsearch安装

注意ES、Logstash、Kibana版本必须一致,不然会出现各种莫名的问题,比如Kibana连不上ES或者Logstash连不上ES。这里我使用的是7.12.0版本。

参考链接:
https://www.elastic.co/guide/en/elasticsearch/reference/current/docker.html

参看官方文档使用docker-compose创建elasticsearch集群

在/opt/docker目录下创建docker-compose.yml文件

docker-compose.yml

version: '2.2'
services:
  es01: 
    image: docker.elastic.co/elasticsearch/elasticsearch:7.12.0
    container_name: es01
    environment:
      - node.name=es01
      - cluster.name=es-docker-cluster
      - discovery.seed_hosts=es02,es03
      - cluster.initial_master_nodes=es01,es02,es03
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
    ulimits:
      memlock:
        soft: -1
        hard: -1
    volumes:
      - data01:/usr/share/elasticsearch/data
    ports:
      - 9200:9200
    networks:
      - elastic
  es02:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.12.0
    container_name: es02
    environment:
      - node.name=es02
      - cluster.name=es-docker-cluster
      - discovery.seed_hosts=es01,es03
      - cluster.initial_master_nodes=es01,es02,es03
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
    ulimits:
      memlock:
        soft: -1
        hard: -1
    volumes:
      - data02:/usr/share/elasticsearch/data
    networks:
      - elastic
  es03:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.12.0
    container_name: es03
    environment:
      - node.name=es03
      - cluster.name=es-docker-cluster
      - discovery.seed_hosts=es01,es02
      - cluster.initial_master_nodes=es01,es02,es03
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
    ulimits:
      memlock:
        soft: -1
        hard: -1
    volumes:
      - data03:/usr/share/elasticsearch/data
    networks:
      - elastic

volumes:
  data01:
    driver: local
  data02:
    driver: local
  data03:
    driver: local
networks:
  elastic:
    driver: bridge


Docker分别命名为data01、data02和data03,用于存储节点数据目录,使数据在重启过程中保持不变。如果它们还不存在,那么在docker-compose创建集群时创建它们。

创建volume

创建volume

docker volume create data01
docker volume create data02
docker volume create data03

参看volume

docker volume ls

dockervolumels

查看volume详细信息

docker volume inspect data01

docker-inspect

全部都准备完毕,开始创建elasticSearch容器。

创建ElasticSarch集群容器

cd /opt/docker #接入存放docker-compose.yml目录
docker-compose up #创建容器

查看容器是否创建完成

docker ps -a

docker-ps-a

使用curl命令查看es集群状态

curl -X GET "localhost:9200/_cat/nodes?v=true&pretty" 

image-20210423173059771

给elasticsearch容器设置开机启动

docker update --restart=always 13b444cacc91
docker update --restart=always 27224a557c03
docker update --restart=always 35cfa89dabbc

至此elasitcsearch集群部署完成!

遇到的坑

vm.max_map_count

1、创建elasticSearch容器时需要修改Linux vm.max_map_count参数。

max_map_count
指定该进程可以使用的最大内存映射区域数。在大多数情况下,默认 值为65530。如果您需要将更多文件映射到您的应用程序,请增加此值。

检查系统vm.max_map_count设置值

# sysctl -a | grep vm.max_map_count 
vm.max_map_count = 65530

修改vm.max_map_count

# sysctl -w vm.max_map_count=262144 
vm.max_map_count = 262144

再次检查

# sysctl -a | grep vm.max_map_count 
vm.max_map_count = 262144

head插件无法链接到es节点,需要设置跨域访问。

# 参看容器id
docker ps -a
#进入容器内
docker exec -it 容器id /bin/bash
#编辑elasticsearch.yml配置文件
vi /config/elasticsearch.yml
在最后一行添加跨域访问
http.cors.enabled: true
http.cors.allow-origin: "*"

[root@27224a557c03 elasticsearch]# cat config/elasticsearch.yml 
cluster.name: "docker-cluster"
network.host: 0.0.0.0
http.cors.enabled: true
http.cors.allow-origin: "*"
[root@27224a557c03 elasticsearch]# 

es配置文件

重启容器

docker restart 容器id

elasticsearch head插件安装

创建elasticsearch head容器,映射9100端口,--restart=always设置开机自动启动容器

docker run -d -p 9100:9100 --restart=always docker.io/mobz/elasticsearch-head:5

访问head web界面:

elasitcsearch-head状态

参看head插件是否正常启动。

遇到的坑

Docker容器ElasticSearch-Head创建索引无响应406

解决方法:

修改head的 Content-Type 设置,

#参看容器id号
docker ps -a

#进入docker容器内
docker exec -it 容器id /bin/bash
root@b93fa4e29ba2:/usr/src/app# vim _site/vendor.js
1. 6886行 /contentType: "application/x-www-form-urlencoded 
    改成 contentType: "application/json;charset=UTF-8" 
2. 7574行 var inspectData = s.contentType ==`= "application/x-www-form-urlencoded" &&` 
    改成 var inspectData = s.contentType === "application/json;charset=UTF-8" &&
root@b93fa4e29ba2:/usr/src/app/_site# exit
exit
#重启容器
[root@localhost ~]# docker restart 容器id

Kibana安装

创建Kibana容器

docker run --name elk-kibana -e ELASTICSEARCH_URL=http://172.18.0.4:9200 -p 5601:5601 --restart=always  7a6b1047dd48

-e ELASTICSEARCH_URL=http://172.18.0.4:9200:设置ELASTICSEARCH_URL用于连接es节点

--restart=always:设置开机启动

进入kibana容器内,修改/config/kibana.yml配置文件,添加下述内容

server.name: kibana
server.host: "0"
# 连接es节点
elasticsearch.hosts: [ "http://elk-es01:9200" ]
monitoring.ui.container.elasticsearch.enabled: true
# web界面设置成中文
i18n.locale: "zh-CN"

重启Kibana容器

[root@docker /]# docker exec -it --user=root 7a0b4cb0bca2 /bin/bash
bash: printf: write error: Interrupted system call
[root@7a0b4cb0bca2 kibana]# vi config/kibana.yml 
[root@7a0b4cb0bca2 kibana]# cat config/kibana.yml 
#

# ** THIS IS AN AUTO-GENERATED FILE **

#

# Default Kibana configuration for docker target

server.name: kibana
server.host: "0"
elasticsearch.hosts: [ "http://elk-es01:9200" ]
monitoring.ui.container.elasticsearch.enabled: true
i18n.locale: "zh-CN"
[root@7a0b4cb0bca2 kibana]# exit                 
exit
[root@docker /]# docker restart 7a0b4cb0bca2
7a0b4cb0bca2
[root@docker /]# 

kibana

访问web页面:http://192.168.10.30:5601

kibana-web

logstash安装

创建logstash容器

docker run -it -d -p 5044:5044 -p 5040:5040 --restart=always --name logstash --net=docker_elastic docker.elastic.co/logstash/logstash:7.12.0

--net:指定网络组为docker_elastic

--restart=always:设置开机启动

进入logstash容器内,编辑logstash.yml配置文件添加连接es节点配置。

[root@docker ~]# docker exec -it --user=root b5f3e8eeea13 /bin/bash
[root@b5f3e8eeea13 logstash]# vim config/logstash.yml 
[root@b5f3e8eeea13 logstash]# cat config/logstash.yml 
http.host: "0.0.0.0"
xpack.monitoring.elasticsearch.hosts: [ "http://elk-es01:9200" ]
[root@b5f3e8eeea13 logstash]# exit
exit 
[root@docker ~]# docker restart b5f3e8eeea13 //重启logstash容器
b5f3e8eeea13
[root@docker ~]# 

logstash

通过TCP方式采集web服务日志

1.在logstash/config/路径下创建logstash.conf文件

2.编辑logstash.conf,输入以下配置

#输入
input {
  tcp {
    mode => "server" #操作模式, server:监听客户端连接, client:连接到服务器
    host => "0.0.0.0" #指定监听地址, 默认0.0.0.0
    port => 4560 #端口号
    codec => json_lines #数据格式,如json,json_lines等
  }
}
#输出到ES
output {
  elasticsearch {
    hosts => "127.0.0.1:9200" #es的地址
    action=>"index" #es要执行的动作 index, delete, create, update
    index => "index-logstash-%{+YYYY.MM.dd}" #索引名称
  }
}

3.修改logstash.yml文件

#指定配置文件路径
path.config: /usr/share/logstash/config/logstash.conf

4.web项目中添加logstash依赖

<!--集成logstash-->
<dependency>
    <groupId>net.logstash.logback</groupId>
    <artifactId>logstash-logback-encoder</artifactId>
    <version>5.3</version>
</dependency>

5.创建logback.xml文件,新增appender

<!--输出到logstash的appender-->
<appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
    <!--logstash日志收集端口-->
    <destination>127.0.0.1:4560</destination>
    <encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder"/>
</appender>
<root level="INFO">
    <appender-ref ref="LOGSTASH"/>
</root>

6.重启logstash容器

docker restart b5f3e8eeea13

采集多个服务的日志

input {
  tcp {
   add_field => {"service" => "admin"}
    mode => "server"
    host => "0.0.0.0"
    port => 4560
    codec => json_lines
  }
  tcp {
   add_field => {"service" => "auth"}
    mode => "server"
    host => "0.0.0.0"
    port => 4561
    codec => json_lines
  }
}
output {
   if [service] == "admin"{
    elasticsearch {
      hosts => "127.0.0.1:9200"
      index => "admin-logstash-%{+YYYY.MM.dd}"
    }
   }
  if [service] == "auth"{
    elasticsearch {
      hosts => "127.0.0.1:9200"
      index => "auth-logstash-%{+YYYY.MM.dd}"
    }
   }
}
0
广告 广告

评论区