arquivos rsync para um pod de kubernetes

3

Eu preciso rsync uma árvore de arquivos para um pod específico em um cluster do kubernetes. Parece que deveria ser possível se apenas um pudesse convencer o rsync que o kubectl age como rsh. Algo como:

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

... exceto que isso ocorre em problemas com x porque o rsync supõe que um nome de host é necessário:

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

Eu não consigo encontrar um método para ajudar o rsync a construir o comando rsh. Existe uma maneira de fazer isso? Ou algum outro método pelo qual a transferência de arquivos relativamente eficiente pode ser obtida através de um pipe?

(estou ciente de gcloud compute copy-files , mas só pode ser usado no nó?)

    
por Bittrance 08.12.2015 / 20:17

5 respostas

2

No final, eu escrevi um script Python para atuar como um receptor de arquivos tar. Você pode fazer assim:

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

Observe que isso só funciona se os nós do cluster forem kubernetes 1.1 ou mais recentes.

    
por 02.01.2016 / 09:48
2

Para rsync para um pod eu uso o seguinte auxiliar:

pod=$1;shift;kubectl exec -i $pod -- "$@"

Eu coloco isso em um arquivo chamado "rsync-helper.sh" e depois executo o rsync assim:

rsync -av --progress --stats -e './rsync-helper.sh' source-dir/ thePodName:/tmp/dest-dir

Se você quiser um script simples que envolva tudo isso, salve-o como 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 -- "$@"

Então você pode usar o krsync onde você normalmente rsync:

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

Ou você pode definir o namespace:

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

OBSERVAÇÃO: Você deve ter o executável do rsync na imagem do pod para que isso funcione.

    
por 10.12.2017 / 12:17
0

Não é suportado, mas há um problema para adicionar suporte que você pode marcar com +1 ou até mesmo contribuir para: link

    
por 18.12.2015 / 23:52
0

Se o binário tar estiver disponível no contêiner, você poderá transferir arquivos usando o novo comando cp . link

Embora possivelmente não seja tão eficiente quanto o rsync.

    
por 29.08.2017 / 12:12
0

Um one-liner, basta editar seus nomes e caminhos:

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/
    
por 12.11.2018 / 14:43