在 docker(-compose) 中实时重新加载 Prometheus 配置

Posted

技术标签:

【中文标题】在 docker(-compose) 中实时重新加载 Prometheus 配置【英文标题】:Live reload Prometheus configuration in docker(-compose) 【发布时间】:2019-10-28 08:23:24 【问题描述】:

我有一个在 docker-compose 中运行 Prometheus 的新服务器。 我希望能够重新加载配置文件(prometheus.yml),而不必停止和启动容器。

当然,因为我坚持将 promethues 存储在一个卷中,所以停止和启动并不是一个真正的问题,但它似乎有点过头了,特别是因为 prometheus 本身有一个非常方便的 api 来重新加载配置。

我看到其他人有类似的问题(例如here),但我无法让这些解决方案为我工作。也许我在那里忽略了一些东西。

docker-compose.yml

version: "3"

services:

  grafana:
    restart: always
    container_name: grafana
    image: grafana/grafana:6.2.1
    ports:
      - 3000:3000
    volumes:
      - grafanadata:/var/lib/grafana

  prometheus:
    restart: always
    container_name: prometheus
    image: prom/prometheus:v2.10.0
    privileged: true
    volumes:
      - ./configuration/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml
      - prometheusdata:/prometheus

    command:
      - '--config.file=/etc/prometheus/prometheus.yml'
      - '--web.enable-admin-api'
      - '--web.enable-lifecycle'
    ports:
      - 9090:9090

  node:
    restart: always
    container_name: node
    image: prom/node-exporter:v0.18.0
    ports:
      - 9100:9100

volumes:
  grafanadata:
  prometheusdata:

唉,我的结果..

当我运行 curl -X POST http://localhost:9090/-/reload 时,docker-compose 日志给出:

prometheus    | level=info ts=2019-06-17T15:33:02.690Z caller=main.go:730 msg="Loading configuration file" filename=/etc/prometheus/prometheus.yml
prometheus    | level=info ts=2019-06-17T15:33:02.691Z caller=main.go:758 msg="Completed loading of configuration file" filename=/etc/prometheus/prometheus.yml

所以普罗米修斯的结局很好。到目前为止一切都很好。

但是,当我编辑 ./configuration/prometheus/prometheus.yml 时,更改不会传播到容器。 此外,当我尝试在容器中编辑 /etc/promethus/prometheus.yml 时,我发现它是只读的(顺便说一句,容器没有“sudo”命令)。

是否有 docker 原生方式可以将这些配置文件热/实时重新加载到容器目录?

如前所述,down/start 选项目前有效,但我很好奇是否有更优雅的解决方案。

【问题讨论】:

【参考方案1】:

docker-compose kill -s SIGHUP prometheus 成功了,所以 Vishrant 肯定在那儿有所作为。

【讨论】:

【参考方案2】:

您的问题可能是,您的编辑器没有将更改的文件保存在同一个 inode 下。所以 dockerd 没有意识到文件发生了变化,因为它被写入了一个新的 inode。 解决方案可能是挂载完整目录或告诉您的编辑器不要使用临时文件:

即对于 Sublime,将 "atomic_save": false 设置为用户首选项可能会有所帮助(结果不清楚)或对于 vim,请参阅 https://github.com/moby/moby/issues/15793#issuecomment-571932545

这个问题对于这个话题总体来说非常有趣:https://github.com/moby/moby/issues/15793

【讨论】:

启发!感谢您在这个旧帖子上发帖。可能需要几个月的时间才能有机会重温这篇文章,但一旦有机会我会在这里更新。【参考方案3】:

我假设您已经更新了/etc/prometheus/prometheus.yml 文件并且您只是在询问重新加载配置。 (虽然配置可以是configmap的一部分,当configmap改变时你可以避免pod重启)。

运行以下命令以在不停止 prometheus 进程的情况下重新加载配置:

docker exec <prometheus_container_name> sudo killall -HUP prometheus

解释:sudo killall -HUP prometheus 命令向 prometheus 进程发送SIGHUP 信号以重新加载配置。

通过调用验证更改:

curl -X GET http://localhost:9090/api/v1/status/config

【讨论】:

【参考方案4】:

看起来像

      - ./configuration/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml

应该倒过来。

【讨论】:

以上是关于在 docker(-compose) 中实时重新加载 Prometheus 配置的主要内容,如果未能解决你的问题,请参考以下文章

每次运行 compose 时,如何重新部署 jar 并将其放入 docker 映像中?

docker-compose 在主机重启后启动容器。哪个?

使用docker compose部署postgreSQL数据库

docker-compose up与docker-compose up -d

原docker-compose 管理docker的多容器配置

docker-compose:“运行时”不支持的配置选项