GNU/Linux >> Linux Esercitazione >  >> Panels >> Docker

Come copiare file tra i pod Kubernetes e la tua macchina

I container in esecuzione in Kubernetes Pods sono pensati per essere unità di calcolo autonome con cui non è necessario interagire manualmente. A volte potresti dover copiare file nel o dal filesystem di un Pod, forse perché stai eseguendo il debug di un problema e desideri archiviare registri, file di configurazione o cache archiviati in un contenitore.

Ecco come spostare i file tra la tua macchina e i contenitori in un Pod, utilizzando la funzione di trasferimento incorporata di Kubectl o un'alternativa manuale.

Copiare su o dal tuo computer

Il kubectl cp command è il modo più semplice per copiare da o verso un filesystem contenitore. Funziona in modo simile a docker cp potresti già avere familiarità con lo sviluppo di container 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 in example-dir sul tuo filesystem locale. Invertire gli argomenti copierebbe la example-dir della tua macchina torna al Pod.

Argomenti dei comandi

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

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

Come tutti gli altri kubectl comandi, cp viene eseguito sulla connessione del cluster definita dal tuo KUBECONFIG variabile d'ambiente. Il valore predefinito è ~/.kube/conf .

Ci sono due opzioni quando fai riferimento ai pod con spazio dei nomi. Puoi aggiungere lo standard --namespace example-namespace contrassegnare o utilizzare un percorso Pod completo nel riferimento del filesystem:

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

Gli attributi dei file vengono mantenuti per impostazione predefinita. Aggiungi il --no-preserve segnala al tuo cp comando per rimuovere i dati di proprietà e autorizzazioni dai file copiati lasciati nella destinazione. A differenza del normale cp di Unix , l'implementazione di Kubectl è sempre ricorsiva, quindi fare riferimento a una directory includerà anche il suo contenuto.

Quando Kubectl Cp non funzionerà

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

Questo significa kubectl cp potrebbe non essere sempre un'opzione quando segui le migliori pratiche di Docker per mantenere le immagini piccole. Sebbene siano popolari basi minimali come alpine includi tar , potrebbe non essere presente in tutte le immagini e non sarà presente se le stai assemblando da zero.

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

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

kubectl exec 
    --namespace example-namespace 
    example-pod -c second-container 
    -- cat /tmp/example-file > local-file

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

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

Se ti senti audace, puoi installare SSH nel tuo container 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.

Aggiunta di tar alle immagini del tuo 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 il cp sintassi, invoca tar direttamente tramite kubectl exec per aggiungere ulteriori flag al comando:

kubectl exec 
    --namespace example-namespace 
    example-pod -c second-container 
    -- tar -cf /tmp/example-dir | tar xf - -C ./extracted-dir

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

Riepilogo

Il kubectl cp comando 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 è necessario farlo, è meglio utilizzare una procedura in due fasi, copiando prima dal Pod A alla macchina, quindi successivamente al Pod B.

Come cp si basa su tar sotto il cofano, devi assicurarti che l'immagine del tuo contenitore lo includa. Vedrai un No such file or directory tar errore se provi a eseguire cp contro un Pod senza tar . In questa situazione, aggiungi tar al contenitore o utilizzare una combinazione di kubectl exec e cat se hai solo bisogno di recuperare alcuni file.


Docker
  1. Come trasferire file tra macchine locali e remote utilizzando il protocollo SFTP

  2. Come copiare in modo sicuro file tra host Linux utilizzando SCP e SFTP

  3. Come copiare e modificare i file nella shell Android?

  4. Trova e copia i file

  5. Come condividere file tra Ubuntu e Mac OS X

Come condividere file di giochi Steam tra Linux e Windows

Come utilizzare FTP per spostare i file tra il tuo computer e il tuo dispositivo Android

Come copiare file e directory nel terminale Linux

Come utilizzare Docker Cp per copiare file tra host e contenitori

Come copiare file con Docker cp nel tuo Docker Container

Come copiare file tra host e contenitore Docker