我正在尝试将文件从Kubernetes Pods复制到我的本地系统。运行以下命令时出现以下错误:
kubectl cp aks-ssh2-6cd4948f6f-fp9tl:/home/azureuser/test.cap ./test.cap
输出:
tar:home / azureuser / test:无法统计:没有这样的文件或目录tar: 由于先前的错误错误而以失败状态退出: home / azureuser / test没有这样的文件或目录
我可以在上面给定的路径下看到文件。我真的很困惑。
你能帮我吗?
答案 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容器)
PS /home/pranesh> kubectl cp /home/pranesh/Node.aspx aspx-deployment-84597d88f5-pk5nh:/Node.aspx
PS /home/pranesh> kubectl exec aspx-deployment-84597d88f5-pk5nh powershell "Copy-Item "C:\Node.aspx" -Destination "C:\inetpub\wwwroot""
答案 6 :(得分:1)
问题中的命令绝对正确。正如之前的answered似乎在容器中缺少tar
一样。我实际上不知道是否需要它,但确认了豆荚有它:
# find / -name tar
/bin/tar
/usr/lib/mime/packages/tar
/usr/share/doc/tar
我的错误是使用.
复制到当前目录(适用于cp
和scp
),因为它需要完整路径,如原始问题所示:
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复制到本地路径,反之亦然
kubectl cp
kubectl cp
kubectl cp
答案 8 :(得分:0)
我通过将源文件夹设置为相对路径来解决此问题。 如果文件位置为/home/azureuser/test.cap,工作目录为/ home / azureuser /,则cmd为
kubectl cp aks-ssh2-6cd4948f6f-fp9tl:test.cap ./test.cap
答案 9 :(得分:0)
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的命名空间添加前缀