docker-compose部署EFK

准备环境

系统版本:CentOS 7.6

服务器配置:2H 4G

软件版本(docker镜像):

elasticsearch 6.6.0
kibana 6.6.0
filebeat 6.6.0

安装 Docker-CE

添加 stable 版本的 docker 仓库

$ sudo yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo

安装 docker-ce

安装最新版的 docker

$ yum install docker-ce docker-ce-cli containerd.io

安装指定版本 docker

  • 查询可安装的版本:
$ yum list docker-ce --showduplicates | sort -r
 * updates: mirrors.tuna.tsinghua.edu.cn
Loading mirror speeds from cached hostfile
Loaded plugins: fastestmirror, langpacks
 * extras: mirrors.huaweicloud.com
docker-ce.x86_64            3:19.03.4-3.el7                     docker-ce-stable
......
docker-ce.x86_64            3:18.09.9-3.el7                     docker-ce-stable
docker-ce.x86_64            3:18.09.8-3.el7                     docker-ce-stable
docker-ce.x86_64            3:18.09.7-3.el7                     docker-ce-stable
docker-ce.x86_64            3:18.09.6-3.el7                     docker-ce-stable
......
docker-ce.x86_64            18.06.0.ce-3.el7                    docker-ce-stable
  • 比如这里我们来安装 docker-ce-18.09.9 版本:
$ yum install docker-ce-18.09.9 docker-ce-cli-18.09.9 containerd.io -y

安装完成,但是还没有启动,由于我这里的磁盘空间不大,所以需要更改下 Docker 的根目录,将默认的 /var/lib/docker 更改为 /data/docker 目录,添加如下配置文件:

$ mkdir -p /etc/docker
$ vi /etc/docker/daemon.json
{
  "registry-mirrors" : [
    "https://ot2k4d59.mirror.aliyuncs.com/"
  ],
  "graph": "/data/docker"
}

镜像加速器:

使用加速器可以提升获取 Docker 官方镜像的速度,建议注册阿里云帐号,使用阿里云提供的镜像加速服务,地址:https://cr.console.aliyun.com/cn-beijing/instances/mirrors

启动docker

# 设置为开机启动
$ systemctl enable docker  
$ systemctl daemon-reload
# 启动 docker
$ systemctl start docker

部署 EFK

编写docker-compose启动文件

  • 创建项目目录
$ mkdir -p /data/project/efk 
  • 编写docker-compose
version: '2'
services:
  es660:
    image: elasticsearch:6.6.0
    container_name: elasticsearch
    ulimits:
      memlock:
        soft: -1
        hard: -1
    ports:
      - 9200:9200
      - 9300:9300
    volumes:
      - /data/dockerdata/es660/etc/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml
      - /data/dockerdata/es660/plugins/x-pack-core:/usr/share/elasticsearch/modules/x-pack-core
      - /data/dockerdata/es660/data/:/usr/share/elasticsearch/data
      - /data/dockerdata/es660/backup:/data/backup
      - /data/dockerdata/es660/logs:/usr/share/elasticsearch/logs
    hostname: es
    restart: always
    network_mode: "bridge"
    environment:
      - TZ=Asia/Shanghai    # 更改容器时区为 CST(默认为UTC)

  kibana660:
    image: kibana:6.6.0
    container_name: kibana
    ports:
      - 5601:5601
    volumes:
      - /data/dockerdata/kibana660/etc/kibana.yml:/usr/share/kibana/config/kibana.yml
      - /data/dockerdata/kibana660/plugins:/usr/share/kibana/plugins
      - /data/dockerdata/kibana660/logs:/usr/share/kibana/logs
    hostname: kibana
    restart: always
    network_mode: "bridge"
    environment:
      - TZ=Asia/Shanghai    # 更改容器时区为 CST(默认为UTC)

  filebeat660:
    image: elastic/filebeat:6.6.0
    container_name: filebeat
    ports: 
      - 5044:5044
    volumes:
      - /data/dockerdata/filebeat660/etc/filebeat.yml:/usr/share/filebeat/filebeat.yml
      - /data/dockerdata/filebeat660/data:/usr/share/filebeat/data
      - /data/dockerdata/filebeat660/logs:/usr/share/filebeat/logs  
      - /data/dockerdata/filebeat660/tmp:/usr/share/filebeat/tmp
      - /data/logs/nginx:/data/logs/nginx   # 把nginx日志目录挂载到容器内部
    hostname: filebeat
    restart: always
    network_mode: "bridge"
    environment:
      - TZ=Asia/Shanghai    # 更改容器时区为 CST(默认为UTC)

创建EFK相关目录

  • 创建 ES 所需目录
mkdir -p /data/dockerdata/es660/{etc,plugins,data,logs,backup}
  • 创建 Kibana 所需目录
mkdir -p /data/dockerdata/kibana660/{etc,plugins,logs}
  • 创建 Filebeat 所需目录
mkdir -p /data/dockerdata/filebeat660/{etc,data,logs,tmp}

注意:

由于目录时挂载进去的,容器内部需要一些读写权限,要进行一些权限配置,否则容器不能正常启动。

# elasticsearch 目录
chmod 777 /data/dockerdata/es660/{data,logs,backup}
chmod 644 -R /data/dockerdata/es660/{etc,plugins}/*

# kibana 目录
chmod 777 /data/dockerdata/kibana660/{plugins,logs}
chmod 644 -R /data/dockerdata/es660/etc/*

# filebeat 目录
chmod 777 /data/dockerdata/filebeat660/{data,logs,tmp}
chmod 644 -R /data/dockerdata/filebeat660/etc/*

配置EFK所需配置文件

  • Elasticsearch所需文件

配置文件elasticsearch.yml

$ cat>>/data/dockerdata/es660/etc/elasticsearch.yml<<EOF
cluster.name: es
node.name: es-01
bootstrap.memory_lock: true
network.host: 0.0.0.0
http.port: 9200
discovery.type: single-node     # 启动单节点类型
xpack.security.enabled: false    # 关闭x-pack认证
EOF

在本文,我针对ES开启了x-pack插件,所以需要替换原ES的x-pack-core目录文件

$ wget http://dld.wanhebin.com/package/elk/plugins/x-pack-6.6.0/x-pack-core.tar.gz
$ tar xf x-pack-core.tar.gz -C /data/dockerdata/es660/plugins/
  • Kibana所需文件

配置文件kibana.yml

cat>>/data/dockerdata/kibana660/etc/kibana.yml<<EOF
server.port: 5601
server.host: "0.0.0.0"
elasticsearch.hosts: ["http://es660:9200"] # 如果无法正常连接ES,请更换成宿主机docker0网卡的IP
kibana.index: ".kibana"
logging.dest: /usr/share/kibana/logs/kibana.log

# 连接ES认证配置
# elasticsearch.username: "kibana"    
# elasticsearch.password: "123456"

EOF
  • Filebeat所需文件

配置文件filebeat.yml

$ cat>>/data/dockerdata/filebeat660/etc/filebeat.yml<<EOF
filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /data/logs/nginx/nginx_access_json-1.log  # json格式的nginx日志文件路径
  json.keys_under_root: true
  json.overwrite_keys: true
  json.message_key: log
  tags: ["nginx-log1"]

- type: log
  enabled: true
  paths:
    - /data/logs/nginx/nginx_access_json-2.log  # json格式的nginx日志文件路径
  json.keys_under_root: true
  json.overwrite_keys: true
  json.message_key: log
  tags: ["nginx-log2"]

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

setup.ilm.enabled: false
setup.template:
  name: "nginx"
  pattern: "nginx-*"
setup.template.overwrite: true
setup.template.enabled: false

output.elasticsearch:
  hosts: ["es660:9200"]       # 如果无法正常连接ES,请更换成宿主机docker0网卡的IP
  indices:
    - index: "nginx-access-%{+yyyy.MM.dd}"
      when.contains:
        tags: "nginx-log1"
    - index: "nginx-error-%{+yyyy.MM.dd}"
      when.contains:
        tags: "nginx-log2"
  # ES连接认证
  # username: 'elastic'  
  # password: 'changeme'

setup.template.overwrite: false
setup.template.json.enabled: true
setup.template.enabled: false
setup.ilm.enabled: false
EOF

破解 Elasticsearch 的x-pack插件

在上面已经把x-pacK-core插件目录替换成了破解包,接下来只需要进行激活步鄹。

详细步鄹参考 Elasticsearch 6.6.0 x-pack 破解 进行x-pack激活。

  • 启动es容器
$ cd /data/project/efk
$ docker-compose start es660
  • 导入liences
$ wget http://dld.wanhebin.com/package/elk/plugins/x-pack-6.6.0/license.json
$ curl -XPUT -H "Content-Type: application/json" 'http://127.0.0.1:9200/_xpack/license' -d @license.json
  • 查看 license 授权

efk-04

EFK 开启 X-PACK 认证

ES开启x-pack认证

  • 修改配置文件/data/dockerdata/es660/etc/elasticsearch.yml
$ sed -ir 's@xpack.security.enabled: false@xpack.security.enabled: true@g' /data/dockerdata/es660/etc/elasticsearch.yml
  • 重启es容器
$ cd /data/project/efk
$ docker-compose restart es660
  • 进入容器,设置ES密码
# 进入es容器内部
$ docker exec -it elasticsearch bash

# 在容器内,进入es目录,生成密码
$ cd /usr/share/elasticsearch
$ ./bin/elasticsearch-setup-passwords auto  

Kibana 开启认证

开启用户认证,让kibana可以正常访问es。

  • 修改kibana.yml配置文件

在之前写kibana配置文件时,就已经把认证配置加上了,现在取消注释。

$ sed -ir 's@# elasticsearch.username: "kibana"@elasticsearch.username: "kibana"@g' /data/dockerdata/kibana660/etc/kibana.yml

$ sed -ir 's@# elasticsearch.password: "123456"@elasticsearch.password: "123456"@g' /data/dockerdata/kibana660/etc/kibana.yml

注意:这里的用户密码,填写刚才es里生成的密码

  • 启动kibana容器
$ cd /data/project/efk
$ docker-compose restart kibana660

Filebeat 开启认证

开启用户认证,让filebeat可以正常访问es,使其可以向es传输数据。

  • 修改kibana.yml配置文件
$ sed -ir 's@# username: 'elastic'@username: 'elastic'@g' /data/dockerdata/filebeat660/etc/filebeat.yml

$ sed -ir 's@# password: 'changeme'@password: 'changeme'@g' /data/dockerdata/filebeat660/etc/filebeat.yml

注意:这里的用户密码,填写刚才es里生成的密码

  • 启动filebeat容器
$ cd /data/project/efk
$ docker-compose restart filebeat660

查看EFK容器状态

所有容器的 STATUS 都为 UP 说明容器正常启动运行。

efk-01.png

如果有容器不处于 UP 状态,请检查相关容器日志

$ docker logs -f 容器名

登录 Kibana 界面

使用elastic账户进行登录,地址:http://IP:5601

efk-02.png
efk-02.png

点赞

发表评论

电子邮件地址不会被公开。必填项已用 * 标注