前言

ELK日志管理系统是Elasticsearch + Logstash + Kibana的简称,加上Filebeat组成一整套日志收集,过滤,处理,数据存储和前端展示系统.博主经过一段时间的安装,配置,测试也基本满足了个人以及中小企业团队对于日志管理的需求.在研究的这段时间里参考了网上各种教程,整合了相对详细的部署和配置教程分享给大家.

本教程使用docker-compose整合部署,参考 deviantony/docker-elk 7.11.2TLS加密版.

ELK一般都部署于内网来管理内网服务器,由于个人使用,通过互联网管理各服务器,所以使用 TLS 版部署,确保在发送日志时使用加密协议保证安全.

本文为 Stille 原创文章.经实践,测试,整理发布.如需转载请联系作者获得授权,并注明转载地址.

项目流程

服务端:部署ELK即 Elasticsearch + Logstash + Kibana 到日志服务器.
客户端:部署Filebeat到需要收集日志的服务器.

常规流程

客户端部署Filebeat监控日志,发送至日志服务器ELK中的logstash做进一步的过滤和整理,在发送至数据库elasticsearch存储,通过kibana前端展示.

本文流程

由于个人使用,并没有过多的日志过滤和整理需求,加上logstash本身非常耗费服务器资源.所以本文教程将不使用logstash功能,直接在客户端部署Filebeat监控日志,发送至日志服务器ELK中的elasticsearch存储,通过kibana前端展示.

部署服务端 ELK

部署非 TLS 版本用于重置密码.

拉取代码

由于 7.11.2 TLS 版本无法正常使用重置密码脚本.则先启动非 TLS 版本,重置密码后,保存 data 数据.
git clone -b tls https://github.com/deviantony/docker-elk elk
# 拉取代码
cd elk
git reset 3c455d61ca2f83b7591d58bcac4d17216d99103e --hard
# reset 到 7.11.2 版本

修改 docker-compose.yml

修改docker-compose.yml中顶级卷配置到指定目录用于存储数据,并创建data目录.

volumes:
  elasticsearch:
    driver: local
    driver_opts:
      type: 'none'
      o: 'bind'
      device: '/root/elk/data'

启动 elk 并重置密码

docker-compose up -d
# 启动 elk
docker-compose exec -T elasticsearch bin/elasticsearch-setup-passwords auto --batch
# 重置并保存好密码
docker-compose down
# 停止 elk

保存 data 目录

保存data目录至其他位置,并删除整个elk目录.

正式部署 TLS 版 ELK

拉取代码

git clone -b tls https://github.com/deviantony/docker-elk elk
# 拉取代码
cd elk
git reset a9524a657815b8e285245760b0cff224551f6ad6 --hard
# reset 到 7.11.2 with tls 版本

创建证书

tls 版代码中已经含有 tls 目录,并且也已经有证书,本文建议自行创建自己的证书比较安全.

以下命令需在 tls 目录下执行,先执行 cd tls 在创建证书,提示时全部选 A 覆盖
docker run -it \
  -v ${PWD}:/usr/share/elasticsearch/tls \
  docker.elastic.co/elasticsearch/elasticsearch:7.11.0 \
  bin/elasticsearch-certutil cert \
    --days 3650 \
    --keep-ca-key \
    --in tls/instances.yml \
    --out tls/certificate-bundle.zip

再次参考以下提示,执行命令并选择.

docker run -it \
  -v ${PWD}:/usr/share/elasticsearch/tls \
  docker.elastic.co/elasticsearch/elasticsearch:7.11.0 \
  bin/elasticsearch-certutil http

参考选择

注意最后一行是填写路径 tls/elasticsearch-ssl-http.zip
Generate a CSR? [y/N] n
Use an existing CA? [y/N] y
CA Path: /usr/share/elasticsearch/tls/ca/ca.p12
Password for ca.p12: <none>
For how long should your certificate be valid? [5y] 10y
Generate a certificate per node? [y/N] n
(Enter all the hostnames that you need, one per line.)
elasticsearch
localhost
Is this correct [Y/n] y
(Enter all the IP addresses that you need, one per line.)
<none>
Is this correct [Y/n] y
Do you wish to change any of these options? [y/N] n
Provide a password for the "http.p12" file: <none>
What filename should be used for the output zip file? tls/elasticsearch-ssl-http.zip

生成 filebeat 客户端证书
filebeat客户端证书可以直接使用ca证书,也可以执行以下命令创建.

openssl pkcs12 -in ca.p12 -out filebeat.crt -clcerts -nokeys

修改配置

修改docker-compose.yml中顶级卷配置到指定目录用于存储数据,并将备份的data目录移动至elk目录下.

volumes:
  elasticsearch:
    driver: local
    driver_opts:
      type: 'none'
      o: 'bind'
      device: '/root/elk/data'

修改./elasticsearch/config/elasticsearch.yml文件:
xpack.license.self_generated.type: trial
修改为xpack.license.self_generated.type: basic

修改docker-compose.ymlelasticsearchlogstash的内存配置:
ES_JAVA_OPTS: "-Xmx2g -Xms2g"
LS_JAVA_OPTS: "-Xmx1g -Xms1g"

建议 ES 的内存设置不超过服务器内存的 50%

启动 elk

防火墙开放92005601端口并启动 elk

docker-compose up -d

使用http://IP:5601可访问kibana前端,使用用户名elastic和上文重置的PASSWORD elastic密码登陆.同时推荐使用nginx配置域名反向代理和HTTPS支持.


客户端 Filebeat

服务端依旧推荐使用docker compose来部署filebeat.将上文生成的证书filebeat.crt上传至此,并参考下文创建docker-compose.ymlfilebeat.yml.

docker-compose.yml

自行修改挂载目录,将需要发送的日志目录挂载至容器内.

version: '3.2'
services:
  filebeat:
    image: elastic/filebeat:7.11.2
    container_name: filebeat
    user: root
    volumes:
      - ./filebeat.yml:/usr/share/filebeat/filebeat.yml
      - ./filebeat.crt:/filebeat.crt
      # 挂载本地日志路径
      - /var/log/nginx:/logs/nginx
      - /var/lib/docker/containers:/var/lib/docker/containers
    environment:
      TZ: Asia/Shanghai
    restart: always

filebeat.yml 配置示例

注意修改ELK服务器地址,端口,密码等信息.

filebeat.config:
  modules:
    path: ${path.config}/modules.d/*.yml
    reload.enabled: false


# 定义本服务器位置字段
fields:
  location: hk


processors:
  - add_cloud_metadata: ~
  - add_docker_metadata: ~
# 根据 docker 日志传递的 docker.attrs.tag 容器名,筛选并丢弃无需的容器日志.
  - drop_event:
      when:
        contains:
          docker.attrs.tag: filebeat


filebeat.inputs:
# 注意 nginx 或其他日志需要在 docker-compose.yml 挂载日志目录到容器内.

  - type: log
    enabled: true
    paths: /logs/nginx/*.log
    fields:
      source: nginx

  - type: docker
    containers:
      path: "/var/lib/docker/containers"
      json.keys_under_root: true
      json.add_error_key: true
      json.message_key: log
      tail_files: true
      multiline.pattern: '^([0-9]{4}|[0-9]{2})-[0-9]{2}'
      multiline.negate: true
      multiline.match: after
      multiline.timeout: 10s
      ids:
        - "*"
    fields:
      source: docker


setup.template.name: "IOIOX"
setup.template.pattern: "IOIOX-*"
setup.template.overwrite: true
setup.template.enabled: true


output.elasticsearch:
  hosts: ['https://elasticsearch:9200']
  username: elastic
  password: xxxxxxxxxxxxxx
  ssl.certificate_authorities: ["/filebeat.crt"]
  ssl.verification_mode: none
  indices:
    - index: "IOIOX-%{[fields.location]}-%{[fields.source]}-%{+yyyy.MM.dd}"

容器日志监控

配置docker的全局日志,编辑/etc/docker/daemon.json,其中tag标签将传递docker.attrs.tag字段到filebeat.更多tag参考 官方文档 .

{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "200k",
    "max-file": "100",
    "labels": "production_status",
    "env": "os,customer",
    "tag": "{{.Name}}"
  }
}

执行以下命令生效,并且需将现有容器完全停止,删除,再次启动才能将日志按照配置传入ELK.

systemctl daemon-reload
systemctl restart docker

结语

ELK的安装部署教程已经分享给大家,欢迎大家留言交流.同时博主也可以提供部署服务,有需求的可以联系我.

本站提供免费和付费的技术支持.你可以通过留言,邮件,TG群的方式来技术交流和免费咨询.同时也可以付费支持的方式获得相关的技术支持,项目部署配置等服务.具体相关详情请点击查看 技术支持页面

如果喜欢我的文章,觉得对你有帮助,请随意赞赏!