【问题标题】:How can I get metrics in Kubernetes for the write layer disk usage of pod containers?如何在 Kubernetes 中获取 pod 容器写入层磁盘使用情况的指标?
【发布时间】:2021-03-19 21:25:36
【问题描述】:

我正在寻找一种方法来收集容器 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)

【问题讨论】:

  • 您希望在尺寸指标中准确反映什么?它应该只包括可写层还是图像层大小?容器缓存、卷和日志是否应该包含在大小中?
  • 容器日志大小已由 cAdvisor 收集。我只想要可写层

标签: kubernetes prometheus cadvisor


【解决方案1】:

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

fs_usage_bytes 反映特定容器在/var/lib/docker 中存储的数据量。它来自FsStats 对象的Usage 属性,它与不同的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"

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

这是作为container_fs_usage_bytes返回的内容:

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

代码中的参考可以找到here

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

}, {  
        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-01-11
    • 2019-04-19
    • 2022-06-13
    • 1970-01-01
    • 2019-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多