我需要将文件树 rsync 到 kubernetes 集群中的特定 pod。如果只有一个人能够让 rsync 相信 kubectl 的行为类似于 rsh,那么这似乎是可能的。例如:
rsync --rsh='kubectl exec -i podname -- ' -r foo x:/tmp
...但由于 rsync 假定需要主机名,因此这会遇到 x 的问题:
exec: "x": executable file not found in $PATH
我似乎找不到一种方法来帮助 rsync 构造 rsh 命令。有办法吗?或者有其他方法可以通过管道实现相对高效的文件传输?
(我知道gcloud compute copy-files
,但它只能在节点上使用?)
答案1
对于rsync
Pod,我使用以下帮助程序。
pod=$1;shift;kubectl exec -i $pod -- "$@"
我将其放入名为“rsync-helper.sh”的文件中,然后rsync
像这样运行。
rsync -av --progress --stats -e './rsync-helper.sh' source-dir/ thePodName:/tmp/dest-dir
如果您想要一个简单的脚本来完成这一切,请将其保存为krsync
。
#!/bin/bash
if [ -z "$KRSYNC_STARTED" ]; then
export KRSYNC_STARTED=true
exec rsync --blocking-io --rsh "$0" $@
fi
# Running as --rsh
namespace=''
pod=$1
shift
# If user uses pod@namespace, rsync passes args as: {us} -l pod namespace ...
if [ "X$pod" = "X-l" ]; then
pod=$1
shift
namespace="-n $1"
shift
fi
exec kubectl $namespace exec -i $pod -- "$@"
然后您就可以krsync
在通常使用 rsync 的地方使用了。
krsync -av --progress --stats src-dir/ pod:/dest-dir
您还可以设置命名空间。
krsync -av --progress --stats src-dir/ pod@namespace:/dest-dir
笔记:Pod 必须rsync
安装可执行文件才能正常工作。
答案2
最后,我编写了一个 Python 脚本来充当tar 文件的接收者。 您可以这样做:
tar cf - . | kubectl exec shinken -i catcher -v /etc/shinken/custom_configs
请注意,仅当您的集群节点是 kubernetes 1.1 或更高版本时,这才有效。
答案3
单行,只需编辑您的名称和路径:
p_user=$USER;p_name=$POD_NAME; rsync -avurP --blocking-io --rsync-path= --rsh="$(which kubectl) exec $p_name -i -- " /home/$USER/target_dir rsync:/home/$p_user/
答案4
@karl-bunch 的回答非常完美。对于那些喜欢使用tar
这个的人来说,我是这样使用的:
tar -cvz -C /orig-dir . | kubectl exec -ti podname -- sh -c 'cd /var/www && tar -xzv'