Поиск по сайту:

Как копировать файлы между модулями 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, если вам нужно получить только несколько файлов.