GitLab CI Docker runner下实现Prometheus与作业容器双向通信
问题根因
你配置的localhost:9091指向的是Prometheus服务容器自身的本地回路,而GitLab CI中作业容器和所有Service容器都是独立的网络命名空间,共处在Runner创建的专属网桥网络下,所以Prometheus无法通过自身localhost访问到作业容器内启动的9091端口服务。
可行解决方案
方案1:修改Prometheus抓取目标(最简便)
GitLab Docker Runner会自动为作业容器在CI网络中注册域名build,所有Service容器都可以通过该域名访问到作业容器的端口,你只需修改Prometheus配置即可:
- 调整自定义镜像内的
prometheus.yml,将targets修改为build:9091,注意不需要加http前缀:
scrape_configs: - job_name: queue_monitoring scrape_interval: 5s scrape_timeout: 5s metrics_path: /metrics static_configs: - targets: [ 'build:9091' ]
- 重新构建
lossuperktos/stats-prometheus镜像后即可正常使用。
方案2:将指标服务独立为CI Service
如果9091端口对应的指标服务是独立的业务组件,而非maven测试启动的内嵌服务,可以将其也加入CI服务列表,通过别名互通:
- 修改
.gitlab-ci.yml的services配置,新增指标服务:
services: - name: lossuperktos/stats-prometheus alias: prometheus - name: 你的指标服务镜像地址 alias: metrics-exporter
- 将Prometheus配置的targets修改为
['metrics-exporter:9091']即可,所有服务和作业容器都可以通过别名互相访问。
方案3:动态修改Prometheus配置(无需重制镜像,适合临时测试)
如果不想重新构建Prometheus镜像,可以在CI作业脚本中动态修改Prometheus的配置并重载:
- 先修改自定义Prometheus镜像的启动参数,加上
--web.enable-lifecycle开启配置重载接口,Dockerfile示例:
FROM prom/prometheus ADD prometheus.yml /etc/prometheus/ EXPOSE 9090 CMD ["--web.enable-lifecycle"]
- 修改
.gitlab-ci.yml的script步骤,启动测试前先更新Prometheus配置:
script: - curl -X POST http://prometheus:9090/-/reload -H "Content-Type: application/json" -d '[{"op":"replace","path":"/scrape_configs/0/static_configs/0/targets","value":["build:9091"]}]' - mvn test
内容的提问来源于stack exchange,提问作者minizibi
相关产品推荐
相关产品推荐

