Bestanden kopiëren tussen Kubernetes-pods en uw machine

0
184

Containers die in Kubernetes-pods worden uitgevoerd, zijn bedoeld als zelfstandige rekeneenheden die u hoeft niet handmatig te communiceren met. Soms moet u echter bestanden kopiëren van of naar het bestandssysteem van een Pod, misschien omdat u een probleem oplost en logs, configuratiebestanden of caches die in een container zijn opgeslagen, wilt archiveren.

< p>Hier leest u hoe u bestanden verplaatst tussen uw machine en containers in een pod, met behulp van de ingebouwde overdrachtsfunctie van Kubectl of een handmatig alternatief.

Kopiëren van of naar uw computer

Het kubectl cp-commando is de eenvoudigste manier om van of naar een containerbestandssysteem te kopiëren. Het werkt op dezelfde manier als de docker cp die u misschien al kent van lokale containerontwikkeling.

kubectl cp vereist bron- en bestemmingsargumenten. Een van de bronnen of bestemmingen moet een Pod-referentie zijn. Dit is opgemaakt als de Pod-naam, gevolgd door een dubbele punt en het pad naar het bestandssysteem in de container.

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

Dit voorbeeld kopieert de inhoud van /tmp/example-dir van voorbeeld-pod naar voorbeeld-dir op uw lokale bestandssysteem. Als u de argumenten omdraait, wordt de voorbeeldmap van uw machine terug naar de pod gekopieerd.

Opdrachtargumenten

Omdat een enkele pod meerdere containers kan bevatten, is het belangrijk hier rekening mee te houden bij het gebruik van cp. Kubernetes kopieert standaard naar of van de eerste containerinstantie in de pod. U kunt in plaats daarvan een specifieke container targeten door de vlag -c toe te voegen:

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

Net als alle andere kubectl-opdrachten, wordt cp uitgevoerd tegen de clusterverbinding die is gedefinieerd door uw KUBECONFIG-omgevingsvariabele. Dit is standaard ~/.kube/conf.

Er zijn twee opties als je verwijst naar pods met naamruimte. Je kunt ofwel de standaard –namespace example-namespace vlag toevoegen of een volledig Pod-pad gebruiken in je bestandssysteemreferentie:

kubectl cp example-namespace/example-pod:/tmp/example-dir ./example-dir < p>Bestandskenmerken blijven standaard behouden. Voeg de vlag –no-preserve toe aan uw cp-opdracht om eigendoms- en machtigingsgegevens te verwijderen van de gekopieerde bestanden die op de bestemming zijn achtergelaten. In tegenstelling tot gewone Unix cp, is de implementatie van Kubectl altijd recursief, dus het verwijzen naar een map bevat ook de inhoud ervan.

When Kubectl Cp Won&#8217 ;t Work

kubectl cp wordt geleverd met één groot voorbehoud: intern is het een eenvoudige wikkel rond teer. De opdracht comprimeert het bronpad, kopieert het archief naar de bestemming en extraheert vervolgens de inhoud. Uw containerafbeelding moet het tar-binaire bestand in zijn pad bevatten om dit te laten werken.

Dit betekent dat kubectl cp niet altijd een optie is als je Docker-best practices volgt om afbeeldingen klein te houden. Hoewel populaire minimale basen zoals alpine teer bevatten, komt het misschien niet voor in elke afbeelding en zal het niet aanwezig zijn als je ze helemaal opnieuw in elkaar zet.

Advertentie

Het gebruik van tar beperkt ook wat kubectl cp kan kopiëren. U kunt symlinks niet oplossen of jokertekens gebruiken zoals /tmp/*.log. U zult een andere benadering moeten gebruiken wanneer deze functionaliteit nodig is.

Een optie is om kubectl exec, het cat-commando en shell-omleiding te combineren om de inhoud van een bestand uit het cluster en naar een lokaal bestand te streamen:

kubectl exec –namespace example-namespace example- pod -c second-container — ​​cat /tmp/voorbeeldbestand > local-file

De opdracht kubectl exec start een shell-sessie in de Pod. Alles na de — wordt in de container uitgevoerd. De uitvoer van het aanroepen van cat op het bestand wordt naar uw terminal gestuurd, waar het kan worden omgeleid naar een lokaal bestand.

Deze techniek is geschikt wanneer u een handvol relatief kleine bestanden kopieert. Het zou al snel vervelend worden als u een grote directory moest ophalen. Helaas is er geen beter alternatief zonder extra software aan uw container toe te voegen.

Als je durft, zou je SSH in je container kunnen installeren en scp gebruiken om vanaf je host toegang te krijgen tot het bestandssysteem. Dit zou u een complete kopieerervaring geven ten koste van het uitvoeren van een extra daemon en het creëren van een mogelijk beveiligingsprobleem. Het zou alleen moeten worden overwogen op correct beveiligde clusters.

Teer toevoegen aan uw containerafbeeldingen is een veel veiligere optie. Hierdoor kunt u kubectl cp gebruiken en ontgrendelt u meer geavanceerd handmatig kopiëren via kubectl exec wanneer u extra functionaliteit nodig heeft. Als je beperkingen tegenkomt met de cp-syntaxis, roep dan tar rechtstreeks aan via kubectl exec om extra vlaggen aan de opdracht toe te voegen:

kubectl exec –naamruimte voorbeeldnaamruimte voorbeeld-pod -c tweede-container — ​​tar -cf /tmp/voorbeeld-map | tar xf – -C ./extracted-dir Advertentie

Hiermee wordt tar -cF in uw container uitgevoerd en wordt het resultaat doorgestuurd naar de tar xf-extractieopdracht op uw lokale computer. De – instrueert tar om de gegevens die eraan worden toegevoerd te extraheren via de standaard invoerstroom. -C wordt gebruikt om een ​​doelmap op te geven.

Samenvatting

Met de opdracht kubectl cp kunt u bestanden kopiëren tussen Kubernetes Pods en uw machine. Het werkt in beide richtingen, maar kan niet worden gebruikt om bestanden van Pod naar Pod te verplaatsen. Als u dat moet doen, kunt u het beste een procedure in twee fasen gebruiken, waarbij u eerst kopieert van Pod A naar uw machine en vervolgens naar Pod B.

Omdat cp afhankelijk is van teer onder- the-hood, moet u ervoor zorgen dat uw containerafbeelding deze bevat. U ziet de foutmelding No such file or directory tar als u cp probeert uit te voeren op een pod zonder tar. In deze situatie voegt u ofwel tar toe aan de container of gebruikt u een combinatie van kubectl exec en cat als u maar een paar bestanden hoeft op te halen.