如何复制文件从库伯内茨豆荚到本地系统

我想把库伯内特斯的文件复制到我的本地系统。当运行以下命令时,我得到了下面的错误:

kubectl cp aks-ssh2-6cd4948f6f-fp9tl:/home/azureuser/test.cap ./test.cap

产出:

Tar: home/azureuser/test: 不能统计: 没有这样的文件或目录 tar: 由于以前的错误错误,以失败状态退出: Home/azureuser/test 没有这样的文件或目录

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

你能帮帮我吗?

292834 次浏览

正如在 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).

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

kubectl exec -it aks-ssh2-6cd4948f6f-fp9tl /bin/bash
ls -la /home/azureuser/test.cap

如果这仍然不起作用,试试:

您可以尝试将您的文件复制到 workdir,然后重新尝试只使用它们的名称复制它们。有点奇怪,但是现在起作用了。

在这里考虑 Kchugalinskiy的建议。

您可以将本地目录挂载到吊舱中。

更新 ak-ssh yaml 文件:

spec:
...
containers:
...
volumeMounts:
- name: test-dir
mountPath: /home/azureuser
...
volumes:
- name: test-dir
hostPath:
path: /path/to/your/local/dir

现在您可以访问本地目录中的文件。

假设要将文件从 bin 文件夹复制到本地系统

kubectl cp default/POD_NAME:bin/FILE_NAME /Users/username/FILE_NAME

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

kubectl exec -ti POD_NAME bash

我通过将源文件夹设置为相对路径来解决这个问题。 如果文件位置是/home/azureuser/test.cap,并且工作目录是/home/azureuser/,则 cmd 为

Kubectl cp aks-ssh2-6cd4948f6f-fp9tl: test.cap./test.cap

如果您的容器在 PATH 中没有 tar 命令,kubectl cp 将无法工作。从您的错误中可以看出,您的容器上似乎没有 tar 命令。 Https://github.com/kubernetes/kubernetes/issues/58512 请探索其他选择

根据 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>

所以技术上来说,如果你没有在吊舱上安装沥青,你可以做 kubectl exec -n <some-namespace> <some-pod> -- cat <src-file> > <dest-file>

假设文件很小或者已经压缩,效果应该是相同的,除了不能在目录或文件集上使用 cat。

当用户没有权限访问一个吊舱时,Kubernetes 会给出一个未找到的文件错误。这就是我的问题。

如果有人使用 windows pods,可能很难使用 kubectl cp 命令的 linux 路径从本地机器复制到 pods:

将文件从本地机器复制到库伯内特豆荚的程序: (尤其是窗口容器)

  1. 我想把 node.aspx 从我的本地机器复制到 Podname: c: inetpub wwwroot
  2. 首先将 Node.aspx 上传到云驱动器,path 将 /home/{ your _ username }中的/home/pranesh
  3. 然后找出豆荚的名字,在我的情况下是 Aspx-department-84597d88f5-pk5nh,按照下面的命令操作
PS /home/pranesh> kubectl cp /home/pranesh/Node.aspx aspx-deployment-84597d88f5-pk5nh:/Node.aspx
  1. 这将文件复制到容器的 c 驱动器,
  2. 然后用 Powershell 将文件从 c 驱动器移动到所需的路径
PS /home/pranesh> kubectl exec aspx-deployment-84597d88f5-pk5nh powershell "Copy-Item "C:\Node.aspx" -Destination "C:\inetpub\wwwroot""
  1. 使用反向过程从容器复制到云驱动器并下载。

在我这边,问题在于舱内有多个容器:

kubectl cp -c grafana \
metrics/grafana-5c4f76b49b-p88lc:/etc/grafana \
./grafana/etc

因此,用 -c grafana设置容器名称,并在我的例子中为 pod 的名称空间正确地加上前缀 metrics/

问题中的命令是绝对正确的。与之前的 回答一样,这个问题似乎是容器中缺少的 tar二进制文件。我实际上不知道这是必要的,但确认了豆荚有它:

# find / -name tar
/bin/tar
/usr/lib/mime/packages/tar
/usr/share/doc/tar

我的错误是使用 .复制到工作目录(与 cpscp一起工作) ,因为它需要完整的路径,如最初的问题所示:

kubectl cp pod-name-shown-in-get-pods:path/to/filename /local/dir/filename

没有:

kubectl cp pod-name-shown-in-get-pods:path/to/filename .

结果是:

error: open .: is a directory
tar: Removing leading `/' from member names

现在,错误消息中的 tar就有意义了!

注意,如果在 来源路径中有一个前导 /,如下例所示:

kubectl cp pod-name-shown-in-get-pods:/etc/resolv.conf /local/dir/resolv.conf

你还会看到:

tar: Removing leading `/' from member names

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

我在 Azure 上尝试了这种方法,它奏效了:

kubectl cp 'POD NAME':xyz.json test


kubectl cp is the command for copying


POD NAME =  vote-app

xyz.json是需要从 pod 中复制的文件 测试是在 AZURE 目录的驱动器中创建的文件..。

所以最后的命令是:

kubectl cp vote-app:xyz.json test

Test 将在 Azure Directory 中生成,稍后您可以从 Azure 的下载选项下载 test文件 enter image description here

kubectl cp <pod-id>:<path> <destination-path> -n <namespace>

对我有用。

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

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

    Kubectl cp < pod _ name > : < file _ path > < target _ path >

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

    Kubectl cp < pod _ name > : < file _ path > < target _ path >-c special _ Container

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

    Kubectl cp < local _ source _ path > < pod _ name > : < Destination _ path >

对于在 Windows 机器上工作的人来说,还有一个额外的问题: 截至2021年10月,你不能在本地路径中包含驱动器号。

所以如果你尝试下面这样的命令:

kubectl cp aks-ssh2-6cd4948f6f-fp9tl:/home/azureuser/test.cap C:/Temp/Test

您会得到这个错误,因为 kubectl cp将 Windows 路径中的冒号视为 pod 名称和 pod 内路径之间的分隔符。 因此,它将看到 C:/Temp/Test作为一个名为“ C”的豆荚,其路径为“/Temp/Test”

解决这个问题的方法是使用相对 Windows 路径而不是绝对路径。它将需要相对于你目前的工作目录。

因此,如果我当前的工作目录是 C:\Users\JoeBloggs,并且我想复制到 C:\Temp\Test,我需要使用以下命令:

kubectl cp aks-ssh2-6cd4948f6f-fp9tl:/home/azureuser/test.cap ../../Temp/Test

请注意,这个问题看起来可能很快就会得到解决。请参阅 https://github.com/kubernetes/kubernetes/pull/94165

我没能让 Kubectl 为我工作,这是个错误:

The connection to the server localhost:8080 was refused - did you specify the right host or port?

相反,这对我很有效:

docker cp CONTAINERID:FILEWITHPATH DESTFILENAME

其中通过调用 docker ps检索“ CONTAINERID”。

您需要提到您的 pod 可用的名称空间。

也许有人会遇到这个错误

tar: removing leading '/' from member names
error: open .: is a directory

由以下命令引发

 kc cp -n monitoring <pod name>:/usr/share/grafana/conf/defaults.ini ./


kc cp -n monitoring <pod name>:/usr/share/grafana/conf/defaults.ini ./default.ini

为了解决这个问题,我们应该为每个 医生添加一个目标文件夹

kc cp -n monitoring <pod name>:/usr/share/grafana/conf/defaults.ini ./tmp/default.ini

这对我有用:

kubectl cp "namespace"/"pod_name":"path_in_pod" "local_path"

例如:

kubectl cp mynamespace/mypod:var/www/html/index.html \Users\myuser\Desktop\index.html

这个线程中的一些用户已经提到了 kubectl cp 命令。

kubectl cp <pod-id>:<path> <local-path> -n <namespace> -c <specific_container>

请注意,要运行这个命令,应该已经在吊舱上安装了 沥青实用程序。

然而,在 窗户 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

Error: src 或 est 之一必须是本地文件规范

在 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

是一个目录

如果要复制文件,则在本地路径中使用相对路径以及所需的复制文件的文件名。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

Tar: 从成员名称中删除前导‘/’

这个消息只是来自您的吊舱中的焦油实用程序的警告。文件应该复制到本地系统。

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