Les conteneurs exécutés dans les pods Kubernetes sont censés être des unités de calcul autonomes avec lesquelles vous n'avez pas besoin d'interagir manuellement. Parfois, vous devrez peut-être copier des fichiers vers ou depuis le système de fichiers d'un pod, peut-être parce que vous déboguez un problème et que vous souhaitez archiver les journaux, les fichiers de configuration ou les caches stockés dans un conteneur.
Voici comment déplacer des fichiers entre votre machine et les conteneurs d'un pod, à l'aide de la fonction de transfert intégrée de Kubectl ou d'une alternative manuelle.
Copier vers ou depuis votre machine
Le kubectl cp
La commande est le moyen le plus simple de copier vers ou depuis un système de fichiers conteneur. Cela fonctionne de la même manière que le docker cp
vous êtes peut-être déjà familiarisé avec le développement de conteneurs locaux.
kubectl cp
nécessite des arguments source et destination. L'une des sources ou des destinations doit être une référence de pod. Il est formaté comme le nom du pod, suivi de deux-points et du chemin du système de fichiers dans le conteneur.
kubectl cp example-pod:/tmp/example-dir ./example-dir
Cet exemple copie le contenu de /tmp/example-dir
de example-pod
vers example-dir
sur votre système de fichiers local. Inverser les arguments copierait le example-dir
de votre machine retour au pod.
Arguments de la commande
Comme un seul pod peut contenir plusieurs conteneurs, il est important de garder cela à l'esprit lors de l'utilisation de cp
. Kubernetes copiera par défaut vers ou depuis la première instance de conteneur dans le pod. Vous pouvez cibler un conteneur spécifique à la place en ajoutant le -c
drapeau :
kubectl cp example-pod:/tmp/example-dir ./example-dir -c second-container
Comme tous les autres kubectl
commandes, cp
s'exécute sur la connexion de cluster définie par votre KUBECONFIG
variables d'environnement. Par défaut, c'est ~/.kube/conf
.
Il existe deux options lorsque vous faites référence à des pods avec espace de noms. Vous pouvez soit ajouter le standard --namespace example-namespace
indicateur ou utilisez un chemin d'accès complet au pod dans votre référence de système de fichiers :
kubectl cp example-namespace/example-pod:/tmp/example-dir ./example-dir
Les attributs de fichier sont conservés par défaut. Ajoutez le --no-preserve
indicateur à votre cp
commande pour supprimer les données de propriété et d'autorisations des fichiers copiés laissés à la destination. Contrairement à Unix classique cp
, l'implémentation de Kubectl est toujours récursive, donc le référencement d'un répertoire inclura également son contenu.
Quand Kubectl Cp ne fonctionnera pas
kubectl cp
vient avec une grosse mise en garde :en interne, c'est un simple wrapper autour de tar
. La commande compressera le chemin source, copiera l'archive vers la destination, puis extraira son contenu. Votre image de conteneur doit inclure le tar
binaire dans son chemin pour que cela fonctionne.
Cela signifie kubectl cp
peut ne pas toujours être une option lorsque vous suivez les meilleures pratiques Docker pour garder les images petites. Bien que les bases minimales populaires telles que alpine
incluez tar
, il peut ne pas figurer dans toutes les images et ne sera pas présent si vous les assemblez à partir de zéro.
L'utilisation de tar
limite également ce que kubectl cp
peut copier. Vous ne pouvez pas résoudre les liens symboliques ou utiliser des caractères génériques comme /tmp/*.log
. Vous devrez utiliser une approche différente lorsque cette fonctionnalité sera nécessaire.
Une option consiste à combiner kubectl exec
, le cat
commande et redirection du shell pour diffuser le contenu d'un fichier hors du cluster et dans un fichier local :
kubectl exec --namespace example-namespace example-pod -c second-container -- cat /tmp/example-file > local-file
Le kubectl exec
La commande démarre une session shell dans le pod. Tout après le --
est exécuté à l'intérieur du conteneur. La sortie de l'appel de cat
sur le fichier sera émis vers votre terminal où il pourra être redirigé vers un fichier local.
Cette technique convient lorsque vous copiez une poignée de fichiers relativement petits. Cela deviendrait vite fastidieux si vous aviez besoin de récupérer un répertoire volumineux. Malheureusement, il n'y a pas de meilleure alternative sans ajouter de logiciel supplémentaire à votre conteneur.
Si vous vous sentez audacieux, vous pouvez installer SSH dans votre conteneur et utiliser scp
pour accéder à son système de fichiers depuis votre hôte. Cela vous donnerait une expérience de copie complète au détriment de l'exécution d'un démon supplémentaire et de la création d'un problème de sécurité potentiel. Il ne doit être envisagé que sur des clusters correctement protégés.
Ajout de tar
à vos images de conteneur est une option beaucoup plus sûre. Cela vous permet d'utiliser kubectl cp
et débloque une copie manuelle plus avancée via kubectl exec
lorsque vous avez besoin de fonctionnalités supplémentaires. Si vous rencontrez des limitations avec le cp
syntaxe, appelez tar
directement via kubectl exec
pour ajouter des drapeaux supplémentaires à la commande :
kubectl exec --namespace example-namespace example-pod -c second-container -- tar -cf /tmp/example-dir | tar xf - -C ./extracted-dir
Cela exécute tar -cF
à l'intérieur de votre conteneur et dirige le résultat vers le tar xf
commande d'extraction sur votre machine locale. Le -
ordonne à tar
pour extraire les données qui lui sont transmises via le flux d'entrée standard. -C
est utilisé pour spécifier un répertoire de destination.
Résumé
Le kubectl cp
La commande vous permet de copier des fichiers entre les pods Kubernetes et votre machine. Il fonctionne dans les deux sens mais ne peut pas être utilisé pour déplacer des fichiers d'un pod à l'autre. Si vous devez le faire, il est préférable d'utiliser une procédure en deux étapes, en copiant d'abord du pod A vers votre machine, puis vers le pod B.
Comme cp
repose sur tar
sous le capot, vous devez vous assurer que votre image de conteneur l'inclut. Vous verrez un No such file or directory tar
erreur si vous essayez d'exécuter cp
contre un pod sans tar
. Dans cette situation, soit ajouter tar
au conteneur ou utilisez une combinaison de kubectl exec
et cat
si vous n'avez besoin de récupérer que quelques fichiers.