web-dev-qa-db-fra.com

Besoin d'une explication de Kubectrector stdin et de pipe

Je suis un utilisateur quotidien de kubectl, mais pas d'expert de Linux. Récemment, j'ai besoin d'éditer un type de service après le déploiement, ainsi recherché et utilisé kubectl remplacer et cela a bien fonctionné.

cat yaml | kubectl replace -f -

service/tracs-pool-1sv replaced

Mais je ne comprends pas pourquoi ajouter un tiret court - à la dernière. Le doc ne dit que:

Remplacez une pod basée sur le JSON transmis dans STDIN.

J'ai cherché et trouvé this SO QUESTION ET SIMITE LE COMMANDE KUBECTL peut s'agir de ce type de commande ne lit pas stdin (Est-ce que je suis raison?).

J'ai essayé

cat yaml |xargs kubectl replace -f

mais l'erreur est retournée:

the path "apiVersion:" does not exist

Ainsi, la syntaxe de bout à bout court (-) conçue pour Kubectl [~ # ~] uniquement [~ # ~] ? Ou est-ce qu'un peu plus commun Syntaxe de la tuyau de stdin Linux Bash? Quelqu'un peut-il expliquer pourquoi Xargs ne fonctionne pas ici et je dois placer une courte pointe (-) à la fin?

10
Lei Yang

C'est une convention raisonnablement courante, mais pas universelle, UN * X. (Il est mentionné dans la spécification POSIX et la plupart des non-Linux le soutiendront également.)

Le détail important ici est que le kubectl ... -f L'option attend A nom de fichier. Si vous avez un fichier nommé x.yaml, une voie plus directe d'écrire ce que vous avez montré est juste

kubectl replace -f x.yaml

Où vous dites -f -, cela signifie ostensiblement "un fichier nommé - ", mais kubectl (avec de nombreux autres outils) interprète cela pour signifier" l'entrée standard du processus ". Par exemple, vous pouvez l'utiliser pour un système de modèles très léger, comme

sed 's/TAG/1.2.3-20190103/g' x.yaml | kubectl replace -f -

Pour l'outillage de l'ONU * X en général, POSIX.1 états que, pour de nombreuses commandes,

... Un opérande nommant un fichier peut être spécifié comme "-", ce qui signifie utiliser l'entrée standard au lieu d'un fichier nommé ....

Certaines commandes qui supportent cet incluent CAT , GREP , tri et goudron (non requis par POSIX). Une façon de déplacer une arborescence de répertoires entre deux machines Linux, par exemple, consiste à créer un fichier de goudron sur STDOUT, tuyau qui diffuse via SSH sur une machine distante, puis déballer le fichier de goudron de STDIN:

tar cf - . | ssh elsewhere tar xf - -C /other/dir

xargs est un outil qui convertit (le plus souvent) une liste de noms de fichiers sur les arguments de ligne standard aux arguments de la ligne de commande. Par exemple, Rechercher (1) peut imprimer une liste des noms de fichiers correspondants à son stdout, vous pouvez donc créer un pipeline pour supprimer des fichiers de sauvegarde shell comme

find . -name '*~' | xargs rm

Vous n'utiliseriez généralement pas cela avec Kubettes; Votre exemple tente de transmettre le contenu YAML lui-même en tant qu'arguments de ligne de commande à kubectl, par exemple. Vous pouvez appliquer kubectl sur un arbre de répertoire avec quelque chose comme

find . name '*.yaml' | xargs -n1 kubectl apply -f

mais depuis kubectl ... -f aussi prend en charge les noms de répertoires (pas une convention universelle), vous pouvez faire la même chose plus directement que

kubectl apply -f . # where . is the current directory
9
David Maze