Docker-Compose部署Logstash出现HostUnreachableError问题求助
运行docker-compose -f .\docker-compose.yml up -d启动Logstash后,日志抛出SSL证书信任错误:
Elasticsearch pool URLs updated {:changes=>{:removed=>[], :added=>[https://my-user-login:myPassword@myhost.ca:9200/]}}
2023-05-11 10:58:13 14:58:13.525 [LogStash::Runner] WARN logstash.licensechecker.licensereader - Attempted to resurrect connection to dead ES instance, but got an error. {:url=>"https://my-user-login:myPassword@myhost.ca:9200/", :error_type=>LogStash::Outputs::ElasticSearch::HttpClient::Pool::HostUnreachableError, :error=>"Elasticsearch Unreachable: [https://my-user-login:myPassword@myhost.ca:9200/][Manticore::ClientProtocolException] PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target"}
核心原因是Logstash的Java运行环境未信任目标Elasticsearch服务器的SSL证书,导致无法建立安全连接。
方法1:导入Elasticsearch证书到Logstash信任存储(生产环境推荐)
步骤1:获取Elasticsearch服务器证书
通过openssl从目标ES服务器导出证书:
# 替换为你的ES主机地址和端口 echo -n | openssl s_client -connect myhost.ca:9200 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > es_certificate.crt
步骤2:挂载证书到Logstash容器
在项目根目录下创建logstash/certs文件夹,将下载的es_certificate.crt放入其中。
步骤3:修改docker-compose.yml
在logstash服务的volumes节点新增证书挂载配置:
services: logstash: # ... 其他配置不变 volumes: # ... 原有挂载项 - ./logstash/certs:/usr/share/logstash/certs
步骤4:配置Logstash使用信任证书
- 修改
logstash.conf的output段,添加证书路径:
output { elasticsearch { hosts => "${ELASTICSEARCH_HOST}" user => "${ELASTICSEARCH_USERNAME}" password => "${ELASTICSEARCH_PASSWORD}" index => "sample_csv-%{+YYYY.MM.dd}" cacert => "/usr/share/logstash/certs/es_certificate.crt" } }
- 修改
logstash.yml,添加监控模块的证书配置:
xpack.monitoring.elasticsearch.ssl.certificate_authorities: ["/usr/share/logstash/certs/es_certificate.crt"]
步骤5:重启Logstash
docker-compose down && docker-compose up -d
方法2:临时禁用SSL证书验证(仅测试环境)
注意:此方法会跳过证书校验,存在安全风险,禁止用于生产环境
- 修改
logstash.conf的output段:
output { elasticsearch { hosts => "${ELASTICSEARCH_HOST}" user => "${ELASTICSEARCH_USERNAME}" password => "${ELASTICSEARCH_PASSWORD}" index => "sample_csv-%{+YYYY.MM.dd}" ssl_verification_mode => "none" } }
- 修改
logstash.yml的监控配置:
xpack.monitoring.elasticsearch.ssl.verification_mode: none
- 重启Logstash服务。
额外检查项
- 确认Logstash容器能访问到Elasticsearch主机:
# 替换为你的Logstash容器名称 docker exec -it <logstash-container-name> ping myhost.ca docker exec -it <logstash-container-name> curl -v https://myhost.ca:9200
- 验证
.env文件中ELASTICSEARCH_HOST为完整HTTPS地址(格式如https://myhost.ca:9200)。
内容的提问来源于stack exchange,提问作者fsssaiyan

