Comment copier des fichiers entre les pods Kubernetes et votre machine

0
839

Les conteneurs exécutés dans les pods Kubernetes sont censés être des unités de calcul autonomes dont vous n'avez pas besoin pour interagir manuellement avec. 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.

< p>Voici comment déplacer des fichiers entre votre machine et des conteneurs dans un Pod, en utilisant la fonction de transfert intégrée de Kubectl ou une alternative manuelle.

Copie vers ou depuis votre machine

La commande kubectl cp est le moyen le plus simple de copier vers ou depuis un système de fichiers conteneur. Il fonctionne de la même manière que le docker cp que vous connaissez peut-être déjà depuis le développement de conteneurs locaux.

kubectl cp requiert des arguments source et destination. L'une des sources ou des destinations doit être une référence de pod. Il s'agit du 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 à example-dir sur votre système de fichiers local. Inverser les arguments recopierait le répertoire d'exemple de votre machine dans le pod.

Arguments de commande

Comme un seul pod peut contenir plusieurs conteneurs, il est important de garder cela à l'esprit lors de l'utilisation de cp. Kubernetes effectuera par défaut une copie vers ou depuis la première instance de conteneur dans le pod. Vous pouvez plutôt cibler un conteneur spécifique en ajoutant l'indicateur -c :

kubectl cp example-pod:/tmp/example-dir ./example-dir -c second-container Advertisement

Comme toutes les autres commandes kubectl, cp s'exécute sur la connexion de cluster définie par votre variable d'environnement KUBECONFIG. La valeur par défaut est ~/.kube/conf.

Il existe deux options lorsque vous référencez des pods avec espace de noms. Vous pouvez soit ajouter l'indicateur standard –namespace example-namespace, soit utiliser un chemin de pod complet dans votre référence de système de fichiers :

kubectl cp example-namespace/example-pod:/tmp/example-dir ./example-dir < p>Les attributs de fichier sont conservés par défaut. Ajoutez l'indicateur –no-preserve à votre commande cp pour supprimer les données de propriété et d'autorisation des fichiers copiés laissés à la destination. Contrairement au cp Unix ordinaire, l'implémentation de Kubectl’s est toujours récursive, donc le référencement d'un répertoire inclura également son contenu.

Quand Kubectl Cp Won’ ;t Work

kubectl cp est livré avec une grande mise en garde : en interne, il s'agit d'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 binaire tar dans son chemin pour que cela fonctionne.

Cela signifie que kubectl cp peut ne pas toujours être une option lorsque vous suivez les meilleures pratiques de Docker pour garder les images petites. Bien que les bases minimales populaires telles que alpine incluent du goudron, il peut ne pas figurer dans toutes les images et ne sera pas présent si vous les assemblez à partir de zéro.

Publicité

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é est nécessaire.

Une option consiste à combiner kubectl exec, la commande cat et la 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-conteneur — ​​cat /tmp/example-file > local-file

La commande kubectl exec démarre une session shell dans le Pod. Tout ce qui suit le — est exécuté à l'intérieur du conteneur. La sortie de l'appel de cat sur le fichier sera émise vers votre terminal où elle pourra être redirigée vers un fichier local.

Cette technique convient lorsque vous copiez une poignée de fichiers relativement petits. Cela deviendrait vite fastidieux si vous deviez récupérer un répertoire volumineux. Malheureusement, il n'y a pas de meilleure alternative sans ajouter un 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. Cela ne doit être envisagé que sur des clusters correctement protégés.

Ajouter du tar à vos images de conteneur est une option beaucoup plus sûre. Cela vous permet d'utiliser kubectl cp et déverrouille une copie manuelle plus avancée via kubectl exec lorsque vous avez besoin de fonctionnalités supplémentaires. Si vous rencontrez des limitations avec la syntaxe cp, appelez tar directement via kubectl exec pour ajouter des indicateurs supplémentaires à la commande :

kubectl exec –namespace example-namespace example-pod -c second-container — ​​tar -cf /tmp/example-dir | tar xf – -C ./extracted-dir Publicité

Ceci exécute tar -cF à l'intérieur de votre conteneur et dirige le résultat vers la commande d'extraction tar xf sur votre machine locale. Le – indique à tar d'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é

La commande kubectl cp 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 à un 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 s'appuie sur tar under- the-hood, vous devez vous assurer que votre image de conteneur l'inclut. Vous verrez une erreur Aucun fichier ou répertoire tar si vous essayez d'exécuter cp sur un Pod sans tar. Dans cette situation, ajoutez tar au conteneur ou utilisez une combinaison de kubectl exec et cat si vous n'avez besoin que de récupérer quelques fichiers.