Как копировать файлы между модулями Kubernetes и вашей машиной
Контейнеры, работающие в модулях Kubernetes, должны быть автономными вычислительными единицами, с которыми вам не нужно взаимодействовать вручную. Однако иногда вам может потребоваться копировать файлы в файловую систему пода или из нее, возможно, потому, что вы отлаживаете проблему и хотите заархивировать журналы, файлы конфигурации или кэши, хранящиеся в контейнере.
Вот как можно перемещать файлы между вашим компьютером и контейнерами в поде, используя встроенную функцию передачи Kubectl или ручную альтернативу.
Копирование на ваш компьютер или с него
Команда kubectl cp
— это самый простой способ копирования в файловую систему контейнера или из нее. Он работает аналогично docker cp
, с которым вы, возможно, уже знакомы по разработке локальных контейнеров.
kubectl cp
требует исходного и целевого аргументов. Один из источников или адресатов должен быть ссылкой на Pod. Форматируется как имя пода, за которым следует двоеточие и путь к файловой системе внутри контейнера.
kubectl cp example-pod:/tmp/example-dir ./example-dir
В этом примере содержимое /tmp/example-dir
копируется из example-pod
в example-dir
в вашей локальной файловой системе. Если аргументы поменять местами, example-dir
вашего компьютера скопируется обратно в модуль.
Аргументы команды
Поскольку один под может содержать несколько контейнеров, важно помнить об этом при использовании cp
. Kubernetes по умолчанию будет копировать в или из первого экземпляра контейнера в поде. Вместо этого вы можете настроить таргетинг на конкретный контейнер, добавив флаг -c
:
kubectl cp example-pod:/tmp/example-dir ./example-dir -c second-container
Как и все другие команды kubectl
, cp
работает с подключением к кластеру, определенным вашей переменной среды KUBECONFIG
. По умолчанию это ~/.kube/conf
.
Есть два варианта, когда вы ссылаетесь на модули с пространством имен. Вы можете либо добавить стандартный флаг --namespace example-namespace
, либо использовать полный путь пода в ссылке на вашу файловую систему:
kubectl cp example-namespace/example-pod:/tmp/example-dir ./example-dir
Атрибуты файла сохраняются по умолчанию. Добавьте флаг --no-preserve
в команду cp
, чтобы удалить данные о владельце и разрешениях из скопированных файлов, оставшихся в месте назначения. В отличие от обычного Unix cp
, реализация Kubectl всегда рекурсивна, поэтому ссылка на каталог также будет включать его содержимое.
Когда Kubectl Cp не работает
kubectl cp
поставляется с одной большой оговоркой: внутри это простая оболочка вокруг tar
. Команда сожмет исходный путь, скопирует архив в место назначения, а затем извлечет его содержимое. Ваш образ контейнера должен включать в себя двоичный файл tar
, чтобы это работало.
Это означает, что kubectl cp
не всегда подходит, если вы следуете рекомендациям Docker по уменьшению размера изображений. Хотя популярные минимальные базы, такие как alpine
, включают tar
, он может не присутствовать в каждом образе и не будет присутствовать, если вы собираете их с нуля.
Использование tar
также ограничивает возможности копирования kubectl cp
. Вы не можете разрешать символические ссылки или использовать подстановочные знаки, такие как /tmp/*.log
. Вам придется использовать другой подход, когда эта функциональность необходима.
Один из вариантов — объединить kubectl exec
, команду cat
и перенаправление оболочки для потоковой передачи содержимого файла из кластера в локальный файл:
kubectl exec --namespace example-namespace example-pod -c second-container -- cat /tmp/example-file > local-file
Команда kubectl exec
запускает сеанс оболочки в модуле. Все после --
запускается внутри контейнера. Вывод вызова cat
в файле будет отправлен на ваш терминал, где его можно будет перенаправить в локальный файл.
Этот метод подходит, когда вы копируете несколько относительно небольших файлов. Это быстро станет утомительным, если вам нужно получить большой каталог. К сожалению, нет лучшей альтернативы без добавления дополнительного программного обеспечения в ваш контейнер.
Если вы чувствуете себя смелым, вы можете установить SSH в свой контейнер и использовать scp
для доступа к его файловой системе с вашего хоста. Это даст вам полный опыт копирования за счет запуска дополнительного демона и создания потенциальной проблемы безопасности. Его следует рассматривать только на должным образом защищенных кластерах.
Добавление tar
в ваши образы контейнеров — гораздо более безопасный вариант. Это позволяет вам использовать kubectl cp
и открывает доступ к более продвинутому ручному копированию с помощью kubectl exec
, когда вам нужны дополнительные функции. Если вы столкнулись с ограничениями в синтаксисе cp
, вызовите tar
напрямую через kubectl exec
, чтобы добавить в команду дополнительные флаги:
kubectl exec --namespace example-namespace example-pod -c second-container -- tar -cf /tmp/example-dir | tar xf - -C ./extracted-dir
Это запускает tar -cF
внутри вашего контейнера и передает результат команде извлечения tar xf
на вашем локальном компьютере. -
инструктирует tar
извлечь данные, переданные ему через стандартный входной поток. -C
используется для указания каталога назначения.
Краткое содержание
Команда kubectl cp
позволяет копировать файлы между модулями Kubernetes и вашим компьютером. Он работает в любом направлении, но его нельзя использовать для перемещения файлов из модуля в модуль. Если вам нужно это сделать, лучше всего использовать двухэтапную процедуру, копируя сначала из модуля A на ваш компьютер, а затем в модуль B.
Поскольку cp
использует tar
под капотом, вам необходимо убедиться, что ваш образ контейнера включает его. Вы увидите ошибку Нет такого файла или каталога tar
, если попытаетесь запустить cp
для модуля без tar
. В этой ситуации либо добавьте tar
в контейнер, либо используйте комбинацию kubectl exec
и cat
, если вам нужно получить только несколько файлов.