Rsync

rsync 文件到 kubernetes pod

  • January 1, 2022

我需要將文件樹同步到 kubernetes 集群中的特定 pod。如果只有一個人可以讓 rsync 相信 kubectl 的行為有點像 rsh,這似乎是可能的。就像是:

rsync --rsh='kubectl exec -i podname -- ' -r foo x:/tmp

…除了這會遇到 x 問題,因為 rsync 假定需要主機名:

exec: "x": executable file not found in $PATH

我似乎找不到幫助 rsync 構造 rsh 命令的方法。有沒有辦法做到這一點?或者其他一些可以通過管道實現相對有效的文件傳輸的方法?

(我知道gcloud compute copy-files,但它只能在節點上使用?)

最後,我編寫了一個 Python 腳本來充當t​​ar 文件的接收者。你可以這樣做:

tar cf - . | kubectl exec shinken -i catcher -v /etc/shinken/custom_configs

請注意,這僅在您的集群節點是 Kubernetes 1.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 use uses pod@namespace rsync passes 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 -- "$@"

然後你可以在你通常使用 rsync 的地方使用 krsync:

krsync -av --progress --stats src-dir/ pod:/dest-dir

或者您可以設置命名空間:

krsync -av --progress --stats src-dir/ pod@namespace:/dest-dir

**注意:**您必須在 pod 映像中具有 rsync 執行檔才能使其正常工作。

引用自:https://serverfault.com/questions/741670