Container, die in Kubernetes-Pods ausgeführt werden, sind als eigenständige Recheneinheiten gedacht, mit denen Sie nicht manuell interagieren müssen. Manchmal müssen Sie jedoch möglicherweise Dateien in oder aus dem Dateisystem eines Pods kopieren, vielleicht weil Sie ein Problem debuggen und in einem Container gespeicherte Protokolle, Konfigurationsdateien oder Caches archivieren möchten.
So verschieben Sie Dateien zwischen Ihrem Computer und Containern in einem Pod mit der integrierten Übertragungsfunktion von Kubectl oder einer manuellen Alternative.
Kopieren auf oder von Ihrem Gerät
Der kubectl cp
Der Befehl ist der einfachste Weg, um in oder aus einem Container-Dateisystem zu kopieren. Es funktioniert ähnlich wie das docker cp
Sie sind vielleicht bereits aus der lokalen Containerentwicklung vertraut.
kubectl cp
erfordert Quell- und Zielargumente. Eine der Quellen oder Ziele muss eine Pod-Referenz sein. Dies ist als Pod-Name formatiert, gefolgt von einem Doppelpunkt und dem Container-Dateisystempfad.
kubectl cp example-pod:/tmp/example-dir ./example-dir
Dieses Beispiel kopiert den Inhalt von /tmp/example-dir
aus example-pod
in example-dir
auf Ihrem lokalen Dateisystem. Das Umkehren der Argumente würde das example-dir
Ihrer Maschine kopieren zurück zum Pod.
Befehlsargumente
Da ein einzelner Pod mehrere Container enthalten kann, ist es wichtig, dies bei der Verwendung von cp
zu berücksichtigen . Kubernetes kopiert standardmäßig in die oder aus der ersten Containerinstanz innerhalb des Pods. Sie können stattdessen auf einen bestimmten Container abzielen, indem Sie -c
hinzufügen Flagge:
kubectl cp example-pod:/tmp/example-dir ./example-dir -c second-container
Wie alle anderen kubectl
Befehle, cp
läuft gegen die Cluster-Verbindung, die durch Ihre KUBECONFIG
definiert ist Umgebungsvariable. Dies ist standardmäßig ~/.kube/conf
.
Es gibt zwei Optionen, wenn Sie Namespace-Pods referenzieren. Sie können entweder den Standard --namespace example-namespace
hinzufügen kennzeichnen oder verwenden Sie einen vollständigen Pod-Pfad in Ihrer Dateisystemreferenz:
kubectl cp example-namespace/example-pod:/tmp/example-dir ./example-dir
Dateiattribute werden standardmäßig beibehalten. Fügen Sie --no-preserve
hinzu Flag zu Ihrem cp
Befehl zum Entfernen von Eigentums- und Berechtigungsdaten aus den kopierten Dateien, die am Ziel verbleiben. Im Gegensatz zum normalen Unix-cp
, ist die Implementierung von Kubectl immer rekursiv, sodass der Verweis auf ein Verzeichnis auch dessen Inhalt enthält.
Wenn Kubectl Cp nicht funktioniert
kubectl cp
kommt mit einem großen Vorbehalt:intern ist es ein einfacher Wrapper um tar
. Der Befehl komprimiert den Quellpfad, kopiert das Archiv zum Ziel und extrahiert dann seinen Inhalt. Ihr Container-Image muss den tar
enthalten binär in seinem Pfad, damit dies funktioniert.
Dies bedeutet kubectl cp
ist möglicherweise nicht immer eine Option, wenn Sie die Best Practices von Docker befolgen, um Bilder klein zu halten. Obwohl beliebte Minimalbasen wie alpine
fügen Sie tar
hinzu , es ist möglicherweise nicht in jedem Bild enthalten und wird nicht vorhanden sein, wenn Sie sie von Grund auf neu zusammenstellen.
Die Verwendung von tar
schränkt auch ein, was kubectl cp
kopieren kann. Sie können keine symbolischen Links auflösen oder Platzhalter wie /tmp/*.log
verwenden . Sie müssen einen anderen Ansatz verwenden, wenn diese Funktionalität benötigt wird.
Eine Möglichkeit besteht darin, kubectl exec
zu kombinieren , die cat
Befehl und Shell-Umleitung, um den Inhalt einer Datei aus dem Cluster in eine lokale Datei zu streamen:
kubectl exec --namespace example-namespace example-pod -c second-container -- cat /tmp/example-file > local-file
Die kubectl exec
Der Befehl startet eine Shell-Sitzung im Pod. Alles nach dem --
wird im Container ausgeführt. Die Ausgabe des Aufrufs von cat
auf der Datei wird an Ihr Terminal ausgegeben, wo sie in eine lokale Datei umgeleitet werden kann.
Diese Technik eignet sich, wenn Sie eine Handvoll relativ kleiner Dateien kopieren. Es würde schnell mühsam werden, wenn Sie ein großes Verzeichnis abrufen müssten. Leider gibt es keine bessere Alternative, ohne Ihrem Container zusätzliche Software hinzuzufügen.
Wenn Sie sich trauen, können Sie SSH in Ihrem Container installieren und scp
verwenden um von Ihrem Host aus auf sein Dateisystem zuzugreifen. Dies würde Ihnen ein vollständiges Kopiererlebnis auf Kosten der Ausführung eines zusätzlichen Daemons und der Schaffung eines potenziellen Sicherheitsproblems bieten. Es sollte nur auf ordnungsgemäß geschützten Clustern in Betracht gezogen werden.
Hinzufügen von tar
zu Ihren Container-Images ist eine viel sicherere Option. Dadurch können Sie kubectl cp
verwenden und entsperrt erweitertes manuelles Kopieren über kubectl exec
wenn Sie zusätzliche Funktionen benötigen. Wenn Sie mit dem cp
auf Einschränkungen stoßen Syntax, rufen Sie tar
auf direkt über kubectl exec
um dem Befehl zusätzliche Flags hinzuzufügen:
kubectl exec --namespace example-namespace example-pod -c second-container -- tar -cf /tmp/example-dir | tar xf - -C ./extracted-dir
Dies führt tar -cF
aus in Ihrem Container und leitet das Ergebnis an tar xf
weiter Extraktionsbefehl auf Ihrem lokalen Computer. Der -
weist tar
an um die ihm über den Standard-Eingabestrom zugeführten Daten zu extrahieren. -C
wird verwendet, um ein Zielverzeichnis anzugeben.
Zusammenfassung
Der kubectl cp
Mit dem Befehl können Sie Dateien zwischen Kubernetes-Pods und Ihrem Computer kopieren. Es funktioniert in beide Richtungen, kann aber nicht zum Verschieben von Dateien von Pod zu Pod verwendet werden. Wenn Sie dies tun müssen, verwenden Sie am besten ein zweistufiges Verfahren, indem Sie zuerst von Pod A auf Ihren Computer und dann weiter auf Pod B kopieren.
Als cp
stützt sich auf tar
Unter der Haube müssen Sie sicherstellen, dass Ihr Container-Image es enthält. Sie sehen ein No such file or directory tar
Fehler, wenn Sie versuchen, cp
auszuführen gegen einen Pod ohne tar
. Fügen Sie in dieser Situation entweder tar
hinzu in den Container oder verwenden Sie eine Kombination aus kubectl exec
und cat
wenn Sie nur ein paar Dateien abrufen müssen.