将文件 rsync 到 kubernetes pod

将文件 rsync 到 kubernetes pod

我需要将文件树 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

对于rsyncPod,我使用以下帮助程序。

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'

相关内容