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