GitLab CI中Elasticsearch 8.0.0连接被拒问题求助
Elasticsearch 8.x在GitLab CI及本地连接被拒的解决思路
问题根源
Elasticsearch 8.x版本默认强制开启了HTTPS访问和内置用户身份验证,这是与7.x版本最核心的差异——你的配置仍在使用HTTP协议连接,且未提供身份验证信息,因此出现连接被拒和Protocol Connection Error。
方案一:测试环境临时禁用安全特性(快速解决集成测试)
如果只是为了跑通集成测试,可临时关闭Elasticsearch的安全验证,恢复7.x的无安全配置模式。修改GitLab CI中Elasticsearch服务的启动命令,添加禁用安全特性的参数:
lint_and_test: stage: test services: - postgis/postgis:14-3.4 - name: elasticsearch:8.0.0 command: - /bin/bash - -c - echo -Xms256m >> /usr/share/elasticsearch/config/jvm.options && echo -Xmx256m >> /usr/share/elasticsearch/config/jvm.options && /usr/local/bin/docker-entrypoint.sh elasticsearch -Ediscovery.type=single-node -E xpack.security.enabled=false -E xpack.security.http.ssl.enabled=false tags: - healthcloud-multi script: - timeout 60 bash wait_for_service_up.sh elasticsearch:9200 || false - curl "http://elasticsearch:9200/_cat/health"
关键修改说明:
- 添加
-E xpack.security.enabled=false:关闭所有安全特性(包括身份验证) - 添加
-E xpack.security.http.ssl.enabled=false:关闭HTTPS,恢复HTTP访问
方案二:正确配置SSL与身份验证(规范做法)
若需模拟生产环境的安全配置,需完成以下步骤:
1. 调整GitLab CI的Elasticsearch服务配置
启动时设置初始密码,并保留安全特性:
lint_and_test: stage: test services: - postgis/postgis:14-3.4 - name: elasticsearch:8.0.0 command: - /bin/bash - -c - echo -Xms256m >> /usr/share/elasticsearch/config/jvm.options && echo -Xmx256m >> /usr/share/elasticsearch/config/jvm.options && /usr/local/bin/docker-entrypoint.sh elasticsearch -Ediscovery.type=single-node environment: - ELASTIC_PASSWORD=your_test_password # 设置测试用初始密码 tags: - healthcloud-multi script: # 等待Elasticsearch启动(注意此时是HTTPS端口9200) - timeout 60 bash wait_for_service_up.sh elasticsearch:9200 https || false # 从容器中复制自动生成的CA证书到本地 - docker cp $(docker ps -qf "name=elasticsearch"):/usr/share/elasticsearch/config/certs/http_ca.crt ./http_ca.crt # 使用HTTPS+身份验证访问 - curl --cacert http_ca.crt -u elastic:your_test_password "https://elasticsearch:9200/_cat/health"
2. 测试代码适配配置
在你的集成测试代码中,需要:
- 使用
https://elasticsearch:9200作为连接地址 - 加载
http_ca.crt证书以信任Elasticsearch的SSL证书 - 配置用户名(默认
elastic)和密码(即你设置的your_test_password)
本地运行的解决办法
本地环境的问题与CI一致,可参考上述两种方案:
- 临时禁用安全特性:启动容器时添加参数
-e xpack.security.enabled=false -e xpack.security.http.ssl.enabled=false - 规范配置:启动容器时设置
ELASTIC_PASSWORD,复制容器内的http_ca.crt到本地项目,在测试代码中配置HTTPS连接和身份验证
内容的提问来源于stack exchange,提问作者Tengen Uzui
相关产品推荐
相关产品推荐

