Saltar al contenido principal

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

  • kubectl instalado 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.