1. 简介

Kubernetes 是一个分布式容器编排框架。我们可以通过定义 Pod、存储等资源,将其部署到节点集群中,Kubernetes 会自动决定将哪些工作负载运行在哪些节点上,并为其分配存储资源。然而,有时候我们很难直观地了解某个节点上的存储使用情况,尤其是存储的分布情况

本文将介绍如何查看 Kubernetes 集群中某个节点的存储使用情况。我们将依次探讨:

  • Kubernetes 存储的构成
  • 节点整体存储使用分析
  • 容器镜像的大小
  • 容器运行时的存储需求
  • Pod 的存储使用情况

我们使用的是 Debian 12 系统,Bash 5.2.15 环境。除非特别说明,本文命令适用于大多数 POSIX 兼容系统。

2. Kubernetes 存储概览

Kubernetes 的存储使用主要包括以下几个方面:

  • 平台安装文件
  • 配置文件
  • 容器镜像
  • 持久卷(Persistent Volume, PV)和持久卷声明(Persistent Volume Claim, PVC)

虽然 Kubernetes 中的存储主要通过 PV 或 PVC 分配,但整个系统中其他组件也可能占用大量空间。

我们可以通过 kubectl 查看当前集群状态:

$ kubectl get all --all-namespaces

输出示例:

NAMESPACE              NAME                                             READY   STATUS    RESTARTS   AGE
default                pod/pod0                                         1/1     Running   1          1h
kube-system            pod/coredns-5dd5756b68-69h86                     1/1     Running   0          24h
kube-system            pod/etcd-xost                                    1/1     Running   1          24h
kube-system            pod/kube-apiserver-xost                          1/1     Running   0          24h
...

从输出可以看出,除了 dashboard 和 pod0,这个集群部署相对空闲。

此外,容器运行时(如 Docker)可能使用 OverlayFS 等机制来管理存储:

$ df -h

示例输出:

overlay          49G   25G   22G  54% /var/lib/docker/overlay2/...

由于这些抽象机制的存在,我们很难直观地了解节点上实际的存储使用情况

因此,我们需要一步步深入分析 Kubernetes 各个组件的存储使用情况。

3. 节点整体存储使用分析

首先,我们可以使用 ncdu 工具来扫描整个文件系统的使用情况:

$ apt install ncdu
$ ncdu /

ncdu 会扫描整个文件系统并以可交互方式显示结果,按大小排序:

ncdu 1.18 ~ Use the arrow keys to navigate, press ? for help
--- / ---------------------------------------------------------------
.  66.6 GiB [#############################] /var
    6.0 GiB [######                       ] /usr
    1.6 GiB [#                            ] /root
    1.0 GiB [                             ] /home
  385.1 MiB [                             ] /opt
...

我们可以进入 /var/lib/docker/ 目录查看 Docker 的存储使用情况:

$ ncdu /var/lib/docker

输出示例:

    6.6 GiB [#############################] /overlay2
  666.0 MiB [###                          ] /volumes
    7.0 MiB [                             ] /image
    3.3 MiB [                             ] /containers
...

可以看到,overlay2volumes 是主要的存储占用目录。

⚠️ 注意:虽然这些目录占用较大,但我们无法直接判断是哪些容器或镜像导致的。

4. 容器镜像大小分析

Kubernetes 使用容器镜像来启动 Pod。镜像本身是容器存储开销的重要组成部分

我们可以通过 Docker 查看所有镜像的大小:

$ docker image list --all

输出示例:

REPOSITORY                                TAG        IMAGE ID       CREATED         SIZE
minapi-minapi                             latest     9b8f05946672   6 days ago      88.2MB
debian                                    latest     c9786667d5fe   3 weeks ago     117MB
python                                    latest     ae66048b7429   8 weeks ago     1.02GB
...

Kubernetes 相关的镜像通常包含 k8skubernetes 字样:

registry.k8s.io/kube-apiserver            v1.28.3    537434729123   5 months ago    126MB
registry.k8s.io/kube-controller-manager   v1.28.3    10baa1ca1706   5 months ago    122MB
registry.k8s.io/kube-scheduler            v1.28.3    6d1b4fd1b182   5 months ago    60.1MB
registry.k8s.io/kube-proxy                v1.28.3    bfc896cf80fb   5 months ago    73.1MB
...

这样我们可以区分哪些镜像是 Kubernetes 使用的。

5. 容器运行时存储映射分析

为了进一步定位存储占用,我们可以将容器与文件系统路径对应起来。

使用以下命令可以列出所有容器及其挂载路径:

$ docker inspect --format=$'{{.Name}}\n >>> {{.GraphDriver.Data.MergedDir}}\n' $(docker ps --all --quiet)

示例输出:

/k8s_POD_kube-apiserver-xost_kube-system_b11cd851d3b912861b5862cb512d0521_0
 >>> /var/lib/docker/overlay2/a4fdbc126518168bad7f2977f16eb666f7f33f47b67d9d75d2f74b96c3474eb9/merged
/k8s_kubernetes-dashboard_kubernetes-dashboard-8694d4445c-hnt9w_kubernetes-dashboard_cb1dc601-ecfe-42d3-b590-ca79877ae036_0
 >>> /var/lib/docker/overlay2/733c46aa655aee3b736cafe66629e32e0d9f4156671608243117b95a32c716a9/merged

这样我们可以定位到具体哪个容器占用了哪些目录,尤其是以 k8s_ 开头的容器。

6. Kubernetes Pod 存储使用分析

我们还可以查看 Pod 的存储挂载情况:

$ kubectl get pods --all-namespaces --output=jsonpath='
  {range .items[*]}{@.metadata.name}
  {" >>> volumes: "}{@.spec.volumes}
  {" >>> volumeMounts: "}{@..volumeMounts}
  {"\n"}{end}'

该命令会列出所有 Pod 的名称、挂载的卷和卷挂载点。

如果你需要进一步查看某个 PV 或 PVC 的详细信息:

$ kubectl describe pv <pv-name>
$ kubectl describe pvc <pvc-name>

或者获取 JSON 格式输出用于脚本处理:

$ kubectl get pv <pv-name> -o json
$ kubectl get pvc <pvc-name> -o json

通过这些信息,我们可以了解卷的类型、访问模式、容量限制等关键信息。

7. 总结

Kubernetes 的节点存储使用情况复杂且多样。本文介绍了以下几种分析方式:

✅ 通过 ncdu 查看节点整体磁盘使用
✅ 使用 docker image list 查看镜像大小
✅ 利用 docker inspect 定位容器对应的文件系统路径
✅ 使用 kubectl 查看 Pod 的卷挂载信息
✅ 通过 kubectl describeget 获取 PV/PVC 详细信息

掌握这些方法有助于我们更好地分析和优化 Kubernetes 节点的存储资源使用。


原始标题:Kubernetes Node Storage Allocation