Migrar archivos entre volúmenes de Kubernetes con kubectl cp
Transferí archivos almacenados en Persistent Volumes de Kubernetes desde un cluster origen a uno destino usando kubectl cp, pasando por la máquina local como intermediario.
Prerrequisitos
kubectlinstalado y configurado con contextos para ambos clusters- Acceso a ambos clusters (kubeconfigs configurados, ej. via
aws eks update-kubeconfig) - Nombre del Pod origen, namespace y la ruta dentro del Pod donde se almacenan los archivos
- Nombre del Pod destino y su namespace
Empecemos
Paso 1 — Configurar acceso kubectl a ambos clusters
Asegurate de tener entradas en el kubeconfig para ambos clusters. Por ejemplo:
aws eks update-kubeconfig --region us-east-1 --name source-cluster-name --profile source-profile
aws eks update-kubeconfig --region us-east-1 --name target-cluster-name --profile target-profile
Verificá que los contextos estén disponibles:
kubectl config get-contexts
Paso 2 — Ejecutar el script de migración
Guardá el siguiente script como transfer.sh, personalizá las variables al inicio y ejecutalo:
#!/bin/bash
set -euo pipefail
SOURCE_CONTEXT="source-context" # Contexto kubectl del cluster origen
TARGET_CONTEXT="target-context" # Contexto kubectl del cluster destino
SOURCE_POD="source-pod-name"
SOURCE_NAMESPACE="source-namespace"
SOURCE_PATH="/path/in/source-pod"
TARGET_POD="target-pod-name"
TARGET_NAMESPACE="target-namespace"
TARGET_PATH="/path/in/target-pod"
TEMP_LOCAL_DIR="/tmp/k8s-transfer"
# Verificar que ambos contextos existen
for ctx in "$SOURCE_CONTEXT" "$TARGET_CONTEXT"; do
if ! kubectl config get-contexts "$ctx" &>/dev/null; then
echo "Error: el contexto kubectl '$ctx' no fue encontrado" >&2
exit 1
fi
done
# Copiar del Pod origen a la máquina local
echo "Copiando archivos de $SOURCE_POD..."
mkdir -p $TEMP_LOCAL_DIR
kubectl --context="$SOURCE_CONTEXT" cp $SOURCE_NAMESPACE/$SOURCE_POD:$SOURCE_PATH $TEMP_LOCAL_DIR
# Copiar de la máquina local al Pod destino
echo "Copiando archivos a $TARGET_POD..."
kubectl --context="$TARGET_CONTEXT" cp $TEMP_LOCAL_DIR/. $TARGET_NAMESPACE/$TARGET_POD:$TARGET_PATH
# Limpiar
rm -rf $TEMP_LOCAL_DIR
echo "Transferencia completa."
Hacelo ejecutable y corrélo:
chmod +x transfer.sh
./transfer.sh
info
Este enfoque es ideal para assets de aplicaciones — archivos subidos, multimedia, configuración — que no son parte de una base de datos. Para datos de bases de datos, usá la guía de restauración de dump de PostgreSQL.