如何将文件从kubernetes Pod复制到本地系统

Gir*_*ish 14 kubernetes azure-kubernetes azure-aks

我正在尝试将文件从Kubernetes Pods复制到我的本地系统。运行以下命令时出现以下错误:

kubectl cp aks-ssh2-6cd4948f6f-fp9tl:/home/azureuser/test.cap ./test.cap
Run Code Online (Sandbox Code Playgroud)

输出:

tar:home / azureuser / test:无法统计:没有这样的文件或目录tar:由于先前的错误而以失败状态退出错误:home / azureuser / test没有这样的文件或目录

我可以在上面给定的路径下看到文件。我真的很困惑。

你能帮我吗?

小智 33

假设您要将文件从 bin 文件夹复制到本地系统。命令是

kubectl cp default/POD_NAME:bin/FILE_NAME /Users/username/FILE_NAME
Run Code Online (Sandbox Code Playgroud)

您可以连接到 POD 以验证您是否指定了正确的文件名

kubectl exec -ti POD_NAME bash
Run Code Online (Sandbox Code Playgroud)


小智 17

根据https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands

kubectl cp <file-spec-src> <file-spec-dest> 相当于使用

kubectl exec -n <some-namespace> <some-pod> -- tar cf - <src-file> | tar xf - -C <dest-file>

所以从技术上讲,如果你没有在 pod 上安装 tar,你可以这样做 kubectl exec -n <some-namespace> <some-pod> -- cat <src-file> > <dest-file>

假设文件很小或者已经压缩过,效果应该是一样的,只是不能在一个目录或一组文件上使用 cat 。


sha*_*359 17

该线程上的一些用户已经提到了 kubectl cp 命令。

kubectl cp <pod-id>:<path> <local-path> -n <namespace> -c <specific_container>
Run Code Online (Sandbox Code Playgroud)

请注意,要运行此命令,pod 上应已安装tar实用程序。

但是,我在Windows PowerShell上运行此命令时遇到了一些错误。

PS P:\Users\nstty\Downloads\k8s-diags> kubectl cp dremio-master-0:/var/log/dremio/server.log P:\Users\nstty\Downloads\k8s-diags\server-logs\
error: one of src or dest must be a local file specification
Run Code Online (Sandbox Code Playgroud)

错误:src 或 dest 之一必须是本地文件规范

在 Windows 上运行此命令时,不要使用本地系统的完整路径。请改用相对路径(. 或 ..)。现在在下面的命令中使用相对路径,但出现不同的错误。

PS P:\Users\nstty\Downloads\k8s-diags> kubectl cp dremio-master-0:/var/log/dremio/server.log .
tar: Removing leading `/' from member names
error: open .: is a directory
Run Code Online (Sandbox Code Playgroud)

错误:打开 .: 是一个目录

如果要复制文件,则在本地路径中使用相对路径以及复制文件所需的文件名。kubectl 会首先创建这个文件,然后将内容复制到这个文件中。下面是工作命令。

PS P:\Users\nstty\Downloads\k8s-diags> kubectl cp dremio-master-0:/var/log/dremio/server.log .\server-logs\server.log
tar: Removing leading `/' from member names
Run Code Online (Sandbox Code Playgroud)

tar:从成员名称中删除前导“/”

此消息只是来自 pod 中 tar 实用程序的警告。该文件应复制到您的本地系统。

替代选项:如果您想避免 kubectl cp,这里是我们使用的另一种方法。


Md *_*ikh 13

“kubectl cp”命令用于将文件从 pod 复制到本地路径,反之亦然

  1. 将文件从 pod 复制到本地

    kubectl cp <pod_name>:<文件路径> <目标路径>

  2. 将文件从 pod 的特定容器复制到本地

    kubectl cp <pod_name>:<file_path> <destination_path> -c Specific_container

  3. 将文件从本地复制到 pod

    kubectl cp <本地源路径> <pod_name>:<目标路径>


Cro*_*rou 12

kubectl帮助中所述:

kubectl cp --help
Copy files and directories to and from containers.
Examples:
# !!!Important Note!!!
# Requires that the 'tar' binary is present in your container
# image.  If 'tar' is not present, 'kubectl cp' will fail.

# Copy /tmp/foo_dir local directory to /tmp/bar_dir in a remote pod in the default namespace
kubectl cp /tmp/foo_dir <some-pod>:/tmp/bar_dir

# Copy /tmp/foo local file to /tmp/bar in a remote pod in a specific container
kubectl cp /tmp/foo <some-pod>:/tmp/bar -c <specific-container>

# Copy /tmp/foo local file to /tmp/bar in a remote pod in namespace <some-namespace>
kubectl cp /tmp/foo <some-namespace>/<some-pod>:/tmp/bar

# Copy /tmp/foo from a remote pod to /tmp/bar locally
kubectl cp <some-namespace>/<some-pod>:/tmp/foo /tmp/bar

Options:
-c, --container='': Container name. If omitted, the first container in the pod will be chosen

Usage:
kubectl cp <file-spec-src> <file-spec-dest> [options]

Use "kubectl options" for a list of global command-line options (applies to all commands).
Run Code Online (Sandbox Code Playgroud)

您也可以登录到您的站点Containter并检查文件是否存在:

kubectl exec -it aks-ssh2-6cd4948f6f-fp9tl /bin/bash
ls -la /home/azureuser/test.cap
Run Code Online (Sandbox Code Playgroud)

如果仍然无法解决问题,请尝试:

您可以尝试将文件复制到workdir,然后仅使用文件名重试。这很奇怪,但目前仍然有效。

在这里考虑kchugalinskiy的建议#58692

  • 教训:不要忘记输入“命名空间或项目名称(如果是 openshift)”,它也无法 cp 链接文件(出现“tar:从成员名称中删除前导 /”错误) (5认同)

Nag*_*gev 12

发布的问题中的命令是绝对正确的。作为回答之前,这个特殊的问题似乎是缺少tar在容器二进制文件。我实际上不知道它是必需的,但确认 pod 有它:

# find / -name tar
/bin/tar
/usr/lib/mime/packages/tar
/usr/share/doc/tar
Run Code Online (Sandbox Code Playgroud)

我的错误是.用于复制到当前目录(与cp和 一起使用scp),因为它需要完整路径,如原始问题所示:

kubectl cp pod-name-shown-in-get-pods:path/to/filename /local/dir/filename
Run Code Online (Sandbox Code Playgroud)

不是

kubectl cp pod-name-shown-in-get-pods:path/to/filename .
Run Code Online (Sandbox Code Playgroud)

这使:

error: open .: is a directory
tar: Removing leading `/' from member names
Run Code Online (Sandbox Code Playgroud)

现在tar错误消息中的 是有道理的!

请注意,如果路径中有前导/,如下例所示:

kubectl cp pod-name-shown-in-get-pods:/etc/resolv.conf /local/dir/resolv.conf
Run Code Online (Sandbox Code Playgroud)

您还会看到:

tar: Removing leading `/' from member names
Run Code Online (Sandbox Code Playgroud)

但是,可以忽略警告,因为文件仍会被复制。在上面的例子中使用etc/resolv.conf而不是/etc/resolv.conf在没有警告的情况下进行复制。


may*_*513 8

kubectl cp <pod-id>:<path> <destination-path> -n <namespace>
Run Code Online (Sandbox Code Playgroud)

为我工作。