docker-compose部署ELK-7.17.7及配置X-Pack

小柒博客 22,1031字数 1914阅读6分22秒阅读模式

一、ELK简介

ELK是三个开源软件的缩写,分别表示:Elasticsearch , Logstash, Kibana , 它们都是开源软件。新增了一个FileBeat,它是一个轻量级的日志收集处理工具(Agent),Filebeat占用资源少,适合于在各个服务器上搜集日志后传输给Logstash,官方也推荐此工具。

1、Elasticsearch是个开源分布式搜索引擎,提供搜集、分析、存储数据三大功能。它的特点有:分布式,零配置,自动发现,索引自动分片,索引副本机制,restful风格接口,多数据源,自动搜索负载等。

2、Logstash主要是用来日志的搜集、分析、过滤日志的工具,支持大量的数据获取方式。一般工作方式为c/s架构,client端安装在需要收集日志的主机上,server端负责将收到的各节点日志进行过滤、修改等操作在一并发往elasticsearch上去。

3、Kibana也是一个开源和免费的工具,Kibana可以为Logstash和 ElasticSearch提供的日志分析友好的 Web 界面,可以帮助汇总、分析和搜索重要数据日志。

4、Filebeat隶属于Beats。目前Beats包含四种工具:

  • Packetbeat(搜集网络流量数据)
  • Topbeat(搜集系统、进程和文件系统级别的CPU和内存使用情况等数据)
  • Filebeat(搜集文件数据)
  • Winlogbeat(搜集Windows事件日志数据)

二、安装docker-compose

Linux上我们可以从Github上下载它的二进制包来使用,最新发行的版本地址:https://github.com/docker/compose/releases

1、运行以下命令以下载Docker Compose的v2.11.0版本

[root@k8s-master ~]# wget -O /usr/bin/docker-compose https://github.com/docker/compose/releases/download/v2.11.0/docker-compose-linux-x86_64

2、授权可执行权限

[root@k8s-master ~]# chmod +x /usr/bin/docker-compose

3、测试是否安装成功

[root@k8s-master ~]# docker-compose -v

Docker Compose version v2.11.0

三、部署Redis

1、创建Redis目录

[root@k8s-master ~]# mkdir -p /opt/redis

2、创建docker-compose配置文件

[root@k8s-master ~]# cd /opt/redis

[root@k8s-master redis]# vim docker-compose.yml

version: "3.3"
services:
  redis:
    image: "redis:6.2.7"
    container_name: redis
    restart: always
    privileged: true
    ports:
      - "6379:6379"
    volumes:
      - ./redis.conf:/etc/redis/redis.conf:rw
      - ./data:/data:rw
    command:
      # 执行的命令
      redis-server /etc/redis/redis.conf --appendonly yes

3、创建Redis配置文件

[root@k8s-master redis]# vim redis.conf

# 开启保护
protected-mode yes
# 开启远程连接 
bind 0.0.0.0 
# 自定义密码
requirepass Aa123456
port 6379
timeout 0
# 900s内至少一次写操作则执行bgsave进行RDB持久化
save 900 1 
save 300 10
save 60 10000
rdbcompression yes
dbfilename dump.rdb
dir /data
appendonly yes
appendfsync everysec

4、启动Redis

[root@k8s-master redis]# docker-compose up -d

5、查看Redis状态

[root@k8s-master redis]# docker-compose ps

NAME              COMMAND                  SERVICE          STATUS             PORTS

redis               "docker-entrypoint.s…"   redis               running             0.0.0.0:6379->6379/tcp

6、访问Redis

[root@k8s-master redis]# docker exec -it redis redis-cli

127.0.0.1:6379> keys *

(error) NOAUTH Authentication required.

127.0.0.1:6379> auth Aa123456

OK

127.0.0.1:6379> keys *

(empty array)

127.0.0.1:6379> set test 123

OK

127.0.0.1:6379> get test

"123"

四、部署ELK

1、创建Elastic Stack目录

[root@k8s-master ~]# mkdir -p elk

[root@k8s-master ~]# cd elk/

2、创建docker-compose.yml配置文件

[root@k8s-master elk]# vim docker-compose.yml

version: '3.3'
services:
  elasticsearch:
    image: elasticsearch:7.17.7  # 镜像
    container_name: elasticsearch  # 定义容器名称
    restart: always  # 开机启动,失败也会一直重启
    environment:
      - "cluster.name=elasticsearch-cluster" # 设置集群名称为elasticsearch
      - "discovery.type=single-node" # 以单一节点模式启动
      - "ES_JAVA_OPTS=-Xms2g -Xmx2g" # 设置使用jvm内存大小
      - "TZ=Asia/Shanghai"
    volumes:
      - /data/elasticsearch/plugins:/usr/share/elasticsearch/plugins # 插件文件挂载
      - /data/elasticsearch/data:/usr/share/elasticsearch/data # 数据文件挂载
      - /data/elasticsearch/logs:/usr/share/elasticsearch/logs # 数据文件挂载
      - /data/elasticsearch/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml # 配置文件挂载
    ports:
      - 9200:9200
  kibana:
    image: kibana:7.17.7
    container_name: kibana
    restart: always
    volumes:
      - /data/kibana/kibana.yml:/usr/share/kibana/config/kibana.yml
    depends_on:
      - elasticsearch # kibana在elasticsearch启动之后再启动
    environment:
      - "TZ=Asia/Shanghai"
    ports:
      - 5601:5601
  logstash:
    image: logstash:7.17.7
    container_name: logstash
    restart: always
    volumes:
      - /data/logstash:/usr/share/logstash/pipeline # 挂载logstash的配置文件
    environment:
      - "TZ=Asia/Shanghai"
    depends_on:
      - elasticsearch # logstash在elasticsearch启动之后再启动
    links:
      - elasticsearch:es # 可以用es这个域名访问elasticsearch服务
    ports:
      - 4560:4560
  filebeat:
    image: elastic/filebeat:7.17.7
    container_name: filebeat
    privileged: true
    restart: always
    volumes:
      - /data/filebeat/filebeat.yml:/usr/share/filebeat/filebeat.yml # 挂载filebeat的配置文件
      - /data/filebeat/logs:/usr/share/filebeat/logs # 挂载收集日志目录的路径
    environment:
      - "TZ=Asia/Shanghai"

3、创建数据目录及授权

[root@k8s-master elk]# mkdir -p /data/elasticsearch/{data,logs,plugins}

[root@k8s-master elk]# mkdir -p /data/{kibana,logstash,filebeat}

[root@k8s-master elk]# mkdir -p /data/filebeat/logs

[root@k8s-master elk]# chmod 777 /data/elasticsearch/{data,logs,plugins}

4、创建Elasticsearch配置文件

[root@k8s-master elk]# vim /data/elasticsearch/elasticsearch.yml

# 监听IP
network.host: 0.0.0.0
# 跨域
http.cors.enabled: true
http.cors.allow-origin: "*"

5、创建Logstash配置文件

[root@k8s-master elk]# vim /data/logstash/logstash.conf

input {
    redis {
        host => "10.10.50.24"
        port => "6379"
        db => "0"
        password => "Aa123456"
        data_type => "list"
        key => "message-access-log"
        codec => "json"
    }
}

filter {
        if [fields][logtype] == "system-messages-log" {
        json {
            source => "message"
        } 
                
        grok {
            match => { "message" => "%{TIMESTAMP_ISO8601:timestamp} %{LOGLEVEL:level}" }
        }
                
        date {
            match => ["timestamp", "yyyy-MM-dd HH:mm:ss,SSS"]
            target => "@timestamp"
        }
    }
}
output {
    if [fields][logtype] == "system-messages-log" {
        elasticsearch {
            hosts => ["10.10.50.24:9200"]
            action => "index"
            index => "system-messages-log-%{+YYYY.MM.dd}"
        }
    }
}

6、创建Kibana配置文件

[root@k8s-master elk]# vim /data/kibana/kibana.yml

server.port: 5601
server.host: "0.0.0.0"
elasticsearch.hosts: ["http://elasticsearch:9200"]
i18n.locale: "zh-CN"

7、创建Filebeat配置文件

[root@k8s-master elk]# vim /data/filebeat/filebeat.yml

filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /usr/share/filebeat/logs/*.log
  multiline:
      pattern: '\d{1,2}:\d{1,2}:\d{1,2}'
      negate: true
      match: after
  fields:
    logtype: system-messages-log
output.redis:
  enabled: true
  hosts: ["10.10.50.24:6379"]
  password: "Aa123456"
  key: "message-access-log"
  db: 0
  timeout: 10

8、这里以宿主机系统日志为例,具体根据自身要求配置

[root@k8s-master elk]# cp /var/log/messages /data/filebeat/logs

[root@k8s-master elk]# chmod 644 /data/filebeat/logs/messages

9、启动容器

[root@k8s-master elk]# docker-compose up -d

10、查看容器相关信息

[root@k8s-master elk]# docker-compose ps

NAME                COMMAND                  SERVICE             STATUS             PORTS

elasticsearch     "/bin/tini -- /usr/l…"   elasticsearch       running             0.0.0.0:9200->9200/tcp, 9300/tcp

filebeat             "/usr/bin/tini -- /u…"   filebeat               running             

kibana             "/bin/tini -- /usr/l…"     kibana               running             0.0.0.0:5601->5601/tcp

logstash          "/usr/local/bin/dock…"   logstash            running             5044/tcp, 0.0.0.0:4560->4560/tcp, 9600/tcp

11、访问Kibana

1)浏览器输入http://10.10.50.24:5601,如下图所示

2)查看索引,如下图所示

3)创建索引模式,效果如下图

# 输入名称及选择时间戳字段,如下图所示

4)创建完成之后,点击Discover,如下图所示

五、配置X-Pack认证

X-pack是什么?

X-Pack是Elastic Stack扩展功能,提供安全性,警报,监视,报告,机器学习和许多其他功能。ES7.0+之后,默认情况下,当安装Elasticsearch时,会安装X-Pack,无需单独再安装。

1、修改elasticsearch.yml配置文件

[root@k8s-master elk]# vim /data/elasticsearch/elasticsearch.yml

# 添加以下内容

# 配置X-Pack
http.cors.allow-headers: Authorization
xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true

2、重启Elasticsearch

[root@k8s-master elk]# docker-compose restart elasticsearch

3、设置Elasticsearch访问密码

# 生成密码有如下两种方式

auto - 随机生成密码。

interactive - 自定义不同用户的密码。

注意:必须配置好X-pack之后,才能设置密码。否则会报错。

# 这里采用自定义密码方式

[root@k8s-master elk]# docker exec -it elasticsearch bin/elasticsearch-setup-passwords interactive

注:这里为了方便演示,密码统一设置为Aa123456

注:配置了密码之后获取集群状态命令如下

[root@k8s-master elk]# curl --user elastic:Aa123456 -X GET 'http://10.10.50.24:9200/_cluster/health?pretty'

{

"cluster_name" : "elasticsearch-cluster",

"status" : "yellow",

"timed_out" : false,

"number_of_nodes" : 1,

"number_of_data_nodes" : 1,

"active_primary_shards" : 12,

"active_shards" : 12,

"relocating_shards" : 0,

"initializing_shards" : 0,

"unassigned_shards" : 1,

"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" : 92.3076923076923

}

4、修改Kibana.yml配置文件

[root@k8s-master elk]# vim /data/kibana/kibana.yml

server.port: 5601
server.host: "0.0.0.0"
elasticsearch.hosts: ["http://elasticsearch:9200"]
elasticsearch.username: "elastic"
elasticsearch.password: "Aa123456"
i18n.locale: "zh-CN"

5、修改logstash.conf配置文件

[root@k8s-master elk]# vim /data/logstash/logstash.conf

input {
    redis {
        host => "10.10.50.24"
        port => "6379"
        db => "0"
        password => "Aa123456"
        data_type => "list"
        key => "message-access-log"
        codec => "json"
    }
}

filter {
        if [fields][logtype] == "system-messages-log" {
        json {
            source => "message"
        } 
                
        grok {
            match => { "message" => "%{TIMESTAMP_ISO8601:timestamp} %{LOGLEVEL:level}" }
        }
                
        date {
            match => ["timestamp", "yyyy-MM-dd HH:mm:ss,SSS"]
            target => "@timestamp"
        }
    }
}
output {
    if [fields][logtype] == "system-messages-log" {
        elasticsearch {
            hosts => ["10.10.50.24:9200"]
            user => "elastic"
            password => "Aa123456"
            action => "index"
            index => "system-messages-log-%{+YYYY.MM.dd}"
        }
    }
}

6、重启Logstash和Kibana

[root@k8s-master elk]# docker-compose restart logstash kibana

7、写入测试数据验证日志是否正常采集

[root@k8s-master elk]# echo "Test File" >> /data/filebeat/logs/messages

8、再次查看Discover,如下图所示


至此,docker-compose部署ELK完成。

若文章图片、下载链接等信息出错,请在评论区留言反馈,博主将第一时间更新!如本文“对您有用”,欢迎随意打赏,谢谢!

继续阅读
Wechat
微信扫一扫,加我!
weinxin
微信号已复制
微信公众号
微信扫一扫,关注我!
weinxin
公众号已复制
Docker最后更新:2023-10-11
小柒博客
  • 本文由 小柒博客 发表于 2022年11月26日 14:10:21
  • 声明:本站所有文章,如无特殊说明或标注,本站文章均为原创。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。转载请务必保留本文链接:https://www.yangxingzhen.com/8542.html
评论  2  访客  2
    • myitsite`
      myitsite` 0

      这里的redis是干什么用的呢

    匿名

    发表评论

    匿名网友
    :?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

    拖动滑块以完成验证