rsync files to a kubernetes pod

Solution 1:

To rsync to a pod I use the following helper:

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

I put this in a file called "rsync-helper.sh" and then run the rsync like this:

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

If you'd like a simple script that wraps this all up save this as 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 -- "$@"

Then you can use krsync where you would normally rsync:

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

Or you can set the namespace:

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

NOTE: You must have rsync executable in the pod image for this to work.

Solution 2:

In the end, I wrote a Python script to act as a receiver of tar files. You can do thus:

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

Note that this only works if you cluster nodes are kubernetes 1.1 or later.


Solution 3:

If the tar binary is available on the container, you can transfer files using the new cp command.

Though possibly not as efficient as rsync.


Solution 4:

A one-liner, just edit to you names and paths:

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/