我们已经使用官方 Docker 映像部署了 Grafana Agent,以将我们的服务器和容器的指标发送到 Grafana Cloud:
docker run \
-v /etc/grafana-wal:/etc/agent/data \
-v /etc/grafana-agent.yaml:/etc/agent/agent.yaml \
grafana/agent:latest
这种方法在很多天里都很好用。我们可以看到/etc/grafana-wal文件夹包含信息,并且与容器内文件夹的内容相匹配/etc/代理/数据
问题出现在大约 7-12 天后,我们注意到指标数据不再显示在 Grafana Cloud 中。
当我们检查 docker 日志时,我们看到这个错误,这表明代理无法再访问 wal 目录。
error tailing WAL" err="segments: open /etc/agent/data/074c616f5ce774d7471a5621e3dd24b5/wal: no such file or directory
然后我们再次检查那些已安装的文件夹和主机文件夹/etc/grafana-wal仍然拥有所有数据。但是当我们在容器内导航时/etc/agent文件夹存在但为空。没有/数据文件夹里面。
在此期间我们没有触碰服务器,没有重新启动任何容器或者更新任何东西。
如果我们重新启动docker容器一切都会恢复正常。
我还注意到/etc/agent/agent.yaml配置文件也会在容器内消失。但是当我对容器运行检查时,它仍然显示它们已安装。
"Mounts": [
{
"Type": "bind",
"Source": "/tmp/agent",
"Destination": "/etc/agent",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
},
{
"Type": "bind",
"Source": "/etc/grafana-agent.yaml",
"Destination": "/etc/agent/agent.yaml",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
}
]
有什么想法可能导致“数据”文件夹在 Grafana 代理容器内消失?
答案1
您所面临的 Grafana Agent 容器无法访问其数据目录和配置文件的问题可能与 Docker 卷管理问题有关。
卷修剪:Docker 具有一项名为“卷修剪”的内置功能,可删除未使用的卷。即使您的容器正在引用已安装的卷,Docker 也可能会在一段时间不活动后将其视为未使用,并在修剪周期中将其删除。
卷传播:您对卷使用的 rprivate 传播模式将其限制为当前容器实例。这意味着如果容器重新启动,Docker 可能不会自动重新创建卷挂载。
Docker 存储驱动程序:卷的行为也可能受到正在使用的 Docker 存储驱动程序的影响。某些驱动程序可能会以不同的方式处理卷持久性。
解决此问题的方法如下:
禁用卷修剪:检查 Docker 卷修剪是否已启用。您可以使用带有 -f 标志的 docker volume prune -f 命令暂时禁用它以强制删除。这将阻止 Docker 删除可能使用的卷。但是,这不是永久解决方案,您应该进一步调查。
更改卷传播:尝试在 docker run 命令中修改卷挂载,以使用 rw 传播模式而不是 rprivate。这允许 Docker 在容器重新启动时重新创建卷挂载。
检查 Docker 存储驱动程序:调查 Docker 正在使用的存储驱动程序。某些驱动程序(如 aufs)可能对卷持久性有限制。您可以使用 docker info 检查存储驱动程序。请参阅特定驱动程序的文档以了解卷行为。
考虑持久卷:不要依赖绑定挂载,而是探索使用 Docker 卷和存储驱动程序来保证持久性,例如带有-v /path/on/host:/path/in/container:local
选项的本地卷或带有选项的命名卷
docker volume create <volume-name>.
您可能还需要为正在运行的代理容器设置资源限制