Назад | Перейти на главную страницу

файлы rsync в модуль Kubernetes

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

Чтобы выполнить синхронизацию с модулем, я использую следующий помощник:

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.

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

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

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

Если tar бинарный файл доступен в контейнере, вы можете передавать файлы с помощью нового cp команда.

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

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

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 или даже внести свой вклад: https://github.com/kubernetes/kubernetes/issues/18007#issuecomment-164797262