Los contenedores que se ejecutan en Kubernetes Pods están destinados a ser unidades informáticas independientes con las que no es necesario interactuar manualmente. Sin embargo, a veces es posible que deba copiar archivos hacia o desde el sistema de archivos de un Pod, tal vez porque está depurando un problema y desea archivar registros, archivos de configuración o cachés almacenados en un contenedor.
Aquí le mostramos cómo mover archivos entre su máquina y los contenedores en un Pod, utilizando la función de transferencia integrada de Kubectl o una alternativa manual.
Copiar ao desde su equipo
El kubectl cp
El comando es la forma más sencilla de copiar hacia o desde un sistema de archivos contenedor. Funciona de manera similar al docker cp
es posible que ya esté familiarizado con el desarrollo de contenedores locales.
kubectl cp
requiere argumentos de origen y destino. Una de las fuentes o destinos debe ser una referencia de Pod. Tiene el formato del nombre del Pod, seguido de dos puntos y la ruta del sistema de archivos del contenedor.
kubectl cp example-pod:/tmp/example-dir ./example-dir
Este ejemplo copia el contenido de /tmp/example-dir
de example-pod
a example-dir
en su sistema de archivos local. Invertir los argumentos copiaría el example-dir
de su máquina de vuelta al Pod.
Argumentos de comando
Como un solo pod puede contener varios contenedores, es importante tener esto en cuenta al usar cp
. Kubernetes utilizará de forma predeterminada la copia hacia o desde la primera instancia de contenedor dentro del Pod. En su lugar, puede dirigirse a un contenedor específico agregando -c
bandera:
kubectl cp example-pod:/tmp/example-dir ./example-dir -c second-container
Como todos los demás kubectl
comandos, cp
se ejecuta contra la conexión del clúster definida por su KUBECONFIG
Variable ambiental. Esto por defecto es ~/.kube/conf
.
Hay dos opciones cuando hace referencia a pods con espacio de nombres. Puede agregar el estándar --namespace example-namespace
marque o use una ruta de Pod completa en la referencia de su sistema de archivos:
kubectl cp example-namespace/example-pod:/tmp/example-dir ./example-dir
Los atributos de archivo se conservan de forma predeterminada. Agrega el --no-preserve
marca a tu cp
Comando para eliminar los datos de propiedad y permisos de los archivos copiados que quedan en el destino. A diferencia de Unix normal cp
, la implementación de Kubectl siempre es recursiva, por lo que hacer referencia a un directorio también incluirá su contenido.
Cuando Kubectl Cp no funciona
kubectl cp
viene con una gran advertencia:internamente, es un simple envoltorio alrededor de tar
. El comando comprimirá la ruta de origen, copiará el archivo en el destino y luego extraerá su contenido. La imagen de su contenedor debe incluir el tar
binario en su camino para que esto funcione.
Esto significa kubectl cp
Puede que no siempre sea una opción cuando sigue las mejores prácticas de Docker para mantener las imágenes pequeñas. Aunque las bases mínimas populares como alpine
incluya tar
, es posible que no aparezca en todas las imágenes y no estará presente si las ensambla desde cero.
El uso de tar
también limita lo que kubectl cp
puede copiar No puede resolver enlaces simbólicos o usar comodines como /tmp/*.log
. Tendrá que usar un enfoque diferente cuando se necesite esta funcionalidad.
Una opción es combinar kubectl exec
, el cat
comando y redirección de shell para transmitir el contenido de un archivo fuera del clúster y en un archivo local:
kubectl exec --namespace example-namespace example-pod -c second-container -- cat /tmp/example-file > local-file
El kubectl exec
El comando inicia una sesión de shell en el Pod. Todo después del --
se ejecuta dentro del contenedor. El resultado de llamar a cat
en el archivo se emitirá a su terminal donde se puede redirigir a un archivo local.
Esta técnica es adecuada cuando está copiando un puñado de archivos relativamente pequeños. Rápidamente se volvería tedioso si necesitara recuperar un directorio grande. Desafortunadamente, no hay mejor alternativa sin agregar software adicional a su contenedor.
Si se siente atrevido, puede instalar SSH en su contenedor y usar scp
para acceder a su sistema de archivos desde su host. Esto le brindaría una experiencia de copia completa a expensas de ejecutar un demonio adicional y crear un posible problema de seguridad. Solo debe considerarse en clústeres debidamente protegidos.
Agregando tar
a las imágenes de su contenedor es una opción mucho más segura. Esto le permite usar kubectl cp
y desbloquea la copia manual más avanzada a través de kubectl exec
cuando necesite funcionalidad adicional. Si encuentra limitaciones con el cp
sintaxis, invoque tar
directamente a través de kubectl exec
para agregar banderas adicionales al comando:
kubectl exec --namespace example-namespace example-pod -c second-container -- tar -cf /tmp/example-dir | tar xf - -C ./extracted-dir
Esto ejecuta tar -cF
dentro de su contenedor y canaliza el resultado al tar xf
comando de extracción en su máquina local. El -
instruye a tar
para extraer los datos que se le alimentan a través del flujo de entrada estándar. -C
se utiliza para especificar un directorio de destino.
Resumen
El kubectl cp
El comando le permite copiar archivos entre Kubernetes Pods y su máquina. Funciona en cualquier dirección, pero no se puede usar para mover archivos de Pod a Pod. Si necesita hacer eso, es mejor usar un procedimiento de dos etapas, copiando primero desde el Pod A a su máquina, luego hacia el Pod B.
Como cp
se basa en tar
bajo el capó, debe asegurarse de que la imagen de su contenedor lo incluya. Verá un No such file or directory tar
error si intenta ejecutar cp
contra un Pod sin tar
. En esta situación, agregue tar
al contenedor o use una combinación de kubectl exec
y cat
si solo necesita recuperar algunos archivos.