【问题标题】:Kubectl appears to be discarding standard outputKubectl 似乎正在丢弃标准输出
【发布时间】:2022-12-11 06:49:29
【问题描述】:

我正在尝试将一个大目录(约 350 个文件,总共约 40MB)的内容从 Kubernetes pod 复制到我的本地计算机。我正在使用 here 描述的技术。

有时它会成功,但在我的主机上通过管道传输到 tar xf 命令的标准输出经常会被截断。发生这种情况时,我会看到如下错误: <some file in the archive being transmitted over the pipe>: Truncated tar archive

源目录中的文件不会更改。错误消息中的文件通常是不同的(即:它似乎在不同的地方被截断了)。

作为参考(从上面的文档复制),这类似于我正在尝试做的事情(我使用不同的 pod 名称和目录名称): kubectl exec -n my-namespace my-pod -- tar cf - /tmp/foo | tar xf - -C /tmp/bar

运行后,我希望本地 /tmp/bar 的内容与 pod 中的内容相同。

然而,往往失败。我目前的理论(我对 kubectl 的工作原理了解非常有限,所以这都是猜测)是当 kubectl 确定 tar 命令已经完成时,它会终止——不管是否有剩余的字节在传输中(结束网络)包含标准输出的内容。

我尝试了各种组合:

  1. stdbuf
  2. 正在更改 tar 的 blocking factor
  3. 使命令运行时间更长(通过添加 && sleep <x>

    我不会列出我尝试过的所有组合,但这是一个使用所有内容的示例: kubectl exec -n my-namespace my-pod -- stdbuf -o 0 tar -b 1 -c -f - -C /tmp/foo . && sleep 2 | tar xf - -C /tmp/bar

    我可以非常可靠地使用该命令的组合。例如,忘记 stdbuf-b 1,只睡 100 秒,即: kubectl exec -n my-namespace my-pod -- tar -c -f - -C /tmp/foo . && sleep 100 | tar xf - -C /tmp/bar

    但是更多的实验让我相信 tar 的块大小(我相信是 512 字节?)仍然太大(-b 的参数是块的数量,而不是这些块的大小)。这是我现在使用的命令: kubectl exec -n my-namespace my-pod -- bash -c 'dd if=<(tar cf - -C /tmp/foo .) bs=16 && sleep 10' | tar xf - -C /tmp/bar

    是的,我不得不把 bs 做得那么小,然后睡得“那么大”才能让它发挥作用。但这至少给了我两个我可以搞砸的变量。我确实发现,如果我设置 bs=1,我就不必睡觉了……但是移动所有数据(一次一个字节)需要很长时间。

    所以,我想我的问题是:

    1. 我认为 kubectl 在确定提供给 exec 的命令完成后截断标准输出的理论是否正确?
    2. 这个问题有更好的解决方案吗?

【问题讨论】:

  • 也许更准确地说我的理论是:tar 发送到标准输出的最后一块数据(在它退出之前)似乎在与时间赛跑,以便在 kubectl 知道 tar 已经完成之前返回到 kubectl .我的命令使我能够保持小的“块”,同时能够独立地更改我必须等待它们的时间。
  • 可能与网络有关。您是否尝试将z 添加到tar 以进行压缩?您没有描述您的用例,但最好将持久卷(由 NFS 或云存储支持)安装到 Pod 中或者让 Pod 创建存档,然后将其上传到云存储。您可能希望在 kubectl 存储库中提交 issue
  • ...并且可能(尽管我怀疑它在这种情况下没有帮助)添加 --v=8 以在 kubectl 命令上获得完整的日志详细信息。

标签: kubernetes kubectl tar dd


【解决方案1】:

也许对于 来说,它必须应对的完整命令到底是什么,您可能还不够具体。对于谁应该负责管道过程可能存在歧义。 “--”可能不会指示 kubectl 将其作为命令的一部分包含在内。那可能是被shell拦截了。

你有没有试过把它全部包起来双引号

CMD="tar cf - /tmp/foo | tar xf - -C /tmp/bar"

kubectl exec -n my-namespace my-pod -- "${CMD}"

这样一来,它将在目标处保存的范围作为监视完成过程的一部分。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-14
    • 2010-12-07
    • 2011-12-03
    • 1970-01-01
    • 1970-01-01
    • 2012-09-21
    相关资源
    最近更新 更多