1. 概述
Kubernetes 是当前最主流的容器编排平台之一,它提供了丰富的命令来管理与调试 Pod —— 集群中最小的可部署单元。在 DevOps 实践中,我们经常需要查看 Pod 中文件的内容,用于故障排查或日常维护。然而,Kubernetes 并没有像 kubectl ls
这样的原生命令来列出 Pod 中的文件内容。
本文将介绍几种实用的方法,帮助你快速查看 Kubernetes Pod 中的文件结构与内容。
2. Pod 检查的核心思路
要检查一个 Pod 的文件系统,核心在于访问其内部运行的容器。一个 Pod 可以包含多个容器,每个容器都有独立的文件系统。因此,检查 Pod 的文件内容,实际上就是进入这些容器中执行文件查看操作。
3. 使用 kubectl exec
执行命令
kubectl exec
是最常用的命令之一,它可以让你在 Pod 的容器中执行任意命令。
首先,列出当前运行的 Pod:
$ kubectl get pods --all-namespaces
NAMESPACE NAME READY STATUS RESTARTS AGE
default sys-pod 1/1 Running 0 3m32s
kube-system coredns-7db6d8ff4d-g9gjw 1/1 Running 5 (27m ago) 15d
kube-system etcd-minikube 1/1 Running 5 (27m ago) 15d
kube-system kube-apiserver-minikube 1/1 Running 5 (27m ago) 15d
kube-system kube-controller-manager-minikube 1/1 Running 5 (27m ago) 15d
kube-system kube-proxy-w5v7w 1/1 Running 5 (27m ago) 15d
kube-system kube-scheduler-minikube 1/1 Running 5 (27m ago) 15d
kube-system storage-provisioner 1/1 Running 13 (27m ago) 15d
接着,查看 sys-pod
根目录下的内容:
$ kubectl exec sys-pod -- ls -la /
total 48
drwxr-xr-x 1 root root 4096 Jul 23 06:56 .
drwxr-xr-x 1 root root 4096 Jul 23 06:56 ..
-rwxr-xr-x 1 root root 0 Jul 23 06:56 .dockerenv
drwxr-xr-x 2 root root 12288 May 18 2023 bin
drwxr-xr-x 5 root root 360 Jul 23 06:56 dev
drwxr-xr-x 1 root root 4096 Jul 23 06:56 etc
drwxr-xr-x 2 nobody nobody 4096 May 18 2023 home
drwxr-xr-x 2 root root 4096 May 18 2023 lib
lrwxrwxrwx 1 root root 3 May 18 2023 lib64 -> lib
dr-xr-xr-x 262 root root 0 Jul 23 06:56 proc
drwx------ 2 root root 4096 May 18 2023 root
dr-xr-xr-x 13 root root 0 Jul 23 06:56 sys
drwxrwxrwt 2 root root 4096 May 18 2023 tmp
drwxr-xr-x 4 root root 4096 May 18 2023 usr
drwxr-xr-x 1 root root 4096 Jul 23 06:56 var
✅ 提示:如果想查看其他目录的内容,只需在 ls -la
后面加上具体路径即可。
例如,查看 /sys
目录:
$ kubectl exec sys-pod -- ls -la /sys
total 4
dr-xr-xr-x 13 root root 0 Jul 23 06:56 .
drwxr-xr-x 1 root root 4096 Jul 23 06:56 ..
drwxr-xr-x 2 root root 0 Jul 23 06:57 block
drwxr-xr-x 40 root root 0 Jul 23 06:57 bus
drwxr-xr-x 54 root root 0 Jul 23 06:57 class
drwxr-xr-x 4 root root 0 Jul 23 06:57 dev
drwxr-xr-x 15 root root 0 Jul 23 06:56 devices
drwxrwxrwt 2 root root 40 Jul 23 06:56 firmware
drwxr-xr-x 7 root root 0 Jul 23 06:56 fs
drwxr-xr-x 2 root root 0 Jul 23 06:57 hypervisor
drwxr-xr-x 17 root root 0 Jul 23 06:56 kernel
drwxr-xr-x 184 root root 0 Jul 23 06:57 module
drwxr-xr-x 3 root root 0 Jul 23 06:57 power
⚠️ 注意:kubectl exec
要求容器中安装了 sh
或 bash
,否则会报错。
4. 容器宿主机访问法(适用于无 shell 的容器)
当容器中没有 ls
或 sh
命令时(如一些精简镜像),上述方法就失效了。此时可以尝试从宿主机层面访问容器的文件系统。
4.1 获取容器 ID
以 kube-apiserver-minikube
为例:
$ kubectl get pod kube-apiserver-minikube -n kube-system -o jsonpath='{.status.containerStatuses[0].containerID}'
docker://70d228676fdc03f0767a1161f56dfd1ad9194f9b7512663bd2e451e8ea502276
4.2 获取 Pod 所在节点
$ kubectl get pod kube-apiserver-minikube -n kube-system -o jsonpath='{.spec.nodeName}'
minikube
4.3 SSH 登录节点
$ minikube ssh
docker@minikube:
4.4 获取容器 PID
docker@minikube:~$ sudo docker inspect --format '{{ .State.Pid }}' 70d228676fdc03f0767a1161f56dfd1ad9194f9b7512663bd2e451e8ea502276
1893
4.5 进入容器文件系统
docker@minikube:~$ cd /proc/1893/root
docker@minikube:/proc/1893/root:~$ ls
bin boot dev etc go-runner home lib proc root run sbin sys tmp usr var
✅ 优点:此方法适用于几乎任何容器,无论其是否安装了 shell。
5. 使用 Shell 或 Bash 交互式访问
如果你确定容器中安装了 shell(如 sh
或 bash
),可以直接启动交互式会话:
$ kubectl exec -it sys-pod -- sh
/ #
进入后即可使用常规命令查看文件:
/ # ls
bin dev etc home lib lib64 proc root sys tmp usr var
如需进入特定命名空间下的 Pod:
$ kubectl exec -it --namespace kube-system etcd-minikube -- sh
/ #
6. 总结
本文介绍了几种在 Kubernetes 中查看 Pod 文件内容的实用方法:
方法 | 适用场景 | 优点 | 缺点 |
---|---|---|---|
kubectl exec |
容器中有 shell | 简单直接 | 容器需有 shell |
宿主机访问 | 容器无 shell | 通用性强 | 操作较复杂 |
交互式 shell | 需深入排查 | 灵活 | 依赖 shell 存在 |
✅ 建议:优先使用 kubectl exec
,遇到无 shell 的容器时再使用宿主机访问方式。