So kopieren Sie Dateien zwischen Kubernetes-Pods und Ihrem Computer

0
367

Container, die in Kubernetes-Pods ausgeführt werden, sind als eigenständige Recheneinheiten gedacht, die Sie müssen nicht manuell interagieren. Manchmal müssen Sie jedoch möglicherweise Dateien in das oder aus dem Dateisystem eines Pods kopieren, möglicherweise weil Sie ein Problem beheben und Protokolle, Konfigurationsdateien oder Caches archivieren möchten, die in einem Container gespeichert sind.

< p>So verschieben Sie Dateien zwischen Ihrem Computer und Containern in einem Pod mithilfe der integrierten Übertragungsfunktion von Kubectl oder einer manuellen Alternative.

Kopieren auf oder von Ihrem Computer

Der Befehl kubectl cp ist die einfachste Methode zum Kopieren in oder von einem Container-Dateisystem. Es funktioniert ähnlich wie das Docker cp, das Sie vielleicht bereits aus der lokalen Containerentwicklung kennen.

kubectl cp erfordert Quell- und Zielargumente. Quelle oder Ziel muss eine Pod-Referenz sein. Dies wird als Pod-Name, gefolgt von einem Doppelpunkt und dem Pfad des Dateisystems im Container formatiert.

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

Dieses Beispiel kopiert den Inhalt von /tmp/example-dir von example-pod zu example-dir auf Ihrem lokalen Dateisystem. Wenn Sie die Argumente umkehren, wird das Beispielverzeichnis Ihres Computers zurück in den Pod kopiert.

Befehlsargumente

Da ein einzelner Pod mehrere Container aufnehmen kann, ist es wichtig, dies bei der Verwendung von cp zu berücksichtigen. Kubernetes kopiert standardmäßig in die oder von der ersten Containerinstanz innerhalb des Pods. Sie können stattdessen auf einen bestimmten Container abzielen, indem Sie das Flag -c hinzufügen:

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

Wie alle anderen kubectl-Befehle wird cp gegen die Clusterverbindung ausgeführt, die durch Ihre KUBECONFIG-Umgebungsvariable definiert ist. Der Standardwert ist ~/.kube/conf.

Es gibt zwei Optionen, wenn Sie auf Pods mit Namespace verweisen. Sie können entweder das Standard-Flag –namespace example-namespace hinzufügen oder einen vollständigen Pod-Pfad in Ihrer Dateisystemreferenz verwenden:

kubectl cp example-namespace/example-pod:/tmp/example-dir ./example-dir < p>Dateiattribute werden standardmäßig beibehalten. Fügen Sie Ihrem cp-Befehl das Flag –no-preserve hinzu, um Eigentums- und Berechtigungsdaten von den kopierten Dateien zu entfernen, die am Ziel verbleiben. Im Gegensatz zu regulärem Unix-cp ist die Implementierung von Kubectl immer rekursiv, sodass das Verweisen auf ein Verzeichnis auch dessen Inhalt einschließt.

Wenn Kubectl-Cp gewonnen hat&#8217 ;t Work

kubectl cp hat eine große Einschränkung: 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 die tar-Binärdatei in seinem Pfad enthalten, damit dies funktioniert.

Dies bedeutet, dass kubectl cp möglicherweise nicht immer eine Option ist, wenn Sie die Best Practices von Docker befolgen, um Images klein zu halten. Obwohl beliebte Minimalbasen wie Alpine Teer enthalten, ist es möglicherweise nicht in jedem Bild enthalten und wird nicht vorhanden sein, wenn Sie sie von Grund auf neu zusammensetzen.

Werbung

Die Verwendung von tar schränkt auch ein, was kubectl cp kopieren kann. Sie können keine Symlinks auflösen oder Platzhalter wie /tmp/*.log verwenden. Wenn diese Funktion benötigt wird, müssen Sie einen anderen Ansatz wählen.

Eine Möglichkeit besteht darin, kubectl exec, den Befehl cat und die Shell-Umleitung zu kombinieren, um den Inhalt einer Datei aus dem Cluster in eine lokale Datei zu streamen:

kubectl exec –namespace example-namespace example- pod -c zweiter Container — ​​cat /tmp/example-file > local-file

Der Befehl kubectl exec startet eine Shell-Sitzung im Pod. Alles nach dem — wird innerhalb des Containers ausgeführt. Die Ausgabe des Aufrufs von cat für die 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 es wagen, können Sie SSH in Ihrem Container installieren und mit scp von Ihrem Host aus auf das Dateisystem zugreifen. Dies würde Ihnen ein vollständiges Kopiererlebnis auf Kosten der Ausführung eines zusätzlichen Daemons und der Schaffung eines potenziellen Sicherheitsproblems verschaffen. Es sollte nur auf ordnungsgemäß geschützten Clustern in Betracht gezogen werden.

Das Hinzufügen von tar zu Ihren Container-Images ist eine viel sicherere Option. Auf diese Weise können Sie kubectl cp verwenden und das erweiterte manuelle Kopieren über kubectl exec freischalten, wenn Sie zusätzliche Funktionen benötigen. Wenn Sie bei der cp-Syntax auf Einschränkungen stoßen, rufen Sie tar direkt über kubectl exec auf, um dem Befehl zusätzliche Flags hinzuzufügen:

kubectl exec –namespace example-namespace example-pod -c zweiter-container — ​​tar -cf /tmp/example-dir | tar xf – -C ./extracted-dir Werbung

Dies führt tar -cF in Ihrem Container aus und leitet das Ergebnis an den tar xf-Extraktionsbefehl auf Ihrem lokalen Computer weiter. Das – weist tar an, die ihm über den Standardeingabestrom zugeführten Daten zu extrahieren. -C wird verwendet, um ein Zielverzeichnis anzugeben.

Zusammenfassung

Mit dem Befehl kubectl cp können Sie Dateien zwischen Kubernetes-Pods und Ihrem Computer kopieren. Es funktioniert in beide Richtungen, kann jedoch 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 zu Pod B kopieren.

Da cp auf Tar-Unter- the-hood müssen Sie sicherstellen, dass Ihr Container-Image es enthält. Wenn Sie versuchen, cp für einen Pod ohne tar auszuführen, wird der Fehler Keine solche Datei oder das Verzeichnis tar angezeigt. Fügen Sie in dieser Situation entweder dem Container tar hinzu oder verwenden Sie eine Kombination aus kubectl exec und cat, wenn Sie nur einige Dateien abrufen müssen.