是否可以通过
kubectl cp
了解Google Cloud的文件传输进度?
不,这似乎不可能。
kubectl cp
似乎通过执行相当于的操作来实现
kubectl exec podname -c containername \
tar cf - /whatever/path \
| tar xf -
这意味着两件事:
tar(1) 不会打印任何有用的进度信息。 (原则上,您可以添加一个
v
标志来打印每个文件名,因为它传递到 stderr,但这不会告诉您总共有多少个文件或它们有多大。)所以 kubectl cp
作为实施没有任何办法解决这个问题。没有更丰富的原生 Kubernetes API 来复制文件。
如果将文件移入和移出容器对您来说是一个关键用例,那么通过添加简单的 HTTP 服务可能会更容易构建、测试和运行。 然后,您可以依靠 HTTP
Content-Length:
标头等内容来进行进度计量。
一种选择是使用 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
您显然需要(本地)安装光伏才能使上述任何功能正常工作。
我想出了一个巧妙的方法来做到这一点。如果您对要复制到的容器具有 bash 访问权限,则可以在远程执行类似
wc -c <file>
的操作,然后将其与本地大小进行比较。 du -h <file>
是另一种选择,它提供了人类可读的输出,因此可能会更好
这是不可能的,但是您可以在这里找到如何使用kubernetes实现rsync,rsync向您显示传输文件的进度。 将文件同步到 kubernetes pod
我知道它不会显示每个文件的活动进度,但会输出一个状态,包括每个已完成文件的字节数,对于通过脚本运行的多个文件来说,这几乎与活动进度一样好:
kubectl cp local.file container:/path/on/container --v=4
注意 --v=4 是详细模式,将为您提供输出。我发现 kubectl cp 输出显示从 v=3 到 v=5。
展示一种通过 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 得到解决。
参考: