docker-compose部署下Logstash报Elasticsearch 401错误重启后消失原因问询
Logstash连接Elasticsearch返回401(重启后恢复)触发原因分析
报错信息
[2021-08-18T04:49:18,326][ERROR][logstash.outputs.elasticsearch][main][2b6d754adc23b7c8ea56f9a46472ea071a1e60f0a221ed2f896a7d3e34026d00] Elasticsearch setup did not complete normally, please review previously logged errors {:message=>"Got response code '401' contacting Elasticsearch at URL 'https://es1:9200/_ilm/policy/logstash-policy'", :exception=>LogStash::Outputs::ElasticSearch::HttpClient::Pool::BadResponseCodeError}
核心触发原因
容器启动时序不匹配(最高概率)
docker-compose的depends_on配置仅保证容器的启动先后顺序,不会等待Elasticsearch内部服务完全就绪就会启动Logstash。ES端口可以响应TCP请求时,内部的身份认证模块、内置用户/角色权限可能还未加载完成,此时Logstash携带配置的账号密码发起ILM策略查询请求时,就会被ES返回401未授权。
Logstash默认的ES连接重试次数、超时时间较短,如果初始化阶段重试耗尽就会终止初始化流程,不再主动发起认证请求。手动重启Logstash时ES已经完全就绪,认证流程即可正常通过。ES凭证更新后未同步加载
如果环境配置了ES账号密码自动轮换机制,密码更新后Logstash不会主动热重载认证配置,继续用旧凭证发起请求就会返回401。重启Logstash后会重新读取配置文件中的最新凭证,请求即可恢复正常。网络波动导致认证缓存失效
容器网络出现短暂闪断时,Logstash与ES的长连接断开,重连时恰好遇到ES侧的认证会话缓存过期,且Logstash未配置自动重新获取认证令牌的逻辑,就会出现401错误。重启后会重新走完整的认证流程,更新缓存后即可恢复正常。
排查验证方法
- 给Logstash配置启动延迟,修改docker-compose中Logstash的启动命令为
sh -c "sleep 30 && logstash",验证启动阶段是否还会出现401错误 - 开启Logstash debug日志,确认启动时请求ES的凭证与ES侧配置一致,排除配置加载延迟问题
- 查看ES对应时间点的认证失败日志,确认401返回的具体原因是用户不存在、密码错误还是权限未加载
内容的提问来源于stack exchange,提问作者brita
相关产品推荐
相关产品推荐

