Docker 中的 Grafana Agent 运行了一个多星期,然后突然停止工作。当我们检查时,数据文件夹不见了

Docker 中的 Grafana Agent 运行了一个多星期,然后突然停止工作。当我们检查时,数据文件夹不见了

我们已经使用官方 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>.

您可能还需要为正在运行的代理容器设置资源限制

相关内容