Elasticsearch,Logstash,Kibana(ELK)Docker镜像文档

Elasticsearch,Logstash,Kibana(ELK)Docker镜像文档

该网页介绍了如何使用sebp / elk Docker映像,它通过打包ElasticsearchLogstashKibana(统称为ELK)提供了方便的集中式日志服务器和日志管理Web界面。

内容

先决条件

要使用此映像运行容器,您需要以下内容:

  • 搬运工人

    安装Docker,使用本机软件包(Linux)或包装在虚拟机中(Windows,OS X - 例如使用Boot2DockerVagrant)。

    - 由于_sebp / elk_映像基于Linux映像,因此Docker for Windows的用户需要确保Docker使用Linux容器

  • 至少为Docker分配4GB RAM

    仅Elasticsearch需要至少2GB的RAM才能运行。

    使用Docker for Mac,可以使用UI设置专用于Docker的RAM量:请参阅如何增加 Docker -machine memory Mac(Stack Overflow)。

  • mmap计数的限制等于262,144或更多

    !这是自Elasticsearch版本5发布以来Elasticsearch无法启动的最常见原因。

    在Linux上,使用sysctl vm.max_map_count主机查看当前值,并参阅Elasticsearch关于虚拟内存的文档,以获取有关如何更改此值的指导。请注意,必须在主机上更改限制; 它们不能在容器内更改。

    如果使用Docker for Mac,那么您将需要使用设置为至少262144 的MAX_MAP_COUNT环境变量(请参阅覆盖启动变量)启动容器(使用例如docker's -e选项)以使Elasticsearch在开始时设置mmap计数的限制 -时间。

  • 从对数发光客户端访问TCP端口5044

    可能需要显式打开其他端口:有关公开的端口的完整列表,请参阅用法

安装

要从Docker注册表中提取此图像,请打开shell提示符并输入:

$ sudo docker pull sebp/elk

- 此图像是从GitHub上源Git存储库中的源文件自动构建的。如果您想自己构建图像,请参阅构建图像部分。

拉出特定版本组合

可以使用标记来提取Elasticsearch,Logstash和Kibana的特定版本组合。

例如,包含Elasticsearch 1.7.3,Logstash 1.5.5和Kibana 4.1.2(使用Elasticsearch 1.x和Logstash 1.x分支的最后一个图像)的图像带有标记E1L1K4,因此可以使用sudo docker pull sebp/elk:E1L1K4

Docker Hub的sebp / elk映像页面或GitHub存储库页面上列出了可用的标记。

默认情况下,如果未指示任何标记(或使用标记latest),将提取最新版本的图像。

用法

使用以下命令从映像运行容器:

$ sudo docker run -p 5601:5601 -p 9200:9200 -p 5044:5044 -it --name elk sebp/elk

- 将启动整个ELK堆栈。请参阅_Starting services selective_部分以选择性地启动堆栈的一部分。

此命令发布以下端口,这些端口是正确操作ELK堆栈所需的:

  • 5601(Kibana web界面)。
  • 9200(Elasticsearch JSON接口)。
  • 5044(Logstash Beats界面,从Beats接收日志,如Filebeat - 请参阅_带有Filebeat转发日志_部分)。

- 图像还在端口9300上公开Elasticsearch的传输接口。使用上面命令的-p 9300:9300选项docker发布它。此传输接口尤其被Elasticsearch的Java客户端API使用,并在群集中运行Elasticsearch。

下图显示了这些部件如何组合在一起。

通过浏览到Access Kibana的Web界面http://<your-host>:5601,这里<your-host>是码头工人正在运行的主机的主机名或IP地址(见注),例如,localhost如果运行的码头工人的本地原生版本,或虚拟机的IP地址,如果运行的VM的托管的托管版本(见注释)。

- 要配置和/或查找VM托管的Docker安装的IP地址,请参阅https://docs.docker.com/installation/windows/(Windows)和https://docs.docker.com/installation / mac /(OS X),如果使用Boot2Docker则提供指导。如果您正在使用Vagrant,则需要设置端口转发(请参阅https://docs.vagrantup.com/v2/networking/forwarded_ports.html

您可以使用^C,停止容器,然后重新启动它sudo docker start elk

从Kibana版本4.0.0开始,在记录某些内容之前,您将无法看到任何内容(甚至不是空的仪表板)(请参阅下面的_创建虚拟日志条目子部分,了解如何测试您的设置,和转发日志_部分,介绍如何从常规应用程序转发日志)。

在Kibana中填写索引模式时(默认为logstash-*),请注意,在此映像中,Logstash使用一个输出插件,该插件配置为使用Beat-originating输入(例如,由Filebeat生成,请参阅使用Filebeat转发日志)和该日志将使用<beatname>-前缀索引(例如filebeat-,使用Filebeat时)。

使用Docker Compose运行容器

如果您正在使用Docker Compose来管理您的Docker服务(如果不是,您真的应该这会让您的生活更轻松!),那么您可以通过在docker-compose.yml文件中添加以下行来为ELK Docker镜像创建一个条目:

elk:
  image: sebp/elk
  ports:
    - "5601:5601"
    - "9200:9200"
    - "5044:5044"

然后,您可以像这样启动ELK容器:

$ sudo docker-compose up elk

使用Kitematic运行容器

Windows和OS X用户可能更喜欢使用简单的图形用户界面来运行容器,如Kitematic提供的,它包含在Docker Toolbox中

启动Kitematic并从sebp / elk映像创建新容器后,单击_Settings_选项卡,然后单击_Ports_子选项卡,查看容器_公开的端口_列表(在_DOCKER PORT下_)和IP列表它们在您的计算机上发布和访问的地址和端口(在_MAC IP:PORT下_)。

例如,您可以看到Kibana的Web界面(由容器暴露为端口5601)发布在192.168.99.100:32770之类的地址,您现在可以在浏览器中访问该地址。

- 本文档的其余部分假定公开和发布的端口共享相同的编号(例如,http://<your-host>:5601/用于引用Kibana的Web界面),因此在使用Kitematic时,您需要确保将主机名替换为IP地址_和_具有Kitematic列出的已发布端口的公开端口(例如http://192.168.99.100:32770,在前面的示例中)。

创建虚拟日志条目

如果您还没有任何日志,并且想要手动创建虚拟日志条目以进行测试(例如查看仪表板),请首先像往常一样启动容器(sudo docker run ...docker-compose up ...)。

在另一个终端窗口中,找出运行ELK的容器的名称,该容器显示在sudo docker ps命令输出的最后一列中。

$ sudo docker ps
CONTAINER ID        IMAGE                  ...   NAMES
86aea21cab85        elkdocker_elk:latest   ...   elkdocker_elk_1

在容器中打开shell提示符并键入(替换<container-name>为容器的名称,例如elkdocker_elk_1在上面的示例中):

$ sudo docker exec -it <container-name> /bin/bash

在提示符下输入:

# /opt/logstash/bin/logstash --path.data /tmp/logstash/data \
    -e 'input { stdin { } } output { elasticsearch { hosts => ["localhost"] } }'

等待Logstash启动(如消息所示The stdin plugin is now waiting for input:),然后键入一些虚拟文本,然后按Enter键以创建日志条目:

this is a dummy entry

- 您可以根据需要创建任意数量的条目。用于^C返回bash提示符。

如果您浏览到http://<your-host>:9200/_search?pretty(例如http:// localhost:9200 / _search?非常适用于Docker的本地本机实例),您将看到Elasticsearch已将该条目编入索引:

{
  ...
  "hits": {
    ...
    "hits": [ {
      "_index": "logstash-...",
      "_type": "logs",
      ...
      "_source": { "message": "this is a dummy entry", "@version": "1", "@timestamp": ... }
    } ]
  }
}

您现在可以浏览Kibana的Web界面http://<your-host>:5601(例如,http:// localhost:5601,用于Docker的本地本机实例)。

确保下拉的“时间过滤器字段名称”字段预先填充了值@timestamp,然后单击“创建”,您就可以开始了。

有选择地启动服务

默认情况下,启动容器时,将启动所有三个ELK服务(Elasticsearch,Logstash,Kibana)。

以下环境变量可用于有选择地启动服务的子集:

  • ELASTICSEARCH_START:如果设置并设置为除以外的任何其他内容1,则不会启动Elasticsearch。
  • LOGSTASH_START:如果设置并设置为除以外的任何内容1,则不会启动Logstash。
  • KIBANA_START:如果设置并设置为除此之外的任何内容1,则Kibana将不会启动。

例如,以下命令仅启动Elasticsearch:

$ sudo docker run -p 5601:5601 -p 9200:9200 -p 5044:5044 -it \
    -e LOGSTASH_START=0 -e KIBANA_START=0 --name elk sebp/elk

请注意,如果要在_禁用_ Elasticsearch的情况下启动容器,则:

  • 如果启用了Logstash,那么您需要确保Logstash的Elasticsearch输出插件(/etc/logstash/conf.d/30-output.conf)的配置文件指向属于Elasticsearch集群的主机而不是localhost(这是ELK映像中的默认设置,因为默认情况下Elasticsearch和Logstash运行在一起),例如:

    output {
      elasticsearch { hosts => ["elk-master.example.com"] }
    }
    
  • 同样,如果启用了Kibana,则kibana.yml必须首先更新Kibana的配置文件,以使elasticsearch.url设置(默认值:) "http://localhost:9200"指向正在运行的Elasticsearch实例。

覆盖启动变量

以下环境变量可用于覆盖用于启动服务的默认值:

  • TZ:容器的时区(请参阅有效时区列表),例如America/Los_Angeles(默认为Etc/UTCUTC,即UTC)。
  • ES_HEAP_SIZE:Elasticsearch堆大小(默认为256MB min,最大1G)

    指定堆大小 - 例如2g- 将min和max都设置为提供的值。要分别设置最小值和最大值,请参阅ES_JAVA_OPTS以下内容。

  • ES_JAVA_OPTS:对于Elasticsearch其他Java选项(默认值:""

    例如,要将最小和最大堆大小设置为512MB和2G,请将此环境变量设置为-Xms512m -Xmx2g

  • ES_CONNECT_RETRY:等待秒数为Elasticsearch是之前开始Logstash和/或Kibana(默认值:30
  • ES_PROTOCOL:协议使用ping通Elasticsearch的JSON接口URL(默认值:http

    请注意,此变量仅用于在启动服务时测试Elasticsearch是否已启动。它不用于在Logstash和Kibana的配置文件中更新Elasticsearch的URL。

  • CLUSTER_NAME:Elasticsearch集群的名称(默认值:如果Elasticsearch不需要用户身份验证,则在容器启动时自动解析)。

    Elasticsearch集群的名称用于设置容器在运行时显示的Elasticsearch日志文件的名称。默认情况下,CLUSTER_NAME通过匿名查询Elasticsearch的REST API,在启动时自动解析集群的名称(并填充)。但是,当Elasticsearch需要用户身份验证时(例如,在运行X-Pack时默认情况下),此查询失败并且容器因为假定Elasticsearch未正常运行而停止。因此,CLUSTER_NAME环境变量可用于指定群集的名称并绕过(失败)自动解决方案。

  • LS_HEAP_SIZE:Logstash堆大小(默认值:"500m"
  • LS_OPTS:Logstash选项(默认:"--auto-reload"在标签图像es231_l231_k450es232_l232_k450""latest,看到重大的变动
  • NODE_OPTIONS:对于Kibana节点选项(默认值:"--max-old-space-size=250"
  • MAX_MAP_COUNT:限制mmap计数(默认值:系统默认值)

    警告 - 此设置取决于系统:并非所有系统都允许在容器内设置此限制,您可能需要在启动容器之前从主机设置此限制(请参阅先决条件)。

  • MAX_OPEN_FILES:最大打开文件数(默认值:系统默认值; Elasticsearch需要此数量至少等于65536)
  • KIBANA_CONNECT_RETRY:等待的秒数Kibana待涨运行钩后脚本之前(参见前钩和后钩)(默认值:30
  • ES_HEAP_DISABLELS_HEAP_DISABLEHeapDumpOnOutOfMemoryError如果非零,则分别禁用Elasticsearch和Logstash(默认值:HeapDumpOnOutOfMemoryError已启用)。

    如果服务内存不足,设置这些环境变量可避免潜在的大堆转储。

作为示例,以下命令启动堆栈,运行具有2GB堆大小的Elasticsarch和具有1GB堆大小的Logstash:

$ sudo docker run -p 5601:5601 -p 9200:9200 -p 5044:5044 -it \
    -e ES_HEAP_SIZE="2g" -e LS_HEAP_SIZE="1g" --name elk sebp/elk

预挂钩和后挂钩

在启动ELK服务之前,容器将运行脚本(/usr/local/bin/elk-pre-hooks.sh如果存在且可执行)。

这尤其可以用于通过修改相应的文件将自定义环境变量(除了图像支持默认环境变量之外)暴露给Elasticsearch和Logstash /etc/default

例如,要将自定义MY_CUSTOM_VAR环境变量公开给Elasticsearch,请将可执行文件添加/usr/local/bin/elk-pre-hooks.sh到容器中(例如,通过将ADD其添加到Dockerfile扩展基本映像的自定义,或通过在运行时绑定安装文件),并具有以下内容:

cat << EOF >> /etc/default/elasticsearch
MY_CUSTOM_VAR=$MY_CUSTOM_VAR
export MY_CUSTOM_VAR 
EOF

启动ELK服务后,容器将运行脚本(/usr/local/bin/elk-post-hooks.sh如果存在且可执行)。

例如,这可以用于向Elasticsearch添加索引模板,或者在服务启动后向Kibana添加索引模式。

转发日志

来自主机的转发日志依赖于收集日志的转发代理(例如,来自日志文件,来自syslog守护程序)并将它们发送到我们的Logstash实例。

使用Filebeat转发日志

在要收集的主机上安装Filebeat并转发日志(有关详细说明的链接,请参阅“ _参考”_部分)。

- 确保Filebeat的版本与ELK映像的版本相同。

示例Filebeat设置和配置

- GitHub上nginx-filebeat源Git存储库的子目录包含一个示例Dockerfile,使您可以创建实现以下步骤的Docker镜像。

下面是/etc/filebeat/filebeat.ymlFilebeat 的示例配置文件,它转发syslog和身份验证日志以及nginx日志。

output:
  logstash:
    enabled: true
    hosts:
      - elk:5044
    ssl:
      certificate_authorities:
        - /etc/pki/tls/certs/logstash-beats.crt
    timeout: 15

filebeat:
  prospectors:
    -
      paths:
        - /var/log/syslog
        - /var/log/auth.log
      document_type: syslog
    -
      paths:
        - "/var/log/nginx/*.log"
      document_type: nginx-access

在示例配置文件,请确保您替换elkelk:5044与ELK-服务主机的主机名或IP地址。

您还需要从ELK源存储库复制logstash-beats.crt文件(包含证书颁发机构的证书 - 或服务器证书,因为证书是自签名的 - 用于Logstash的Beats输入插件; 有关证书的更多信息,请参阅安全注意事项图像/etc/pki/tls/certs/logstash-beats.crt

- 或者,在Windows计算机上使用Filebeat时certificate_authoritieslogstash-beats.crt可以在Windows的“受信任的根证书颁发机构”存储中安装证书,而不是使用配置选项。

- ELK映像包含用于解析nginx访问日志的配置项(/etc/logstash/conf.d/11-nginx.conf/opt/logstash/patterns/nginx),由上面的Filebeat实例转发。

如果您是第一次启动Filebeat,则应在Elasticsearch中加载默认索引模板。_在撰写本文时,在版本6中,在Elasticsearch中加载索引模板不起作用,请参阅已知问题。_

启动Filebeat:

    sudo /etc/init.d/filebeat start

有关处理多行日志条目的说明

为了使用Filebeat将多行日志条目(例如堆栈跟踪)作为单个事件处理,您可能需要考虑在Beats 1.1.0中引入的Filebeat的多行选项,作为改变Logstash的配置文件以使用Logstash的多行的便捷替代方案编解码器

将Docker容器连接到在同一主机上运行的ELK容器

如果要将日志从Docker容器转发到主机上的ELK容器,则需要连接这两个容器。

- 发出日志的Docker容器必须在其中运行Filebeat才能使其正常工作。

首先,创建一个孤立的,用户定义的bridge网络(我们称之为elknet):

$ sudo docker network create -d bridge elknet

现在启动ELK容器,elk使用该--name选项为其命名(例如),并指定它必须连接到的网络(elknet在此示例中):

$ sudo docker run -p 5601:5601 -p 9200:9200 -p 5044:5044 -it \
    --name elk --network=elknet sebp/elk

然后在同一网络上启动日志发送容器(替换your/image为您要转发日志的Filebeat启用映像的名称):

$ sudo docker run -p 80:80 -it --network=elknet your/image

从日志发射容器的角度来看,ELK容器现在称为elk,它是hostsfilebeat.yml配置文件中使用的主机名。

有关使用Docker建立网络的更多信息,请参阅Docker关于使用network命令的文档

在没有用户定义的网络的情况下链接容器

这是bridge使用链接在Docker的默认网络上连接容器的传统方式,这些链接是Docker的旧版功能,最终可能会被删除

首先,elk使用--name选项为ELK容器命名(例如):

$ sudo docker run -p 5601:5601 -p 9200:9200 -p 5044:5044 -it --name elk sebp/elk

Then start the log-emitting container with the --link option (replacing your/image with the name of the Filebeat-enabled image you're forwarding logs from):

$ sudo docker run -p 80:80 -it --link elk:elk your/image

From the perspective of the log emitting container, the ELK container is now known as elk, which is the hostname to be used under hosts in the filebeat.yml configuration file.

With Compose here's what example entries for a (locally built log-generating) container and an ELK container might look like in the docker-compose.yml file.

yourapp:
  image: your/image
  ports:
    - "80:80"
  links:
    - elk

elk:
  image: sebp/elk
  ports:
    - "5601:5601"
    - "9200:9200"
    - "5044:5044"

Building the image

To build the Docker image from the source files, first clone the Git repository, go to the root of the cloned directory (i.e. the directory that contains Dockerfile), and:

  • If you're using the vanilla docker command then run sudo docker build -t <repository-name> ., where <repository-name> is the repository name to be applied to the image, which you can then use to run the image with the docker run command.
  • If you're using Compose then run sudo docker-compose build elk, which uses the docker-compose.yml file from the source repository to build the image. You can then run the built image with sudo docker-compose up.

Tweaking the image

There are several approaches to tweaking the image:

  • 将图像用作基本图像并对其进行扩展,添加文件(例如,配置文件以处理由日志生成应用程序发送的日志,Elasticsearch的插件)以及根据需要覆盖文件(例如配置文件,证书和私钥文件)。有关编写a的更多信息,请参见Docker的Dockerfile Reference页面Dockerfile
  • 通过将本地文件绑定到容器中的文件来替换现有文件。有关卷的更多信息以及特别是绑定安装的详细信息,请参阅Docker的管理容器中数据页面。
  • 分叉源Git存储库并进行攻击。

接下来的几个小节介绍了一些典型的用例。

更新Logstash的配置

一般来说,Logstash的目录布局是这里描述的。

Logstash的设置是由配置文件(如定义logstash.ymljvm.optionspipelines.yml)位于/opt/logstash/config

开箱即用图像的pipelines.yml配置文件定义了一个默认的管道,生成的文件(例如01-lumberjack-input.conf02-beats-input.conf位于)/etc/logstash/conf.d

- 有点令人困惑的是,术语“配置文件”可用于指代定义Logstash设置的文件或定义其管道的文件(可能是您想要调整最多的那些)。

要修改现有配置文件(无论是高级Logstash配置文件还是管道配置文件),您可以在运行时将本地配置文件绑定到容器内的配置文件。例如,如果要将图像的30-output.conf配置文件替换为本地文件/path/to/your-30-output.conf,则可以-vdocker命令行中添加以下选项:

$ sudo docker run ... \
    -v /path/to/your-30-output.conf:/etc/logstash/conf.d/30-output.conf \
    ...

要使用更新或其他配置文件创建自己的图像,可以创建Dockerfile扩展原始图像的图像,其内容如下所示:

FROM sebp/elk

# overwrite existing file
ADD /path/to/your-30-output.conf /etc/logstash/conf.d/30-output.conf

# add new file
ADD /path/to/new-12-some-filter.conf /etc/logstash/conf.d/12-some-filter.conf

然后使用docker build语法构建扩展图像。

安装Elasticsearch插件

Elasticsearch在图像中的主目录是/opt/elasticsearch,其插件管理脚本elasticsearch-plugin)驻留在bin子目录中,并安装了插件plugins

Elasticsearch以用户身份运行elasticsearch。为避免权限问题,建议elasticsearch使用gosu命令安装Elasticsearch插件(有关示例,请参阅下文,有关详细信息,请参阅参考资料)。

Dockerfile像下面将扩展基本图像和安装GeoIP的处理器插件(这增加了有关IP地址的地理位置信息):

FROM sebp/elk

ENV ES_HOME /opt/elasticsearch
WORKDIR ${ES_HOME}

RUN yes | CONF_DIR=/etc/elasticsearch gosu elasticsearch bin/elasticsearch-plugin \
    install -b ingest-geoip

您现在可以构建新图像(请参阅上面的_构建图像_部分)并以与基本图像相同的方式运行容器。

安装Logstash插件

图像中Logstash主目录的名称存储在LOGSTASH_HOME环境变量中(/opt/logstash在基本映像中设置)。Logstash的插件管理脚本(logstash-plugin)位于bin子目录中。

Logstash以用户身份运行logstash。为避免权限问题,建议logstash使用gosu命令安装Logstash插件(有关示例,请参阅下文,有关详细信息,请参阅参考资料)。

以下内容Dockerfile可用于扩展基本映像并安装RSS输入插件

FROM sebp/elk

WORKDIR ${LOGSTASH_HOME}
RUN gosu logstash bin/logstash-plugin install logstash-input-rss

See the Building the image section above for instructions on building the new image. You can then run a container based on this image using the same command line as the one in the Usage section.

Installing Kibana plugins

The name of Kibana's home directory in the image is stored in the KIBANA_HOME environment variable (which is set to /opt/kibana in the base image). Kibana's plugin management script (kibana-plugin) is located in the bin subdirectory, and plugins are installed in installedPlugins.

Kibana runs as the user kibana. To avoid issues with permissions, it is therefore recommended to install Kibana plugins as kibana, using the gosu command (see below for an example, and references for further details).

A Dockerfile similar to the ones in the sections on Elasticsearch and Logstash plugins can be used to extend the base image and install a Kibana plugin.

Persisting log data

In order to keep log data across container restarts, this image mounts /var/lib/elasticsearch — which is the directory that Elasticsearch stores its data in — as a volume.

You may however want to use a dedicated data volume to persist this log data, for instance to facilitate back-up and restore operations.

One way to do this is to mount a Docker named volume using docker's -v option, as in:

$ sudo docker run -p 5601:5601 -p 9200:9200  -p 5044:5044 \
    -v elk-data:/var/lib/elasticsearch --name elk sebp/elk

This command mounts the named volume elk-data to /var/lib/elasticsearch (and automatically creates the volume if it doesn't exist; you could also pre-create it manually using docker volume create elk-data).

Note – By design, Docker never deletes a volume automatically (e.g. when no longer used by any container). Whilst this avoids accidental data loss, it also means that things can become messy if you're not managing your volumes properly (e.g. using the -v option when removing containers with docker rm to also delete the volumes... bearing in mind that the actual volume won't be deleted as long as at least one container is still referencing it, even if it's not running). You can keep track of existing volumes using docker volume ls.

See Docker's page on Managing Data in Containers and Container42's Docker In-depth: Volumes page for more information on managing data volumes.

在权限方面,Elasticsearch数据由图像elasticsearch用户创建,使用UID 991和GID 991。

存在一种已知的情况,即SELinux在_强制_模式下运行时拒绝访问已装入的卷。解决方法是使用该setenforce 0命令以_许可_模式运行SELinux 。

快照和还原

/var/backups目录被注册为快照存储库(使用配置文件中的path.repo参数elasticsearch.yml)。可以使用卷或绑定装置来访问此目录以及容器外部的快照。

有关快照和恢复操作的更多信息,请参见官方文档的快照和恢复

设置Elasticsearch集群

ELK映像可用于在单独的主机上运行Elasticsearch集群,或者(主要用于测试目的)在单个主机上运行,如下所述。

有关设置Elasticsearch集群的更多(非Docker特定的)信息,请参阅Elasticsearch权威指南的“集群内部生活”部分

在不同主机上运行Elasticsearch节点

要在不同主机上运行群集节点,您需要更新/etc/elasticsearch/elasticsearch.ymlDocker镜像中的Elasticsearch 文件,以便节点可以找到彼此:

  • 配置zen发现模块,方法是添加一个discovery.zen.ping.unicast.hosts指令,指向在每个节点上启动Elasticsearch时应轮询执行发现的主机的IP地址或主机名。
  • 设置network.*指令如下:

    network.host: 0.0.0.0
    network.publish_host: <reachable IP address or FQDN>
    

    其中reachable IP address指的是其他节点可以访问的IP地址(例如,公共IP地址,或路由的专用IP地址,但_不是_ Docker分配的内部172.xxx地址)。

  • 发布端口9300

例如,像往常一样在一个主机上启动一个ELK容器,它将充当第一个主机。我们假设主机名为_elk-master.example.com_。

看看集群的健康状况:

$ curl http://elk-master.example.com:9200/_cluster/health?pretty
{
  "cluster_name" : "elasticsearch",
  "status" : "yellow",
  "timed_out" : false,
  "number_of_nodes" : 1,
  "number_of_data_nodes" : 1,
  "active_primary_shards" : 6,
  "active_shards" : 6,
  "relocating_shards" : 0,
  "initializing_shards" : 0,
  "unassigned_shards" : 6,
  "delayed_unassigned_shards" : 6,
  "number_of_pending_tasks" : 0,
  "number_of_in_flight_fetch" : 0,
  "task_max_waiting_in_queue_millis" : 0,
  "active_shards_percent_as_number" : 50.0
}

这表示此刻只有一个节点处于启动yellow状态,状态表示所有主分片都处于活动状态,但并非所有副本分片都处于活动状态。

然后,在另一台主机上,创建一个名为elasticsearch-slave.yml(让我们说它在里面/home/elk)的文件,其中包含以下内容:

network.host: 0.0.0.0
network.publish_host: <reachable IP address or FQDN>
discovery.zen.ping.unicast.hosts: ["elk-master.example.com"]

您现在可以使用以下命令(将主机上的配置文件安装到容器中)启动使用此配置文件的ELK容器:

$ sudo docker run -it --rm=true -p 9200:9200 -p 9300:9300 \
  -v /home/elk/elasticsearch-slave.yml:/etc/elasticsearch/elasticsearch.yml \
  sebp/elk

Elasticsearch启动后,在原始主机上显示群集的运行状况现在显示:

$ curl http://elk-master.example.com:9200/_cluster/health?pretty
{
  "cluster_name" : "elasticsearch",
  "status" : "green",
  "timed_out" : false,
  "number_of_nodes" : 2,
  "number_of_data_nodes" : 2,
  "active_primary_shards" : 6,
  "active_shards" : 12,
  "relocating_shards" : 0,
  "initializing_shards" : 0,
  "unassigned_shards" : 0,
  "delayed_unassigned_shards" : 0,
  "number_of_pending_tasks" : 0,
  "number_of_in_flight_fetch" : 0,
  "task_max_waiting_in_queue_millis" : 0,
  "active_shards_percent_as_number" : 100.0
}

在单个主机上运行Elasticsearch节点

将Elasticsearch节点设置为在单个主机上运行类似于在不同主机上运行节点,但需要链接容器以便节点相互发现。

使用docker主机上的常规命令启动第一个节点:

$ sudo docker run -p 5601:5601 -p 9200:9200 -p 5044:5044 -it --name elk sebp/elk

现在,创建一个elasticsearch-slave.yml包含以下行的基本文件:

network.host: 0.0.0.0
discovery.zen.ping.unicast.hosts: ["elk"]

使用以下命令启动节点:

$ sudo docker run -it --rm=true \
  -v /var/sandbox/elk-docker/elasticsearch-slave.yml:/etc/elasticsearch/elasticsearch.yml \
  --link elk:elk --name elk-slave sebp/elk

请注意,Elasticsearch的端口未发布到主机的端口9200,因为它已由初始ELK容器发布。

优化您的Elasticsearch集群

您可以按原样使用ELK映像来运行Elasticsearch集群,特别是如果您只是进行测试,但为了优化您的设置,您可能希望:

  • 一个节点运行完整的ELK堆栈,使用ELK映像。
  • 几个节点_仅_运行Elasticsearch(请参阅_有选择地启动服务_)。

在多个节点或主机上分发Elasticsearch,Logstash和Kibana的更优化方法是在相应的节点或主机上仅运行所需的服务(例如,在多个主机上使用Elasticsearch,在专用主机上运行Logstash,在另一个专用主​​机上运行Kibana) )。

安全考虑

目前该图像用于本地测试,因此尚未得到保护:对ELK服务的访问不受限制,Logstash输入插件的默认认证服务器证书和私钥与图像捆绑在一起。

要强化这个图像,至少你会想:

The sebp/elkx image, which extends the ELK image with X-Pack, may be a useful starting point to improve the security of the ELK services.

If on the other hand you want to disable certificate-based server authentication (e.g. in a demo environment), see Disabling SSL/TLS.

Notes on certificates

Dummy server authentication certificates (/etc/pki/tls/certs/logstash-*.crt) and private keys (/etc/pki/tls/private/logstash-*.key) are included in the image.

Note – For Logstash 2.4.0 a PKCS#8-formatted private key must be used (see Breaking changes for guidance).

The certificates are assigned to hostname *, which means that they will work if you are using a single-part (i.e. no dots) domain name to reference the server from your client.

Example – In your client (e.g. Filebeat), sending logs to hostname elk will work, elk.mydomain.com will not (will produce an error along the lines of x509: certificate is valid for *, not elk.mydomain.com), neither will an IP address such as 192.168.0.1 (expect x509: cannot validate certificate for 192.168.0.1 because it doesn't contain any IP SANs).

If you cannot use a single-part domain name, then you could consider:

  • Issuing a self-signed certificate with the right hostname using a variant of the commands given below.
  • Issuing a certificate with the IP address of the ELK stack in the subject alternative name field, even though this is bad practice in general as IP addresses are likely to change.
  • Adding a single-part hostname (e.g. elk) to your client's /etc/hosts file.

The following commands will generate a private key and a 10-year self-signed certificate issued to a server with hostname elk for the Beats input plugin:

$ cd /etc/pki/tls
$ sudo openssl req -x509 -batch -nodes -subj "/CN=elk/" \
    -days 3650 -newkey rsa:2048 \
    -keyout private/logstash-beats.key -out certs/logstash-beats.crt

As another example, when running a non-predefined number of containers concurrently in a cluster with hostnames directly under the .mydomain.com domain (e.g. elk1.mydomain.com, elk2.mydomain.com, etc.; not elk1.subdomain.mydomain.com, elk2.othersubdomain.mydomain.com etc.), you could create a certificate assigned to the wildcard hostname *.example.com by using the following command (all other parameters are identical to the ones in the previous example).

$ cd /etc/pki/tls
$ sudo openssl req -x509 -batch -nodes -subj "/CN=*.example.com/" \
    -days 3650 -newkey rsa:2048 \
    -keyout private/logstash-beats.key -out certs/logstash-beats.crt

To make Logstash use the generated certificate to authenticate to a Beats client, extend the ELK image to overwrite (e.g. using the Dockerfile directive ADD):

  • 证书文件(logstash-beats.crt)用/etc/pki/tls/certs/logstash-beats.crt
  • 私钥文件(logstash-beats.key)用/etc/pki/tls/private/logstash-beats.key

此外,请记住使用该certificate_authorities指令将Beats客户端配置为信任新创建的证书,如使用Filebeat转发日志中所示

禁用SSL / TLS

基于证书的服务器身份验证要求生成日志的客户端信任服务器的根证书颁发机构的证书,这在零关键性环境(例如演示环境,沙箱)中可能是不必要的麻烦。

要禁用基于证书的服务器身份验证,删除所有sslssl-prefixed指令(例如ssl_certificatessl_key在Logstash的输入插件配置文件)。

例如,使用映像中的默认配置文件,将02-beats-input.conf(用于Beats发射器)的内容替换为:

input {
  beats {
    port => 5044
  }
}

经常遇到的问题

Elasticsearch没有开始(1): max virtual memory areas vm.max_map_count [65530] likely too low, increase to at least [262144]

如果容器停止并且其日志包含消息max virtual memory areas vm.max_map_count [65530] likely too low, increase to at least [262144],则mmap计数的限制太低,请参阅先决条件

Elasticsearch没有开始(2): cat: /var/log/elasticsearch/elasticsearch.log: No such file or directory

如果_未_转储Elasticsearch的日志(即您收到以下消息cat: /var/log/elasticsearch/elasticsearch.log: No such file or directory:),则Elasticsearch没有足够的内存来启动,请参阅先决条件

Elasticsearch没有启动(3):bootstrap测试

从版本5开始,如果Elasticsearch不再启动,即waiting for Elasticsearch to be up (xx/30)计数器上升到30并且容器退出Couln't start Elasticsearch. Exiting. 并且 Elasticsearch的日志被转储,则读取日志中的建议并考虑_必须_应用它们。

特别是,在上面的情况(1)中,该消息max virtual memory areas vm.max_map_count [65530] likely too low, increase to at least [262144]意味着主机对mmap计数的限制必须设置为至少262144。

另一个例子是max file descriptors [4096] for elasticsearch process is too low, increase to at least [65536]。在这种情况下,ulimit -n必须增加主机对打开文件的限制(如显示)(参见Elasticsearch文档中的文件描述符); ulimit必须为容器(使用docker run's --ulimit选项Docker Compose的ulimits配置选项)或全局(例如/etc/sysconfig/docker,添加OPTIONS="--default-ulimit nofile=1024:65536")调整Docker的设置。

Elasticsearch在正常启动后突然停止

对于默认映像,这通常是由于Elasticsearch在其他服务启动后耗尽内存,并且(静默)杀死相应的进程。

作为提醒(请参阅先决条件),您应该使用不少于3GB的内存来运行容器...可能还有更多。

其他已知问题包括:

  • Elasticsearch没有足够的时间启动默认图像设置:在这种情况下,ES_CONNECT_RETRY环境变量设置为大于30的值。(默认情况下,Elasticsearch在启动其他服务之前有30秒的启动时间,这可能不够并且导致要停下来的容器。)
  • 代理设置不正确,例如,如果为Docker定义了代理,请确保localhost未代理连接(例如,使用no_proxy设置)。

已知的问题

使用Filebeat时,索引模板文件用于连接到Elasticsearch以定义确定应如何分析字段的设置和映射。

在版本5中,在第一次启动Filebeat之前,您将运行此命令(替换elk为相应的主机名)以在Elasticsearch中加载默认索引模板:

    curl -XPUT 'http://elk:9200/_template/filebeat?pretty' -d@/etc/filebeat/filebeat.template.json

但是,在版本6中,filebeat.template.json模板文件已替换为fields.yml文件,该文件用于通过filebeat setup --template 按照官方Filebeat指令运行手动加载索引。不幸的是,这当前不起作用并导致以下消息:

Exiting: Template loading requested but the Elasticsearch output is not configured/enabled

尝试在不设置模板的情况下启动Filebeat会产生以下消息:

Warning: Couldn't read data from file "/etc/filebeat/filebeat.template.json",
Warning: this makes an empty POST.
{
  "error" : {
    "root_cause" : [
      {
        "type" : "parse_exception",
        "reason" : "request body is required"
      }
    ],
    "type" : "parse_exception",
    "reason" : "request body is required"
  },
  "status" : 400
}

可以假设在Filebeat的更高版本中,将阐明指令以指定如何将索引模板手动加载到Elasticsearch的特定实例中,并且警告消息将消失,因为版本6中不再适用。

故障排除

重要 - 如果您需要帮助来解决Elasticsearch,Logstash或Kibana的配置问题,无论服务在何处运行(在Docker容器中),请转到Elastic论坛。以下故障排除指南仅适用于使用ELK Docker镜像运行容器。

以下是帮助您对容器化ELK进行故障排除的几点建议。

如果Elasticsearch没有启动......

如果经常遇到的问题中列出的建议没有帮助,那么解决Elasticsearch未启动的原因的另一种方法是:

  • 使用以下bash命令启动容器:

    $ sudo docker run -it docker_elk bash
    
  • 手动启动Elasticsearch以查看其输出内容:

    $ gosu elasticsearch /opt/elasticsearch/bin/elasticsearch \
        -Edefault.path.logs=/var/log/elasticsearch \
        -Edefault.path.data=/var/lib/elasticsearch \
        -Edefault.path.conf=/etc/elasticsearch
    

如果您的日志发射客户端似乎无法访问Logstash ...

- 类似的故障排除步骤适用于将日志直接发送到Elasticsearch的设置。

确保:

  • 您启动了正确端口打开的容器(例如Beats为5044)。
  • 如果您使用的是Filebeat,则其版本与ELK映像/堆栈的版本相同。
  • 可以从客户端计算机访问端口(例如,确保已在防火墙上设置适当的规则,以授权来自客户端的出站流和ELK托管计算机上的入站流)。
  • 您的客户端配置为使用TLS(或SSL)连接到Logstash,并且它信任Logstash的自签名证书(或证书颁发机构,如果您使用适当的证书替换了默认证书 - 请参阅安全注意事项)。

    要检查Logstash是否使用正确的证书进行身份验证,请检查输出中的错误

    $ openssl s_client -connect localhost:5044 -CAfile logstash-beats.crt
    

    其中logstash-beats.crt是包含Logstash自签名证书的文件的名称。

其他提示

如果上面给出的建议无法解决您的问题,那么您应该看看:

  • 您的日志发送客户端日志。
  • ELK的日志,通过docker exec进入正在运行的容器(请参阅创建虚拟日志条目),打开stdout日志(请参阅plugins-outputs-stdout),并检查Logstash的日志(位于/var/log/logstash),Elasticsearch的日志(in /var/log/elasticsearch)和Kibana的日志(in /var/log/kibana)。

    请注意,ELK的日志每天轮换,并在一周后使用logrotate删除。您可以通过覆盖更改此行为elasticsearchlogstashkibana在文件中/etc/logrotate.d

报告问题

重要 - 对于与Elasticsearch,Kibana和Elasticsearch的_非Docker相关_问题,请报告相应ElasticsearchLogstashKibana GitHub存储库上的问题。

您可以使用GitHub的问题跟踪器报告此图像的问题(请避免提出问题作为对Docker Hub的评论,如果仅因为在撰写本文时通知系统已损坏,那么我很可能无法看到它一阵子)。

请记住,我需要做的第一件事就是重现您的问题,请提供尽可能多的相关信息(例如日志,配置文件,您期望的内容以及您所获得的内容,您采取的任何故障排除步骤,什么_是_尽可能让我这样做。

[](https://github.com/spujadas/elk-docker/pulls)如果您发现问题并且可以解决问题,也欢迎提出请求

打破变化

以下是升级到更高版本的ELK映像时可能有副作用的重大更改列表:

  • path.repo

    适用于标签:之后623

    Elasticsearch的path.repo参数被预定义为/var/backupselasticsearch.yml(见快照和恢复)。

  • 版本6

    适用于标签:600以及之后。

    ElasticsearchLogstashKibana的第6版中引入了重大更改

  • ES_HEAP_SIZELS_HEAP_SIZE

    适用于标签:502to 522

    覆盖ES_HEAP_SIZELS_HEAP_SIZE环境变量对Elasticsearch和Logstash使用的堆大小没有影响(请参阅问题#129)。

  • Elasticsearch主目录

    适用于标签:502以及之后。

    不再从deb软件包安装Elasticsearch (在5.0.2版中尝试修改无法从容器访问的系统文件); 而是从tar.gz包中安装。

    因此,Elasticsearch的主目录现在/opt/elasticsearch(是/usr/share/elasticsearch)。

  • 第5版

    适用于标签:es500_l500_k500以及之后。

    ElasticsearchLogstashKibana的第5版中引入了重大更改

  • PKCS#8格式的私钥

    适用于标签:es240_l240_k460es241_l240_k461

    在Logstash版本2.4.x中,Logstash使用Beats输入的私钥应该是PKCS#8格式。要将私钥(logstash-beats.key)从其默认PKCS#1格式转换为PKCS#8,请使用以下命令:

    $ openssl pkcs8 -in logstash-beats.key -topk8 -nocrypt -out logstash-beats.p8
    

    和指向logstash-beats.p8在文件ssl_keyLogstash的选项的02-beats-input.conf配置文件。

  • Logstash转发器

    适用于标签:es500_l500_k500以及之后。

    不推荐使用Logstash转发器,已删除其Logstash输入插件配置,并且不再公开端口5000。

  • UID和GID

    适用于标签:es235_l234_k454以及之后。

    修复了UID和GID现在分配给Elasticsearch(UID和GID都是991),Logstash(992)和Kibana(993)。

  • Java 8

    适用于标签:es234_l234_k452以及之后。

    此映像最初使用的是Oracle JDK 7,它不再由Oracle更新,不再作为Ubuntu软件包提供。

    从标记开始es234_l234_k452,映像使用Oracle JDK 8.这可能会对依赖Java的插件产生意想不到的副作用。

  • Logstash配置自动重新加载

    适用于标签:es231_l231_k450, es232_l232_k450.

    Logstash的配置自动重新加载选项在Logstash 2.3中引入,并在带有标签es231_l231_k450和的图像中启用es232_l232_k450

    由于此功能在Logstash 2.3.3之前创建了资源泄漏(请参阅https://github.com/elastic/logstash/issues/5235),因此--auto-reloades233_l232_k451-tagged映像中删除了该选项(请参阅https:// github。 com / spujadas / elk-docker / issues / 41)。

    与标签图像的用户es231_l231_k450,并es232_l232_k450强烈建议重写Logstash的选项通过设置来禁用自动装载功能,LS_OPTS环境变量--no-auto-reload如果不需要此功能。

    要在映像的更高版本中启用自动重新加载:

    • 从头es500_l500_k500开始:添加--config.reload.automatic命令行选项LS_OPTS
    • 从:es234_l234_k452es241_l240_k461:添加--auto-reloadLS_OPTS

参考

关于

SébastienPujadas撰写,根据Apache 2许可发布


Original url: Access
Created at: 2019-04-24 01:56:33
Category: default
Tags: none

请先后发表评论
  • 最新评论
  • 总共0条评论