1. 简介

在实际工作中,我们经常需要从 Kubernetes Pod 中复制文件到本地系统进行调试、日志分析或配置备份。本文将介绍如何使用 kubectl cp 命令实现这一需求。我们会讲解其基本语法、使用技巧,并通过几个典型场景的示例帮助你更好地掌握这个命令。

2. 理解 kubectl cp 命令

kubectl cp 是 Kubernetes 提供的一个实用命令,用于在本地文件系统和 Pod 之间复制文件或目录。

其基本语法如下:

$ kubectl cp <file-spec-src> <file-spec-dest>

其中:

  • <file-spec-src><file-spec-dest> 可以是本地路径,也可以是远程路径(Pod 路径)
  • 如果是远程到本地复制,格式如下:
$ kubectl cp <pod-name>:<remote-path> <local-path>

需要准备的信息包括:

  • Pod 名称
  • Pod 中文件的路径
  • 本地保存路径

2.1 多容器 Pod 的情况

如果 Pod 中包含多个容器,默认会从第一个容器中查找路径。要指定具体容器,可以使用 -c 参数:

$ kubectl cp <pod-name>:<remote-path> <local-path> -c <container-name>

2.2 跨命名空间复制

如果 Pod 所在的命名空间不是默认命名空间,需要在 Pod 名前加上命名空间:

$ kubectl cp <namespace>/<pod-name>:<remote-path> <local-path>

⚠️ 注意:kubectl cp 命令依赖于 Pod 的访问权限和文件系统权限。请确保你拥有足够的 RBAC 权限。

3. 使用示例

3.1 从默认命名空间中的 Pod 复制文件

我们先来看一个最简单的例子:从 default 命名空间中的 nginx Pod 复制配置文件。

$ kubectl cp nginx:/etc/nginx/nginx.conf /home/user/nginx/nginx.conf
$ ls nginx/
nginx.conf

✅ 成功执行后不会有任何输出,可以通过 ls 确认文件是否复制成功。

⚠️ 注意:如果目标路径是目录,必须指定完整文件名,否则会报错:

$ kubectl cp nginx:/etc/nginx/nginx.conf .
error: open .: is a directory

3.2 跨命名空间复制文件

接下来我们演示如何从其他命名空间中复制文件。

首先查看当前命名空间列表:

$ kubectl get namespaces
NAME              STATUS   AGE
default           Active   104d
kube-node-lease   Active   104d
kube-public       Active   104d
kube-system       Active   104d
multi-services    Active   55s

然后查看 multi-services 命名空间中的 Pod:

$ kubectl get pods --namespace=multi-services
NAME                      READY    STATUS    RESTARTS   AGE
grafana-68d7496c9b-mwhc9   1/1     Running   0          45s
nginx-redis-pod            2/2     Running   0          55s

现在我们从 Grafana Pod 中复制配置文件:

$ kubectl cp multi-services/grafana-68d7496c9b-mwhc9:/etc/grafana/grafana.ini /home/user/grafana/grafana.ini
$ ls grafana/
grafana.ini

⚠️ 注意:远程路径不要以 / 开头,因为底层使用 tar 命令,它会忽略带斜杠的路径。

3.3 从多容器 Pod 中复制文件

最后我们演示如何从一个包含多个容器的 Pod 中复制特定容器的文件。

比如从 nginx-redis-pod 中的 nginx 容器复制配置文件:

$ kubectl cp multi-services/nginx-redis-pod:/etc/nginx/nginx.conf /home/user/nginx/nginx.conf -c nginx
$ ls nginx/
nginx.conf

4. 小结

使用 kubectl cp 命令可以从 Kubernetes Pod 中复制文件到本地系统,关键点如下:

✅ 必须指定正确的 Pod 名称、路径和本地路径
✅ 多容器 Pod 需要使用 -c 指定容器名
✅ 跨命名空间复制时要加上命名空间前缀
✅ 远程路径不要以 / 开头,避免 tar 命令解析问题
✅ 确保有足够权限访问 Pod 和文件系统

掌握了这些技巧,就能更高效地进行调试和排查工作。


原始标题:Copying Files from Kubernetes Pods to Local System