I need to rsync a file tree to a specific pod in a kubernetes cluster. It seems it should be possible if only one can convince rsync that kubectl acts sort of like rsh. Something like:

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

... except that this runs into problems with x since rsync assumes a hostname is needed:

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

I can not seem to find a method to help rsync construct the rsh command. Is there a way to do this? Or some other method by which relatively efficient file transfer can be achieved over a pipe?

(I am aware of gcloud compute copy-files, but it can only be used onto the node?)


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:


if [ -z "$KRSYNC_STARTED" ]; then
    export KRSYNC_STARTED=true
    exec rsync --blocking-io --rsh "$0" $@

# Running as --rsh

# If use uses pod@namespace rsync passes as: {us} -l pod namespace ...
if [ "X$pod" = "X-l" ]; then
    namespace="-n $1"

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.

  • This script works perfectly! – omikron Feb 16 '19 at 15:23
  • Works perfectly indeed, the --rsh part is not trivial at all to understand. Downside is not using tar – Mugen Mar 26 '19 at 13:47
  • hats off to you, sir. This is a very elegant script. – Michael Niemand Mar 23 '20 at 20:45
  • Error on my Mac OS: rsync error: protocol incompatibility (code 2) at /BuildRoot/Library/Caches/com.apple.xbs/Sources/rsync/rsync-52/rsync/compat.c(61) [sender=2.6.9] command terminated with exit code 126 – Abdennour TOUMI Jul 5 '20 at 13:58
  • 1
    Thank you for the script. I am new to k8s and was trying to migrate my old server. Saved me a lot of time. – Chaitanya Bankanhal Feb 12 at 12:33

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.


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/

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.


It is not supported, but there is an issue for adding support which you can +1 or even contribute to: https://github.com/kubernetes/kubernetes/issues/18007#issuecomment-164797262


The answer from @karl-bunch was perfect. For those who prefer using tar this is how I use it:

tar -cvz -C /orig-dir . | kubectl exec -ti podname -- sh -c 'cd /var/www && tar -xzv'

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.