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
...
可以看到,overlay2
和 volumes
是主要的存储占用目录。
⚠️ 注意:虽然这些目录占用较大,但我们无法直接判断是哪些容器或镜像导致的。
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 相关的镜像通常包含 k8s
或 kubernetes
字样:
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 describe
或 get
获取 PV/PVC 详细信息
掌握这些方法有助于我们更好地分析和优化 Kubernetes 节点的存储资源使用。