ELK通过Filebeat采集docker容器日志,logstash提示“Error: Cannot assign requested address”,求教解决方案,谢谢

问题描述:同一台服务器使用Docker部署ElasticSearch、Logstash、Kibana、Filebeat容器【其版本均为V6.6.2】,搭建ELK平台采集各容器日志。Logstash提示“Error: Cannot assign requested address”,不能正常采集日志至elasticsearch,求教解决方案,谢谢。

错误日志【Logstash日志】:

Logstash配置文件:

FileBeat配置文件:

在 Logstash 启动之前,可以先查看下端口 5043 有没有被其他进程占用

老师您好,端口没有被占用,Logstash停掉后没有端口显示了,辛苦帮忙再看看

Error: Cannot assign requested address
Exception: Java::JavaNet::BindException

确保 Logstash 配置的端口与 Elasticsearch 服务的端口没有冲突。在 Docker 容器中,用 docker ps 来查看容器的端口映射


老师,没明白意思,您看一下

启动命令依次为:
docker run -d
–user root
-p 9200:9200
-p 9300:9300
–log-driver json-file
–log-opt max-size=10m
–log-opt max-file=3
–name elasticsearch
–restart=always
-e “discovery.type=single-node”
-v /home/data/elasticsearch:/usr/share/elasticsearch/data
docker.elastic.co/elasticsearch/elasticsearch:6.6.2

docker run -p 5043:5043 -d
–user root
–log-driver json-file
–log-opt max-size=10m
–log-opt max-file=3
–name logstash
–link elasticsearch
–restart=always
-v /home/data/conf/logstash.conf:/usr/share/logstash/pipeline/logstash.conf
docker.elastic.co/logstash/logstash:6.6.2

docker run -p 5601:5601 -d
–user root
–log-driver json-file
–log-opt max-size=10m
–log-opt max-file=3
–name kibana
–link elasticsearch
–restart=always
-e ELASTICSEARCH_URL=http://10.7.13.200:9200
-v /home/data/elastalert-kibana-plugin:/usr/share/kibana/plugins/elastalert-kibana-plugin
docker.elastic.co/kibana/kibana:6.6.2

docker run -d
–name filebeat
–user root
–log-driver json-file
–log-opt max-size=10m
–log-opt max-file=3
–restart=always
-v /home/data/conf/filebeat.yml:/usr/share/filebeat/filebeat.yml:ro
-v /home/docker/containers/:/var/lib/docker/containers/
-v /var/run/docker.sock:/var/run/docker.sock:ro
docker.elastic.co/beats/filebeat:6.6.2

IP地址是有效的吗,确定下
netstat -a|grep TIME_WAIT 运行这个看看

IP有效

执行命令修改如下2个内核参数 (需要root权限)
sysctl -w net.ipv4.tcp_timestamps=1 开启对于TCP时间戳的支持,若该项设置为0,则下面一项设置不起作用
sysctl -w net.ipv4.tcp_tw_recycle=1 表示开启TCP连接中TIME-WAIT sockets的快速回收
试试这个,要是不行,明天我问问其他老师

老师,参数设置了,这个不生效,辛苦帮看看,谢谢


net.ipv4.tcp_fin_timeout=15

net.ipv4.ip_local_port_range=1024 65535

设置下这两个参数试试,改下默认的时间和端口范围

老师,设置参数了,不生效,辛苦帮忙再看看,谢谢

啥错误

老师,还是这种不能分配请求地址

是不是命令没生效呢,重新配置下,再执行这个看看 sysctl -p

这个错误的问题应该就是连接数过多,达到连接数的上限了

老师,配置文件已经设置参数并执行了sysctl -p。并且删除了Logstash容器重新部署,还是有这问题,参数应该是没有对应生效

docker inspect xxx 看看各自容器的ip配置对了没

或者 使用docker network 创建一个网卡 让这些容器使用一个网卡

老师,容器IP是公司服务器内网IP,设置没问题。我试一下您说的创建一个网络,各容器使用这个网络

老师好,创建了一个自定义网络elk,将四个容器通过设置该网络进行重新部署,结果还是提示该问题,辛苦老师帮忙再看看,谢谢。

docker network create elk

docker run -d
–user root
-p 9200:9200
-p 9300:9300
–network=elk
–log-driver json-file
–log-opt max-size=10m
–log-opt max-file=3
–name elasticsearch
–restart=always
-e “discovery.type=single-node”
-v /home/data/elasticsearch:/usr/share/elasticsearch/data
docker.elastic.co/elasticsearch/elasticsearch:6.6.2

docker run -p 5043:5043 -d
–user root
–network=elk
–log-driver json-file
–log-opt max-size=10m
–log-opt max-file=3
–name logstash
–link elasticsearch
–restart=always
-v /home/data/conf/logstash.conf:/usr/share/logstash/pipeline/logstash.conf
docker.elastic.co/logstash/logstash:6.6.2

docker run -p 5601:5601 -d
–user root
–network=elk
–log-driver json-file
–log-opt max-size=10m
–log-opt max-file=3
–name kibana
–link elasticsearch
–restart=always
-e ELASTICSEARCH_URL=http://10.7.14.205:9200
-v /home/data/elastalert-kibana-plugin:/usr/share/kibana/plugins/elastalert-kibana-plugin
docker.elastic.co/kibana/kibana:6.6.2

docker run -d
–name filebeat
–user root
–network=elk
–log-driver json-file
–log-opt max-size=10m
–log-opt max-file=3
–restart=always
-v /home/data/conf/filebeat.yml:/usr/share/filebeat/filebeat.yml:ro
-v /home/docker/containers/:/var/lib/docker/containers/
-v /var/run/docker.sock:/var/run/docker.sock:ro
docker.elastic.co/beats/filebeat:6.6.2

因为用了network 他俩之间的通信可以直接用容器名替代 不用写ip了,这个可能会变

试下把 logstash配置里的 host 改下


image