1

我正在寻找一种方法来收集容器 FS 使用字节,这种方法实际上可用作度量标准。来自 cadvisor 的 container_fs_usage_bytes 显示了用于 /var/lib/docker 的分区上使用的磁盘空间,这绝对没用。

来自 docker ps --size 的值(在 docker system df -v 中也可见)会更有用有人知道其他出口商可以做到这一点吗?

作为参考,这里是 docker ps --size 的输出

$ docker ps -s
CONTAINER ID        IMAGE                                                                 COMMAND                  CREATED             STATUS                    PORTS                    NAMES               SIZE
5bcf6d4bff20        ubuntu:bionic                                                         "sleep 100000"           27 seconds ago      Up 25 seconds                                      ubuntu              34.6MB (virtual 97.8MB)
0df1749b5458        gcr.io/cadvisor/cadvisor:v0.36.0                                      "/usr/bin/cadvisor -…"   24 minutes ago      Up 24 minutes (healthy)   0.0.0.0:8080->8080/tcp   cadvisor            0B (virtual 184MB)
4

1 回答 1

0

我能想出的唯一解决方案是使用BaseUsage定义而不是fs.Usage. 不幸的是,这需要将这些东西编译到一个与您所需的 k8s 版本兼容的 kubelet 二进制文件中。

fs_usage_bytes/var/lib/docker反映特定容器中存储的数据量。它来自对象的Usage属性,FsStats并且兼容不同的CRI. 然而FsStats,还有另一个属性叫做BaseUsage,它只与 Docker 兼容,并且考虑到 Docker 内置支持未来的弃用,可能有充分的理由不使用它。根据代码中的描述,BaseUsage包含来自 Docker 的值,很可能与docker ps -s输出中显示的大小相同。

所以你想使用BaseUsage类型定义而不是fs.Usage

// Number of bytes that is consumed by the container on this filesystem. 
        Usage uint64 `json:"usage"` 

// Base Usage that is consumed by the container's writable layer. 
        // This field is only applicable for docker container's as of now. 
        BaseUsage uint64 `json:"base_usage"

代码中的参考可以在这里找到。

这是返回的内容container_fs_usage_bytes

getValues: func(s *info.ContainerStats) metricValues {
        return fsValues(s.Filesystem, func(fs *info.FsStats) float64 {
                return float64(fs.Usage)

代码中的参考可以在这里找到。

为避免通过交换返回值破坏任何现有进程,您可能需要像这样添加整个部分:

}, {  
        name: "container_fs_base_usage_bytes",  
        help: "Docker writable layer size",  
        valueType: prometheus.GaugeValue,  
        extraLabels: []string{"device"},  
        getValues: func(s *info.ContainerStats) metricValues {  
                return fsValues(s.Filesystem, func(fs *info.FsStats) float64 {
                  
                        return float64(fs.BaseUsage)  
                }, s.Timestamp)  
        },  
},
于 2020-12-10T09:34:33.310 回答