Rsync from/to a Kubernetes pod

Use rsync to transfer file from/to a pod

Feel kubectl cp command is a bit of inconvenience:

  1. Can't just use target directory. I must assign file name.
  2. Not compressed - poor performance on transferring big file.

And these inconveniences are kind of expected behavior. The doc says the cp command is basically:

kubectl exec -n <some-namespace> <some-pod> -- tar cf - /tmp/foo | tar xf - -C /tmp/bar

Then start looking for alternative solutions - And the answer is rsync.

rsync --rsh

For me, rsync is definitely the best solution for transferring files via SSH. I have now learned that it can also be used on Kubernetes. The magic is --rsh option:

-e, --rsh=COMMAND

This option allows you to choose an alternative remote shell program to use for communication between the local and remote copies of rsync. Typically, rsync is configured to use ssh by default, but you may prefer to use rsh on a local network.

--rsh is frequently used for setting extra arguments for ssh. And now we use this option to run rsync and connect to the pod.

Solution

Of course, there are other people trying to use rsync on Kubernetes. I found a clear explanation of the usage on Server Fault. And a well-designed kube-rsync script which requires extra dependency.

I mix their code, and create this script:

When this script is named as kubectl-rsync and placed under $PATH, it would be recognized by kubectl as a plugin.

Now this script could be invoked as kubectl rsync command. Further, we can use with the customized alias:

alias k=kubectl
# copy from remote to local
k rsync pod:target.txt .
# specify namespace
k rsync pod@namespace:source.txt .
k rsync -n namespace pod:source.txt .
# rsync option is acceptable after `--`
k rsync -- -hhh --progress source.txt pod:dir/

Sweet! ✨🍰✨