无法使用 kubectl cp 命令将数据从 POD 复制到本地

问题描述 投票:0回答:10

我需要将转储数据从 pod 复制到本地。在我正在尝试的命令下方,但出现错误:

unexpected EOF

kubectl cp device-database-79fc964c8-q7ncc:tmp /Users/raja
error: unexpected EOF

or

kubectl cp device-database-79fc964c8-q7ncc:tmp/plsql_data/prod.dump /Users/raja/prod.dump
error: unexpected EOF


kubectl版本

kubectl version --client
Client Version: version.Info{Major:"1", Minor:"21", GitVersion:"v1.21.0", GitCommit:"cb303e613a121a29364f75cc67d3d580833a7479", GitTreeState:"clean", BuildDate:"2021-04-08T16:31:21Z", GoVersion:"go1.16.1", Compiler:"gc", Platform:"darwin/amd64"}

谁能帮忙解决这个问题吗?

谢谢

kubernetes kubectl
10个回答
71
投票

对于较新版本的 kubectl,添加 retries=-1 标志可能会解决该问题:

kubectl cp --retries=-1 pod-www-xxx-yyy-zzz:/path/to/remote/dir ~/local/dir 

15
投票

使用“cat”命令,而不是“cp”对我来说有效——但只有在尝试了 3 次之后才有效。

“cp”命令一次又一次无法获取整个文件。

这个“猫”风格的命令每次都做得更好。

所以试试这个,看看你的胜算是否会提高!

kubectl exec -i [pod name] -c [container name] -- cat [path to file] > [output file]

8
投票

您能否将数据库转储移动到单独的目录,然后尝试复制整个目录

这可能看起来像这样:

kubectl cp device-database-79fc964c8-q7ncc:tmp/plsql_data/directory_containing_prod_dump /Users/raja/new_local_dir_containing_db_dump

根据此评论可能会有所帮助。

Bageshwar Pratap NarainIbrahim ULUDAĞ 的评论也证实该解决方案对他们有效。


5
投票

我的 kubectl 版本 (1.22) 使用

retries
:

抛出错误
Error: unknown flag: --retries

但是,如果你看

kubectl options
,你会发现
--request-timeout='0'

所以,我做了

kubectl cp --request-timeout=3m ...
并且它适用于 8MB 文件。


4
投票

这是一个适合我的解决方法:

kubectl exec pod_name -- bash -c "tar cf - /remote/path; sleep 10" | tar xf - -C /local/path

sleep 10
步骤旨在防止过早拆卸,这似乎是我的案例中的问题。

这显然是一种巧妙的解决方法,可以减轻拆卸中的竞争状况。但它帮助我复制了文件,所以我会接受它。


2
投票

在做了一些研究后,我今天遇到了类似的问题,发现在下载完整文件之前连接超时,建议您使用

--retries=10

完整的命令是

kubectl  cp --retries=10 <Name of namespace>/<pod-name>:<Path of file in pod> <Path of file in local>

例如。

kubectl  cp --retries=10 cf/abc-service-58bf-xj8wr:/tmp/app.hprof /tmp/test_heap.hprof 

1
投票

根据 kubectl 文档,文件和目录应采用 .tar 扩展名,kubectl cp 才能正常工作,否则将会失败。

    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.
  #
  # For advanced use cases, such as symlinks, wildcard expansion or
  # file mode preservation consider using 'kubectl exec'.

0
投票

就我而言。复制文件夹没有帮助。相反,tar.gz 有帮助


0
投票

我删除了所有文件名的“[”符号,它对我有用


0
投票

我想出了一个有点hacky的方法。但对我来说效果很好。

这是我如何重建文件的示例。所以给出错误:

# kubectl cp pg-dump:dump2.sql.gz dump2.sql.gz
Dropping out copy after 0 retries
error: unexpected EOF

我通过

ls -l
stat
从 pod 中提取原始文件大小。在我的示例中,它是 2658958550。

然后我去:

# kubectl exec -i pg-dump -- tail -c $((2658958550 - $(stat -f'%z' dump2.sql.gz))) dump2.sql.gz > dmp2

其中

dump2.sql.gz
是本地下载一半的文件。

下载完成后,连接:

# cat dump2.sql.gz dmp2 > dump2_1.sql.gz

再次比较尺寸,结果还是不匹配。所以我们还没有完成。重复:

# kubectl exec -i pg-dump -- tail -c $((echo 2658958550 - $(stat -f'%z' dump2_1.sql.gz))) dump2.sql.gz > dmp21

再来一次

# cat dump2_1.sql.gz dmp21 > dump2_2.sql.gz

现在文件大小匹配。我们现在可以比较本地文件和 pod 内文件的

sha1sum
,或者通过
gzip -t
测试存档。

© www.soinside.com 2019 - 2024. All rights reserved.