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?
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