Elasticsearch 6+Kibana+Docker Compose连接错误排查求助
先看你贴的Kibana报错日志:
kibana | {"type":"log","@timestamp":"2018-04-24T18:27:43Z","tags":["warning","elasticsearch","admin"],"pid":1,"message":"Unable to revive connection: http://localhost:9200/"}
kibana | {"type":"log","@timestamp":"2018-04-24T18:27:43Z","tags":["warning","elasticsearch","admin"],"pid":1,"message":"No living connections"}
我之前部署Elasticsearch铂金版+Kibana+Docker Compose时也踩过几乎一模一样的坑,给你整理几个核心排查和解决方向:
1. 修正容器间的网络访问地址
在Docker Compose的私有网络里,容器内的localhost指向容器自身,不是宿主机也不是Elasticsearch容器。这是最常见的错误——你配置的Kibana连接地址用了http://localhost:9200/,自然连不到ES容器。
正确的做法是用ES服务在docker-compose.yml里的服务名作为地址,比如你给ES起的服务名是elasticsearch,就把Kibana的连接地址改成http://elasticsearch:9200/。
举个Kibana的配置片段:
services: kibana: image: docker.elastic.co/kibana/kibana-oss:6.8.23 # 要对应ES6的版本 environment: - ELASTICSEARCH_URL=http://elasticsearch:9200 # 其他配置项... depends_on: - elasticsearch
2. 处理Elasticsearch铂金版的安全认证
铂金版默认开启了X-Pack安全功能,Kibana必须配置正确的认证信息才能建立连接:
- 先确认你已经给ES设置了合法的用户名密码(比如默认的
elastic管理员用户) - 在Kibana的环境变量里添加认证参数:
environment: - ELASTICSEARCH_URL=http://elasticsearch:9200 - ELASTICSEARCH_USERNAME=elastic - ELASTICSEARCH_PASSWORD=你的ES管理员密码
如果ES同时开启了SSL/TLS,还要配置Kibana的SSL验证(测试环境可以先关闭验证,生产环境要配置CA证书):
- ELASTICSEARCH_SSL_VERIFICATIONMODE=none
3. 让Kibana等ES就绪后再启动
ES铂金版启动时要初始化安全配置,耗时比开源版久很多。如果Kibana启动太快,ES还没完全就绪,就会出现连接失败的情况。
可以给ES服务添加健康检查,让Kibana等ES进入健康状态后再启动:
services: elasticsearch: image: docker.elastic.co/elasticsearch/elasticsearch-platinum:6.8.23 environment: - discovery.type=single-node - xpack.security.enabled=true # 其他ES配置... healthcheck: test: ["CMD-SHELL", "curl -s http://localhost:9200/_cluster/health | grep -q '\"status\":\"green\"'"] interval: 10s timeout: 10s retries: 10 # 其他配置... kibana: # 其他Kibana配置... depends_on: elasticsearch: condition: service_healthy
4. 测试容器间的网络连通性
如果上面的配置都改了还是不行,可以先进入Kibana容器,测试和ES服务的网络连通性:
docker exec -it 你的Kibana容器名 ping elasticsearch
如果ping不通,说明Docker网络配置有问题,检查是否用了自定义网络、是否有端口冲突等。
内容的提问来源于stack exchange,提问作者Guid




