Docker Compose一键ELK部署的方法实现

2025-05-27 0 61

安装

  Filebeat 已经完全替代了 Logstash-Forwarder 成为新一代的日志采集器,因为它更加轻量、安全。基于 Filebeat + ELK部署方案架构图如下: 

Docker Compose一键ELK部署的方法实现

  软件版本:

服务 版本 说明
CentOS 7.6
Docker 18.09.5
Docker Compose 1.25.0
ELK 7.5.1
Filebeat 7.5.1

docker-compose 文件

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106
version: "3"

services:

es-master:

container_name: es-master

hostname: es-master

image: elasticsearch:7.5.1

restart: always

ports:

- 9200:9200

- 9300:9300

volumes:

- ./elasticsearch/master/conf/es-master.yml:/usr/share/elasticsearch/config/elasticsearch.yml

- ./elasticsearch/master/data:/usr/share/elasticsearch/data

- ./elasticsearch/master/logs:/usr/share/elasticsearch/logs

environment:

- "ES_JAVA_OPTS=-Xms512m -Xmx512m"

es-slave1:

container_name: es-slave1

image: elasticsearch:7.5.1

restart: always

ports:

- 9201:9200

- 9301:9300

volumes:

- ./elasticsearch/slave1/conf/es-slave1.yml:/usr/share/elasticsearch/config/elasticsearch.yml

- ./elasticsearch/slave1/data:/usr/share/elasticsearch/data

- ./elasticsearch/slave1/logs:/usr/share/elasticsearch/logs

environment:

- "ES_JAVA_OPTS=-Xms512m -Xmx512m"

es-slave2:

container_name: es-slave2

image: elasticsearch:7.5.1

restart: always

ports:

- 9202:9200

- 9302:9300

volumes:

- ./elasticsearch/slave2/conf/es-slave2.yml:/usr/share/elasticsearch/config/elasticsearch.yml

- ./elasticsearch/slave2/data:/usr/share/elasticsearch/data

- ./elasticsearch/slave2/logs:/usr/share/elasticsearch/logs

environment:

- "ES_JAVA_OPTS=-Xms512m -Xmx512m"

kibana:

container_name: kibana

hostname: kibana

image: kibana:7.5.1

restart: always

ports:

- 5601:5601

volumes:

- ./kibana/conf/kibana.yml:/usr/share/kibana/config/kibana.yml

environment:

- elasticsearch.hosts=http://es-master:9200

depends_on:

- es-master

- es-slave1

- es-slave2

# filebeat:

# # 容器名称

# container_name: filebeat

# # 主机名称

# hostname: filebeat

# # 镜像

# image: docker.elastic.co/beats/filebeat:7.5.1

# # 重启机制

# restart: always

# # 持久化挂载

# volumes:

# - ./filebeat/conf/filebeat.yml:/usr/share/filebeat/filebeat.yml

# # 映射到容器中[作为数据源]

# - ./logs:/home/project/spring-boot-elasticsearch/logs

# - ./filebeat/logs:/usr/share/filebeat/logs

# - ./filebeat/data:/usr/share/filebeat/data

# # 将指定容器连接到当前连接,可以设置别名,避免ip方式导致的容器重启动态改变的无法连接情况

# links:

# - logstash

# # 依赖服务[可无]

# depends_on:

# - es-master

# - es-slave1

# - es-slave2

logstash:

container_name: logstash

hostname: logstash

image: logstash:7.5.1

command: logstash -f ./conf/logstash-filebeat.conf

restart: always

volumes:

# 映射到容器中

- ./logstash/conf/logstash-filebeat.conf:/usr/share/logstash/conf/logstash-filebeat.conf

- ./logstash/ssl:/usr/share/logstash/ssl

environment:

- elasticsearch.hosts=http://es-master:9200

# 解决logstash监控连接报错

- xpack.monitoring.elasticsearch.hosts=http://es-master:9200

ports:

- 5044:5044

depends_on:

- es-master

- es-slave1

- es-slave2

  这里把 Filebeat 给注释掉了,打算在各个需要搜集日志的服务器上面单独部署 Filebeat

记得把 Elasticsearch 的 data 和 logs 设置 chmod 777

es-master.yml

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28
# 集群名称

cluster.name: es-cluster

# 节点名称

node.name: es-master

# 是否可以成为master节点

node.master: true

# 是否允许该节点存储数据,默认开启

node.data: false

# 网络绑定

network.host: 0.0.0.0

# 设置对外服务的http端口

http.port: 9200

# 设置节点间交互的tcp端口

transport.port: 9300

# 集群发现

discovery.seed_hosts:

- es-master

- es-slave1

- es-slave2

# 手动指定可以成为 mater 的所有节点的 name 或者 ip,这些配置将会在第一次选举中进行计算

cluster.initial_master_nodes:

- es-master

# 支持跨域访问

http.cors.enabled: true

http.cors.allow-origin: "*"

# 安全认证

xpack.security.enabled: false

#http.cors.allow-headers: "Authorization"

es-slave1.yml

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28
# 集群名称

cluster.name: es-cluster

# 节点名称

node.name: es-slave1

# 是否可以成为master节点

node.master: true

# 是否允许该节点存储数据,默认开启

node.data: true

# 网络绑定

network.host: 0.0.0.0

# 设置对外服务的http端口

http.port: 9201

# 设置节点间交互的tcp端口

#transport.port: 9301

# 集群发现

discovery.seed_hosts:

- es-master

- es-slave1

- es-slave2

# 手动指定可以成为 mater 的所有节点的 name 或者 ip,这些配置将会在第一次选举中进行计算

cluster.initial_master_nodes:

- es-master

# 支持跨域访问

http.cors.enabled: true

http.cors.allow-origin: "*"

# 安全认证

xpack.security.enabled: false

#http.cors.allow-headers: "Authorization"

es-slave2.yml

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28
# 集群名称

cluster.name: es-cluster

# 节点名称

node.name: es-slave2

# 是否可以成为master节点

node.master: true

# 是否允许该节点存储数据,默认开启

node.data: true

# 网络绑定

network.host: 0.0.0.0

# 设置对外服务的http端口

http.port: 9202

# 设置节点间交互的tcp端口

#transport.port: 9302

# 集群发现

discovery.seed_hosts:

- es-master

- es-slave1

- es-slave2

# 手动指定可以成为 mater 的所有节点的 name 或者 ip,这些配置将会在第一次选举中进行计算

cluster.initial_master_nodes:

- es-master

# 支持跨域访问

http.cors.enabled: true

http.cors.allow-origin: "*"

# 安全认证

xpack.security.enabled: false

#http.cors.allow-headers: "Authorization"

logstash-filebeat.conf

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27
input {

# 来源beats

beats {

# 端口

port => "5044"

ssl_certificate_authorities => ["/usr/share/logstash/ssl/ca.crt"]

ssl_certificate => "/usr/share/logstash/ssl/server.crt"

ssl_key => "/usr/share/logstash/ssl/server.key"

ssl_verify_mode => "force_peer"

}

}

# 分析、过滤插件,可以多个

filter {

grok {

match => { "message" => "%{COMBINEDAPACHELOG}"}

}

geoip {

source => "clientip"

}

}

output {

# 选择elasticsearch

elasticsearch {

hosts => ["http://es-master:9200"]

index => "%{[fields][service]}-%{[@metadata][version]}-%{+YYYY.MM.dd}"

}

}

filebeat.yml

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52
filebeat.inputs:

- type: log

enabled: true

paths:

# 当前目录下的所有.log文件

- /root/tmp/logs/*.log

fields:

service: "our31-java"

multiline.pattern: ^\\[

multiline.negate: true

multiline.match: after

- type: log

enabled: true

paths:

# 当前目录下的所有.log文件

- /root/tmp/log/*.log

fields:

service: "our31-nginx"

filebeat.config.modules:

path: ${path.config}/modules.d/*.yml

reload.enabled: false

# setup.template.settings:

# index.number_of_shards: 1

# setup.dashboards.enabled: false

# setup.kibana:

# host: "http://localhost:5601"

# 不直接传输至ES

#output.elasticsearch:

# hosts: ["http://es-master:9200"]

# index: "filebeat-%{[beat.version]}-%{+yyyy.MM.dd}"

setup.ilm.enabled: false

output.logstash:

hosts: ["logstash.server.com:5044"]

# Optional SSL. By default is off.

# List of root certificates for HTTPS server verifications

ssl.certificate_authorities: "./ssl/ca.crt"

# Certificate for SSL client authentication

ssl.certificate: "./ssl/client.crt"

# Client Certificate Key

ssl.key: "./ssl/client.key"

# processors:

# - add_host_metadata: ~

# - add_cloud_metadata: ~

注意

生成证书,配置 SSL,让 Filebeat 与 Logstash 之间建立 SSL。

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17
#生成ca私钥

openssl genrsa 2048 > ca.key

#使用ca私钥建立ca证书

openssl req -new -x509 -nodes -key ca.key -subj /CN=elkCA\\ CA/OU=Development\\ group/O=HomeIT\\ SIA/DC=elk/DC=com > ca.crt

#生成服务器csr证书请求文件

openssl req -newkey rsa:2048 -nodes -keyout server.key -subj /CN=logstash.server.com/OU=Development\\ group/O=Home\\ SIA/DC=elk/DC=com > server.csr

#使用ca证书与私钥签发服务器证书

openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -set_serial 01 > server.crt

#生成客户端csr证书请求文件

openssl req -newkey rsa:2048 -nodes -keyout client.key -subj /CN=filebeat.client.com/OU=Development\\ group/O=Home\\ SIA/DC=elk/DC=com > client.csr

#使用ca证书与私钥签发客户端证书

openssl x509 -req -in client.csr -CA ca.crt -CAkey ca.key -set_serial 01 > client.crt

  证书记得放到对应的文件夹中。

Filebeat 中 output.logstash.hosts 配置的域名要与证书相符。

根据不同服务器、不同服务、不同日期动态生成索引

Docker Compose一键ELK部署的方法实现

  上面的这张图片中,加上了一些自定义属性,这些属性会传递到 Logstash 中,Logstash 会拿到这些属性动态的向 Elasticsearch 中创建索引,如下图:

Docker Compose一键ELK部署的方法实现

详细介绍看官方文档,metadata,动态索引生成。

  这里本来想使用 indices 来动态生成索引,但是根据官方配置,并没有成功,哪位兄弟知道可以告知下为什么。

利用 Nginx Http Basic Authorization 让 Kibana 需要登录

  先使用工具 htpasswd 生成用户信息

?

1
$ yum -y install httpd-tools

  创建新密码文件

Docker Compose一键ELK部署的方法实现

  追加用户信息:

Docker Compose一键ELK部署的方法实现

  最后配置好 Nginx 即可:

?

1

2

3

4

5

6

7

8
server {

......

auth_basic "Kibana Auth";

auth_basic_user_file /usr/local/nginx/pwd/kibana/passwd;

......

}

单独启动 Filebeat 的方式

?

1
$ nohup ./filebeat 2>&1 &

启动 Docker Compose

  在 docker-compose.yml 所在目录执行:

?

1
$ docker-compose up --build -d

到此这篇关于Docker Compose一键ELK部署的方法实现的文章就介绍到这了,更多相关Docker Compose ELK部署内容请搜索快网idc以前的文章或继续浏览下面的相关文章希望大家以后多多支持快网idc!

原文链接:https://blog.csdn.net/wo18237095579/article/details/103880397

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

快网idc优惠网 行业资讯 Docker Compose一键ELK部署的方法实现 https://www.kuaiidc.com/64541.html

相关文章

发表评论
暂无评论