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.