Hur man kopierar filer mellan Kubernetes Pods och din maskin

0
179

Behållare som körs i Kubernetes Pods är avsedda att vara fristående beräkningsenheter som du behöver inte interagera manuellt med. Ibland kanske du måste kopiera filer till eller från en Pods filsystem, kanske för att du felsöker ett problem och vill arkivera loggar, konfigurationsfiler eller cacheminne som är lagrade i en behållare.

< p>Så här flyttar du filer mellan din maskin och behållare i en Pod, med Kubectls inbyggda överföringsfunktion eller ett manuellt alternativ.

Kopiera till eller från din maskin

Kommandot kubectl cp är det enklaste sättet att kopiera till eller från ett containerfilsystem. Det fungerar på samma sätt som docker-cp som du kanske redan känner till från lokal containerutveckling.

kubectl cp kräver käll- och destinationsargument. En av källorna eller destinationerna måste vara en Pod-referens. Detta formateras som Pod-namnet, följt av ett kolon och sökvägen till filsystemet i behållaren.

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

Det här exemplet kopierar innehållet i /tmp/example-dir från exempel-pod till exempel-dir på ditt lokala filsystem. Om du vänder på argumenten kopieras din maskins exempelkatalog tillbaka till Pod.

Kommandoargument

Eftersom en enda Pod kan innehålla flera behållare är det viktigt att ha detta i åtanke när du använder cp. Kubernetes kommer som standard att kopiera till eller från den första containerinstansen i podden. Du kan rikta in dig på en specifik behållare istället genom att lägga till flaggan -c:

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

Precis som alla andra kubectl-kommandon, körs cp mot klusteranslutningen som definieras av din KUBECONFIG-miljövariabel. Detta är som standard ~/.kube/conf.

Det finns två alternativ när du hänvisar till namnavgränsade Pods. Du kan antingen lägga till standardflaggan –namespace exempel-namnutrymme eller använda en fullständig Pod-sökväg i din filsystemreferens:

kubectl cp exempelnamnutrymme/exempel-pod:/tmp/exempel-dir ./exempel-dir < p>Filattribut bevaras som standard. Lägg till flaggan –no-preserve till ditt cp-kommando för att ta bort ägande- och behörighetsdata från de kopierade filerna som finns kvar på destinationen. Till skillnad från vanlig Unix cp är Kubectl’s implementering alltid rekursiv, så att referera till en katalog kommer också att inkludera dess innehåll.

När Kubectl Cp vann&#8217 ;t Work

kubectl cp kommer med en stor varning: internt är det en enkel omslag runt tjära. Kommandot kommer att komprimera källsökvägen, kopiera arkivet till destinationen och sedan extrahera dess innehåll. Din behållarbild måste inkludera tar-binären i sin sökväg för att detta ska fungera.

Det betyder att kubectl cp kanske inte alltid är ett alternativ när du följer Dockers bästa praxis för att hålla bilderna små. Även om populära minimala baser som alpin innehåller tjära, kanske det inte finns med i alla bilder och kommer inte att finnas om du monterar dem från grunden.

Annons

Användningen av tar begränsar också vad kubectl cp kan kopiera. Du kan inte lösa symboliska länkar eller använda jokertecken som /tmp/*.log. Du måste använda ett annat tillvägagångssätt när den här funktionen behövs.

Ett alternativ är att kombinera kubectl exec, cat-kommandot och skalomdirigering för att strömma en fils innehåll ut ur klustret och till en lokal fil:

kubectl exec –namespace exempel-namnutrymme exempel- pod -c andra behållare — ​​cat /tmp/exempelfil > local-file

Kommandot kubectl exec startar en skalsession i Podden. Allt efter — körs inuti behållaren. Utdata från calling cat på filen kommer att skickas till din terminal där den kan omdirigeras till en lokal fil.

Den här tekniken är lämplig när du kopierar en handfull relativt små filer. Det skulle snabbt bli tråkigt om du behövde hämta en stor katalog. Tyvärr finns det inget bättre alternativ utan att lägga till ytterligare programvara till din behållare.

Om du känner dig vågad kan du installera SSH i din behållare och använda scp för att komma åt dess filsystem från din värd. Detta skulle ge dig en komplett kopieringsupplevelse på bekostnad av att köra en extra demon och skapa ett potentiellt säkerhetsproblem. Det bör endast övervägas på korrekt skyddade kluster.

Att lägga till tar till dina behållarbilder är ett mycket säkrare alternativ. Detta låter dig använda kubectl cp och låser upp mer avancerad manuell kopiering via kubectl exec när du behöver extra funktionalitet. Om du stöter på begränsningar med cp-syntaxen, anropa tar direkt via kubectl exec för att lägga till extra flaggor till kommandot:

kubectl exec –namnutrymme exempel-namnutrymme exempel-pod -c andra behållare — ​​tar -cf /tmp/exempel-katalog | tar xf – -C ./extracted-dir Annons

Detta kör tar -cF inuti din behållare och skickar resultatet till tar xf-extraktionskommandot på din lokala dator. – instruerar tar att extrahera data som matas till den via standardinmatningsströmmen. -C används för att ange en målkatalog.

Sammanfattning

Kommandot kubectl cp låter dig kopiera filer mellan Kubernetes Pods och din maskin. Det fungerar i båda riktningarna men kan inte användas för att flytta filer från Pod till Pod. Om du behöver göra det är det bäst att använda en tvåstegsprocedur, kopiera först från Pod A till din maskin och sedan vidare till Pod B.

Eftersom cp förlitar sig på tjärunder- huven måste du se till att din behållarbild innehåller den. Du kommer att se felet Ingen sådan fil eller katalog tar-fel om du försöker köra cp mot en Pod utan tar. I den här situationen kan du antingen lägga till tar i behållaren eller använda en kombination av kubectl exec och cat om du bara behöver hämta några få filer.