我们可以使用 kubectl cp 查看传输进度吗?

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

是否可以通过

kubectl cp
了解Google Cloud的文件传输进度?

kubernetes google-kubernetes-engine
7个回答
31
投票

不,这似乎不可能。

kubectl cp
似乎通过执行相当于的操作来实现

kubectl exec podname -c containername \
  tar cf - /whatever/path \
| tar xf -

这意味着两件事:

  1. tar(1) 不会打印任何有用的进度信息。 (原则上,您可以添加一个

    v
    标志来打印每个文件名,因为它传递到 stderr,但这不会告诉您总共有多少个文件或它们有多大。)所以
    kubectl cp
    作为实施没有任何办法解决这个问题。

  2. 没有更丰富的原生 Kubernetes API 来复制文件。

如果将文件移入和移出容器对您来说是一个关键用例,那么通过添加简单的 HTTP 服务可能会更容易构建、测试和运行。 然后,您可以依靠 HTTP

Content-Length:
标头等内容来进行进度计量。


17
投票

一种选择是使用 pv,它将显示经过的时间、传输的数据和吞吐量(例如 MB/s):

$ kubectl exec podname -c containername -- tar cf - /whatever/path | pv | tar xf -

14.1MB 0:00:10 [1.55MB/s] [       <=>                                   ]

如果您提前知道预期的传输大小,您也可以将其传递给 pv,然后它将计算 % 进度以及 ETA,例如 100m 传输:

$ kubectl exec podname -c containername -- tar cf - /whatever/path | pv -s 100m | tar xf -

13.4MB 0:00:09 [1.91MB/s] [==>                          ] 13% ETA 0:00:58

您显然需要(本地)安装光伏才能使上述任何功能正常工作。


6
投票

在 MacOS 上,仍然有一种在“网络”选项卡上打开“活动监视器”的老套方法。如果您使用

kubectl cp
从本地计算机复制到远程 Pod,则总传输量将显示在“已发送字节数”列中。 不是超高精度,但它无需安装任何新东西即可完成工作。

enter image description here


5
投票

我想出了一个巧妙的方法来做到这一点。如果您对要复制到的容器具有 bash 访问权限,则可以在远程执行类似

wc -c <file>
的操作,然后将其与本地大小进行比较。
du -h <file>
是另一种选择,它提供了人类可读的输出,因此可能会更好


3
投票

这是不可能的,但是您可以在这里找到如何使用kubernetes实现rsync,rsync向您显示传输文件的进度。 将文件同步到 kubernetes pod


2
投票

我知道它不会显示每个文件的活动进度,但会输出一个状态,包括每个已完成文件的字节数,对于通过脚本运行的多个文件来说,这几乎与活动进度一样好:

kubectl cp local.file container:/path/on/container --v=4

注意 --v=4 是详细模式,将为您提供输出。我发现 kubectl cp 输出显示从 v=3 到 v=5。


0
投票

展示一种通过 scp 中隐藏标志来实现此目的的巧妙方法:

kubectl exec pod-name -- sh -c 'file=/tmp/test1; name=$(basename $file) ; size=$(wc -c $file | cut -d " " -f 1); echo "C0644 $size $name"; dd if=$file bs=8192 2>/dev/null; printf "\0"' | scp -t /tmp

这会将容器中的文件(

/tmp/test1
)复制到您的
/tmp
目录,模式为644,并带有漂亮的进度条和速度计。如果您愿意,您可以读取文件模式并在 SCP 消息的第一行中进行相应的设置。

但我们确实应该等待这个 PR 得到解决。

参考:

http://nanozen.snert.org/how-the-scp-protocol-works/

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