Created
May 17, 2025 10:32
-
-
Save tzing/5983f0272cba1f8905de9c3c10804ccb to your computer and use it in GitHub Desktop.
rsync over kubectl
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#! /bin/bash | |
# This script is inspired by following scripts: | |
# * https://serverfault.com/a/887402 | |
# * https://github.com/dmrub/kube-utils/blob/master/kube-rsync | |
set -eo pipefail | |
if [[ -z "$KUBECTL_RSYNC_RSH" ]]; then | |
[[ -n "$KUBE_CONTEXT" ]] && echo >&2 "* Found \$KUBE_CONTEXT = $KUBE_CONTEXT" | |
[[ -n "$POD_NAMESPACE" ]] && echo >&2 "* Found \$POD_NAMESPACE = $POD_NAMESPACE" | |
[[ -n "$POD_NAME" ]] && echo >&2 "* Found \$POD_NAME = $POD_NAME" | |
while [[ $# -gt 0 ]]; do | |
case "$1" in | |
--context) | |
KUBE_CONTEXT="$2" | |
shift 2 | |
;; | |
--context=*) | |
KUBE_CONTEXT="${1#*=}" | |
shift | |
;; | |
-c | --container) | |
POD_CONTAINER="$2" | |
shift 2 | |
;; | |
--container=*) | |
POD_CONTAINER="${1#*=}" | |
shift | |
;; | |
-n | --namespace) | |
POD_NAMESPACE="$2" | |
shift 2 | |
;; | |
--namespace=*) | |
POD_NAMESPACE="${1#*=}" | |
shift | |
;; | |
-h | --help) | |
echo "Rsync file and directories from/to Kubernetes pod" | |
echo "" | |
echo "IMPORTANT:" | |
echo "'rsync' must be installed on both the local machine and the target container for this script to work." | |
echo "" | |
echo "Usage:" | |
echo " $(basename "$0") [options] [--] [rsync-options] SRC DST" | |
echo "" | |
echo "Options:" | |
echo " -n, --namespace='' Namespace of the pod" | |
echo " --context='' The name of the kubeconfig context to use." | |
echo " Has precedence over KUBE_CONTEXT variable." | |
echo " -c, --container='' Container name. If omitted, the first container in the pod will be chosen" | |
echo " --help Display this help and exit" | |
echo "" | |
exit | |
;; | |
--) | |
shift | |
break | |
;; | |
*) | |
break | |
;; | |
esac | |
done | |
export KUBECTL_RSYNC_RSH=true | |
export KUBE_CONTEXT POD_NAMESPACE POD_CONTAINER | |
set -x | |
exec rsync --blocking-io --rsh="$0" "$@" | |
fi | |
# Running under --rsh | |
# If user uses pod@namespace, rsync passes args as `-l pod namespace` | |
if [[ x"$1" == x"-l" ]]; then | |
POD_NAME="$2" | |
POD_NAMESPACE="$3" | |
shift 3 | |
else | |
POD_NAMESPACE="$POD_NAMESPACE" | |
POD_NAME="$1" | |
shift | |
fi | |
export KUBE_CONTEXT POD_NAMESPACE POD_CONTAINER POD_NAME | |
echo >&2 "* Connect to pod $POD_NAME in ${POD_NAMESPACE:-current namespace}" | |
set -x | |
exec kubectl exec \ | |
${KUBE_CONTEXT:+--context=${KUBE_CONTEXT}} \ | |
${POD_NAMESPACE:+--namespace=${POD_NAMESPACE}} \ | |
${POD_CONTAINER:+--container=${POD_CONTAINER}} \ | |
"${POD_NAME}" -i \ | |
-- \ | |
"$@" |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment