在 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部署postgreSQL数据库
docker-compose up与docker-compose up -d