kubectl cp

Kopiuje pliki/katalogi między podem a maszyną lokalną.

kubectl cp kopiuje pliki i katalogi między podem w klastrze Kubernetes a Twoją maszyną lokalną — w obie strony. Przydaje się, gdy chcesz wyciągnąć log albo dump z działającego kontenera bez budowania nowego obrazu, albo wrzucić do poda jednorazowy plik konfiguracyjny do testów. Pod spodem to w zasadzie nakładka na tar przepuszczony przez kubectl exec, co ma kilka praktycznych konsekwencji, o których za chwilę.

Składnia i najważniejsze opcje

Podstawowa składnia: kubectl cp [opcje], gdzie ścieżka w podzie ma format namespace/pod:/sciezka (namespace możesz pominąć, jeśli używasz domyślnego).

  • -c, --container — wskazuje konkretny kontener w podzie; bez tego kubectl bierze pierwszy kontener (lub ten z adnotacji default-container).
  • -n, --namespace — ustawia namespace dla polecenia, alternatywnie do prefiksu w ścieżce.
  • --retries — liczba ponowień przy zerwanym kopiowaniu; domyślnie 0 (brak), wartość ujemna oznacza nieskończone próby.
  • --no-preserve — nie zachowuje właściciela ani uprawnień plików po stronie docelowej.

Przykłady użycia

  • kubectl cp moj-pod:/var/log/app.log ./app.log — pobiera log z poda na dysk lokalny.
  • kubectl cp ./config.yaml moj-pod:/etc/app/config.yaml — wrzuca lokalny plik do poda.
  • kubectl cp prod/moj-pod:/data/dump.sql ./dump.sql -c baza — kopiuje z konkretnego kontenera baza w namespace prod.
  • kubectl cp ./katalog moj-pod:/tmp/katalog — kopiuje cały katalog rekurencyjnie.
  • kubectl cp moj-pod:/data ./backup --retries=-1 — pobiera duży katalog z nieskończonym ponawianiem przy zerwaniu połączenia.

Częste błędy i pułapki

Najczęstsza wpadka: kontener musi mieć w sobie binarkę tar. Obrazy typu scratch, distroless czy minimalne Alpine bez doinstalowanego tar sprawią, że kubectl cp po prostu padnie — wtedy ratuje się np. kubectl exec ... -- cat plik > lokalny.

Druga sprawa: ścieżek w podzie nie podaje się ze schematem hosta — separatorem między podem a ścieżką jest dwukropek, więc moj-pod:/tmp, a nie moj-pod /tmp. Pamiętaj też, że ścieżki absolutne zaczynające się od / liczą się od korzenia kontenera, a względne — od katalogu roboczego procesu, co bywa mylące. Przy bardzo dużych transferach licz się z zerwaniami i ustaw --retries.

Powiązane komendy: kubectl exec, kubectl logs, kubectl get pods, scp, docker cp.