如何在 Kubernetes 中获取容器的磁盘使用情况(没有 docker 命令)?

Posted

技术标签:

【中文标题】如何在 Kubernetes 中获取容器的磁盘使用情况(没有 docker 命令)?【英文标题】:How to get container's disk usage in Kubernetes (without docker command)? 【发布时间】:2019-04-19 01:35:38 【问题描述】:

我有一个 Kubernetes 集群,想知道我的容器使用了多少磁盘空间。我不是在谈论已安装的卷。

我可以通过使用诸如docker system df -vdocker ps -s 之类的docker 命令来获取此信息,但我不想连接到每个工作节点。

有没有办法通过kubectl 获取容器的磁盘使用情况,或者是否有可以从中获取这些信息的 kubelet 指标?

【问题讨论】:

【参考方案1】:

是的,但目前不使用 kubectl,您可以通过 kube-apiserver(代理)或直接调用 kubelet HTTP(s) 服务器端点(默认端口 10250)从 kubelet 获取指标。磁盘指标通常在/stats/summary 端点上可用,您还可以在/metrics/cavisor 端点上找到一些cAdvisor 指标。

例如,要获取通过kube-apiserver 返回的第一个 pod 中的第一个容器的“usedBytes”:

$ curl -k -s -H 'Authorization: Bearer <REDACTED>' \
  https://kube-apiserver:6443/api/v1/nodes/<node-name>/proxy/stats/summary \
  | jq '.pods[0].containers[0].rootfs.usedBytes'

Bearer 令牌可以是绑定到 ClusterRole 的服务帐户令牌,如下所示:

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  annotations:
  name: myrole
rules:
- apiGroups:
  - ""
  resources:
  - nodes
  - nodes/proxy
  verbs:
  - get
  - list
  - watch
- nonResourceURLs:
  - /metrics
  - /api/*
  verbs:
  - get

【讨论】:

太好了,谢谢。我正在使用 kops 启动 k8s 测试集群,并且能够使用以下命令获取令牌:kops get secrets --type secret admin -oplaintext。我还找到了此信息的 cadvisor 指标container_fs_usage_bytes【参考方案2】:

添加到 Rico 的答案中,您可以使用 kubectl 设置 API 服务器的代理,以便您可以查询 API 并了解服务器地址和身份验证的详细信息。

为 API 服务器设置本地代理

kubectl proxy --port=8080

然后你可以使用类似的命令

curl http://localhost:8080/api/v1/nodes/<node-name>/proxy/stats/summary 2>/dev/null | jq '.pods[].containers[].rootfs.usedBytes'

这将为您提供每个容器的 rootfs 使用列表。

【讨论】:

以上是关于如何在 Kubernetes 中获取容器的磁盘使用情况(没有 docker 命令)?的主要内容,如果未能解决你的问题,请参考以下文章

云原生架构-kubernetes存储原理

Kubelet运行在容器下使用LocalPV磁盘地址不存在问题

Kubernetes——存储卷(empyDirhostPathnfs)

云原生时代的 Kubernetes 部署

kubernetes 使用 PV 和 PVC 管理数据存储

Kubernetes存储之volume