我需要将转储数据从 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"}
谁能帮忙解决这个问题吗?
谢谢
对于较新版本的 kubectl,添加 retries=-1 标志可能会解决该问题:
kubectl cp --retries=-1 pod-www-xxx-yyy-zzz:/path/to/remote/dir ~/local/dir
使用“cat”命令,而不是“cp”对我来说有效——但只有在尝试了 3 次之后才有效。
“cp”命令一次又一次无法获取整个文件。
这个“猫”风格的命令每次都做得更好。
所以试试这个,看看你的胜算是否会提高!
kubectl exec -i [pod name] -c [container name] -- cat [path to file] > [output file]
您能否将数据库转储移动到单独的目录,然后尝试复制整个目录?
这可能看起来像这样:
kubectl cp device-database-79fc964c8-q7ncc:tmp/plsql_data/directory_containing_prod_dump /Users/raja/new_local_dir_containing_db_dump
根据此评论可能会有所帮助。
Bageshwar Pratap Narain 和 Ibrahim ULUDAĞ 的评论也证实该解决方案对他们有效。
我的 kubectl 版本 (1.22) 使用
retries
: 抛出错误
Error: unknown flag: --retries
但是,如果你看
kubectl options
,你会发现--request-timeout='0'
所以,我做了
kubectl cp --request-timeout=3m ...
并且它适用于 8MB 文件。
这是一个适合我的解决方法:
kubectl exec pod_name -- bash -c "tar cf - /remote/path; sleep 10" | tar xf - -C /local/path
sleep 10
步骤旨在防止过早拆卸,这似乎是我的案例中的问题。
这显然是一种巧妙的解决方法,可以减轻拆卸中的竞争状况。但它帮助我复制了文件,所以我会接受它。
在做了一些研究后,我今天遇到了类似的问题,发现在下载完整文件之前连接超时,建议您使用
--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
根据 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'.
就我而言。复制文件夹没有帮助。相反,tar.gz 有帮助
我删除了所有文件名的“[”符号,它对我有用
我想出了一个有点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
测试存档。