Kontejnery běžící v Kubernetes Pods mají být samostatné výpočetní jednotky, se kterými nemusíte ručně pracovat. Někdy však možná budete muset kopírovat soubory do nebo ze souborového systému podu, možná proto, že řešíte problém a chcete archivovat protokoly, konfigurační soubory nebo mezipaměti uložené v kontejneru.
Zde je návod, jak přesouvat soubory mezi vaším strojem a kontejnery v podu pomocí vestavěné funkce přenosu Kubectl nebo manuální alternativy.
Kopírování do nebo z vašeho počítače
kubectl cp
příkaz je nejjednodušší způsob kopírování do nebo z kontejnerového souborového systému. Funguje podobně jako docker cp
možná již znáte z vývoje místních kontejnerů.
kubectl cp
vyžaduje zdrojové a cílové argumenty. Jedním ze zdrojů nebo cílů musí být reference pod. Toto je formátováno jako název podu, za nímž následuje dvojtečka a cesta k souborovému systému v kontejneru.
kubectl cp example-pod:/tmp/example-dir ./example-dir
Tento příklad zkopíruje obsah /tmp/example-dir
z example-pod
do example-dir
na vašem místním souborovém systému. Obrácení argumentů by zkopírovalo example-dir
vašeho počítače zpět do modulu.
Argumenty příkazu
Vzhledem k tomu, že jeden pod pojme více nádob, je důležité na to pamatovat při používání cp
. Kubernetes bude ve výchozím nastavení kopírovat do nebo z první instance kontejneru v Podu. Místo toho můžete cílit na konkrétní kontejner přidáním -c
příznak:
kubectl cp example-pod:/tmp/example-dir ./example-dir -c second-container
Stejně jako všechny ostatní kubectl
příkazy, cp
běží proti připojení clusteru definovanému vaším KUBECONFIG
proměnná prostředí. Toto výchozí nastavení je ~/.kube/conf
.
Když odkazujete na moduly s jmenným prostorem, existují dvě možnosti. Můžete přidat standardní --namespace example-namespace
příznak nebo použijte úplnou cestu pod v odkazu na váš souborový systém:
kubectl cp example-namespace/example-pod:/tmp/example-dir ./example-dir
Atributy souboru jsou ve výchozím nastavení zachovány. Přidejte --no-preserve
příznak k vašemu cp
příkaz k odstranění dat vlastnictví a oprávnění z kopírovaných souborů ponechaných v cíli. Na rozdíl od běžného Unixu cp
, Kubectlova implementace je vždy rekurzivní, takže odkazování na adresář bude zahrnovat i jeho obsah.
Když Kubectl Cp nebude fungovat
kubectl cp
přichází s jedním velkým upozorněním:interně je to jednoduchý obal kolem tar
. Příkaz zkomprimuje zdrojovou cestu, zkopíruje archiv do cíle a poté extrahuje jeho obsah. Obrázek kontejneru musí obsahovat tar
binární na své cestě, aby to fungovalo.
To znamená kubectl cp
nemusí být vždy možností, když dodržujete doporučené postupy Dockeru, aby byly obrázky malé. Ačkoli populární minimální základny takový jako alpine
zahrňte tar
, nemusí se objevit na každém obrázku a nebude přítomen, pokud je sestavujete od začátku.
Použití tar
také omezuje to, co kubectl cp
umí kopírovat. Nemůžete překládat symbolické odkazy ani používat zástupné znaky jako /tmp/*.log
. Budete-li tuto funkci potřebovat, budete muset použít jiný přístup.
Jednou z možností je zkombinovat kubectl exec
, cat
příkaz a přesměrování shellu pro streamování obsahu souboru z clusteru do místního souboru:
kubectl exec --namespace example-namespace example-pod -c second-container -- cat /tmp/example-file > local-file
kubectl exec
příkaz spustí relaci shellu v modulu. Vše za --
běží uvnitř kontejneru. Výstup volání cat
na souboru bude odeslán do vašeho terminálu, kde může být přesměrován do místního souboru.
Tato technika je vhodná, když kopírujete několik relativně malých souborů. Bylo by rychle únavné, pokud byste potřebovali získat velký adresář. Bohužel neexistuje lepší alternativa bez přidání dalšího softwaru do vašeho kontejneru.
Pokud si troufáte, můžete si do kontejneru nainstalovat SSH a použít scp
pro přístup k jeho souborovému systému z vašeho hostitele. To by vám poskytlo kompletní zážitek z kopírování na úkor spuštění dalšího démona a vytvoření potenciálního bezpečnostního problému. Mělo by být zvažováno pouze u řádně chráněných clusterů.
Přidání tar
do obrázků kontejneru je mnohem bezpečnější možnost. To vám umožní používat kubectl cp
a odemkne pokročilejší ruční kopírování pomocí kubectl exec
když potřebujete další funkce. Pokud narazíte na omezení s cp
syntaxe, vyvolejte tar
přímo přes kubectl exec
pro přidání dalších příznaků k příkazu:
kubectl exec --namespace example-namespace example-pod -c second-container -- tar -cf /tmp/example-dir | tar xf - -C ./extracted-dir
Tím se spustí tar -cF
uvnitř vašeho kontejneru a přenese výsledek do tar xf
příkaz extrakce na vašem místním počítači. -
dává pokyn tar
extrahovat data, která jsou do něj přiváděna prostřednictvím standardního vstupního toku. -C
se používá k určení cílového adresáře.
Přehled
kubectl cp
umožňuje kopírovat soubory mezi Kubernetes Pods a vaším počítačem. Funguje v obou směrech, ale nelze jej použít k přesunutí souborů z modulu do modulu. Pokud to potřebujete udělat, je nejlepší použít dvoufázový postup, zkopírujte nejprve z bloku A do vašeho zařízení a poté dále do bloku B.
Jako cp
spoléhá na tar
pod kapotou, musíte se ujistit, že je obsahuje obrázek kontejneru. Uvidíte No such file or directory tar
chyba při pokusu o spuštění cp
proti podu bez tar
. V této situaci buď přidejte tar
do kontejneru nebo použijte kombinaci kubectl exec
a cat
pokud potřebujete načíst pouze několik souborů.