Come copiare file tra i pod Kubernetes e la tua macchina

0
174

I contenitori in esecuzione nei pod Kubernetes sono pensati per essere unità di calcolo autonome che non è necessario interagire manualmente con. A volte potresti dover copiare file da o verso il filesystem di un pod, forse perché stai eseguendo il debug di un problema e desideri archiviare i log, i file di configurazione o le cache archiviate in un contenitore.

< p>Ecco come spostare file tra la tua macchina e i contenitori in un pod, utilizzando la funzione di trasferimento integrata di Kubectl o un'alternativa manuale.

Copia verso o dalla tua macchina

Il comando kubectl cp è il modo più semplice per copiare da o verso un filesystem contenitore. Funziona in modo simile al docker cp con cui potresti già avere familiarità dallo sviluppo di contenitori locali.

kubectl cp richiede argomenti di origine e destinazione. Una delle sorgenti o destinazioni deve essere un riferimento Pod. Questo è formattato come il nome del Pod, seguito da due punti e dal percorso del filesystem nel contenitore.

kubectl cp example-pod:/tmp/example-dir ./example-dir

Questo esempio copia il contenuto di /tmp/example-dir da example-pod a example-dir sul tuo filesystem locale. L'inversione degli argomenti copierebbe la directory di esempio della tua macchina nel Pod.

Argomenti dei comandi

Poiché un singolo Pod può contenere più contenitori, è importante tenerlo a mente quando si utilizza cp. Kubernetes utilizzerà per impostazione predefinita la copia da o verso la prima istanza di container all'interno del pod. Puoi invece scegliere come target un contenitore specifico aggiungendo il flag -c:

kubectl cp example-pod:/tmp/example-dir ./example-dir -c second-container Annuncio

Come tutti gli altri comandi kubectl, cp viene eseguito sulla connessione del cluster definita dalla variabile di ambiente KUBECONFIG. L'impostazione predefinita è ~/.kube/conf.

Ci sono due opzioni quando fai riferimento a Pod con spazio dei nomi. Puoi aggiungere il flag standard –namespace example-namespace o utilizzare un percorso Pod completo nel riferimento del filesystem:

kubectl cp example-namespace/example-pod:/tmp/example-dir ./example-dir < p>Gli attributi dei file vengono conservati per impostazione predefinita. Aggiungi il flag –no-preserve al tuo comando cp per rimuovere i dati di proprietà e permessi dai file copiati lasciati nella destinazione. A differenza del normale cp di Unix, l'implementazione di Kubectl è sempre ricorsiva, quindi il riferimento a una directory includerà anche il suo contenuto.

Quando Kubectl Cp ha vinto&#8217 ;t Work

kubectl cp ha un grande avvertimento: internamente, è un semplice wrapper per tar. Il comando comprimerà il percorso di origine, copierà l'archivio nella destinazione e quindi ne estrarrà il contenuto. L'immagine del tuo contenitore deve includere il file binario tar nel suo percorso affinché funzioni.

Ciò significa che kubectl cp potrebbe non essere sempre un'opzione quando si seguono le best practice di Docker per mantenere piccole le immagini. Sebbene le basi minimal popolari come alpine includano tar, potrebbe non essere presente in tutte le immagini e non sarà presente se le stai assemblando da zero.

Pubblicità

L'uso di tar limita anche ciò che kubectl cp può copiare. Non puoi risolvere i collegamenti simbolici o utilizzare caratteri jolly come /tmp/*.log. Dovrai utilizzare un approccio diverso quando questa funzionalità è necessaria.

Un'opzione è combinare kubectl exec, il comando cat e il reindirizzamento della shell per trasmettere il contenuto di un file fuori dal cluster e in un file locale:

kubectl exec –namespace example-namespace example- pod -c secondo-contenitore — ​​cat /tmp/file-esempio > local-file

Il comando kubectl exec avvia una sessione di shell nel Pod. Tutto dopo il — viene eseguito all'interno del contenitore. L'output della chiamata cat sul file verrà inviato al tuo terminale dove può essere reindirizzato in un file locale.

Questa tecnica è adatta quando stai copiando una manciata di file relativamente piccoli. Diventerebbe rapidamente noioso se avessi bisogno di recuperare una directory di grandi dimensioni. Sfortunatamente non c'è alternativa migliore senza aggiungere software aggiuntivo al tuo contenitore.

Se ti senti audace, puoi installare SSH nel tuo contenitore e usare scp per accedere al suo filesystem dal tuo host. Ciò ti darebbe un'esperienza di copia completa a scapito dell'esecuzione di un demone aggiuntivo e della creazione di un potenziale problema di sicurezza. Dovrebbe essere considerato solo su cluster adeguatamente protetti.

L'aggiunta di tar alle immagini del contenitore è un'opzione molto più sicura. Ciò ti consente di utilizzare kubectl cp e sblocca la copia manuale più avanzata tramite kubectl exec quando hai bisogno di funzionalità extra. Se incontri delle limitazioni con la sintassi cp, invoca tar direttamente tramite kubectl exec per aggiungere flag extra al comando:

kubectl exec –namespace example-namespace example-pod -c secondo-contenitore — ​​tar -cf /tmp/example-dir | tar xf – -C ./extracted-dir Advertisement

Questo esegue tar -cF all'interno del tuo contenitore e reindirizza il risultato al comando di estrazione tar xf sul tuo computer locale. Il – ordina a tar di estrarre i dati che gli vengono forniti tramite il flusso di input standard. -C viene utilizzato per specificare una directory di destinazione.

Riepilogo

Il comando kubectl cp ti consente di copiare file tra Kubernetes Pods e la tua macchina. Funziona in entrambe le direzioni ma non può essere utilizzato per spostare file da Pod a Pod. Se hai bisogno di farlo, è meglio usare una procedura in due fasi, copiando prima dal Pod A alla tua macchina, poi avanti al Pod B.

Poiché cp si basa su tar sotto- the-hood, devi assicurarti che l'immagine del tuo contenitore lo includa. Se si tenta di eseguire cp su un Pod senza tar, verrà visualizzato l'errore No such file o directory tar. In questa situazione, aggiungi tar al contenitore o usa una combinazione di kubectl exec e cat se hai solo bisogno di recuperare pochi file.