Файлы rsync в модуль kubernetes

Мне нужно выполнить rsync дерева файлов с конкретным модулем в кластере кубернетов. Кажется, это станет возможным, если только один сможет убедить 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 , но его можно использовать только на узле?)

6
задан 8 December 2015 в 21:17
6 ответов

В конце концов, я написал сценарий на Python, чтобы действовать в качестве приемника tar-файлов. Вы можете сделать так:

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

Обратите внимание, что это работает только в том случае, если узлы кластера являются kubernetes 1.1 или более поздней версией.

.
2
ответ дан 3 December 2019 в 00:09

Это не поддерживается, но есть проблема с добавлением поддержки, которую вы можете +1 или даже внести свой вклад: https://github.com/kubernetes/kubernetes/issues/18007#issuecomment-164797262

0
ответ дан 3 December 2019 в 00:09

Если двоичный файл tar доступен в контейнере, вы можете передавать файлы с помощью новой команды cp . https://kubernetes.io/docs/user-guide/kubectl/v1.7/#cp

Хотя, возможно, не так эффективен, как rsync.

0
ответ дан 3 December 2019 в 00:09

Для rsync с модулем я использую следующий помощник:

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 -- "$@"

Затем вы можете использовать krsync там, где обычно rsync:

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

Или вы можете установить пространство имен:

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

ПРИМЕЧАНИЕ: Вы Чтобы это работало, в образе модуля должен быть исполняемый файл rsync.

9
ответ дан 3 December 2019 в 00:09

Однострочное письмо, просто отредактируйте свои имена и пути:

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/
1
ответ дан 3 December 2019 в 00:09

Ответ @karl-bunch был идеальным. Для тех, кто предпочитает использовать tar, я использую его следующим образом:

tar -cvz -C /orig-dir . | kubectl exec -ti podname -- sh -c 'cd /var/www && tar -xzv'
1
ответ дан 6 December 2020 в 11:52

Теги

Похожие вопросы