Feel kubectl cp command is a bit of inconvenience:
- Can't just use target directory. I must assign file name.
- 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! ✨🍰✨