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

时间:2018-09-19 13:40:01

标签: kubernetes azure-kubernetes azure-aks

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

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

输出:

  

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

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

你能帮我吗?

12 个答案:

答案 0 :(得分:7)

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

因此从技术上讲,如果吊舱中未安装tar,则可以执行kubectl exec -n <some-namespace> <some-pod> -- cat <src-file> > <dest-file>

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

答案 1 :(得分:4)

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此处考虑#58692的建议。

答案 2 :(得分:3)

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

更新您的aks-ssh yaml文件:

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

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

答案 3 :(得分:3)

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

为我工作。

答案 4 :(得分:1)

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

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

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

kubectl exec -ti POD_NAME bash

答案 5 :(得分:1)

如果有人使用Windows Pod,则可能很难通过具有用于kubectl cp命令的linux路径的本地计算机将文件从本地计算机复制到Pod:

将文件从本地计算机复制到kubernetes pod的过程:(尤其是Windows容器)

  1. 我想将node.aspx从本地计算机复制到 podname:\ c:\ inetpub \ wwwroot
  2. 首先将Node.aspx上传到您的云驱动器,路径为 / home / {您的用户名}在我的情况下/ home / pranesh
  3. 然后找出广告连播名称,以我为例 aspx-deployment-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. 使用相反的过程从容器复制到云驱动器并下载。

答案 6 :(得分:1)

问题中的命令绝对正确。正如之前的answered似乎在容器中缺少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很有意义!

答案 7 :(得分:1)

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

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

kubectl cp :

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

kubectl cp : -c specific_container

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

kubectl cp :

答案 8 :(得分:0)

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

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

答案 9 :(得分:0)

如果您的容器在PATH中没有tar命令,则

kubectl cp将无法工作。从您的错误中可以看到tar命令在您的容器上不可用。 https://github.com/kubernetes/kubernetes/issues/58512 请探索其他选项

答案 10 :(得分:0)

当用户没有对Pod的权限时,Kubernetes会显示“找不到文件”错误。那是我的问题。

答案 11 :(得分:0)

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

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

因此请使用-c grafana设置容器名称,并在我的情况下metrics/适当地为pod的命名空间添加前缀