需要一些kubectl stdin和pipe的解释

时间:2019-01-04 02:13:37

标签: bash kubernetes pipe stdin kubectl

我是kubectl的日常用户,但不是Linux专家。最近,我需要在部署后编辑一些服务类型,因此搜索并使用了kubectl replace,它运行良好。

cat yaml | kubectl replace -f -

service/tracs-pool-1sv replaced

但是我不明白为什么最后要添加短划线 -。 该文档只说:

  

根据传入stdin的JSON替换广告连播。

我搜索并发现了this这样的问题,并且了解到的kubectl命令可能是不阅读stdin 的命令(对吗?)。

我尝试过

cat yaml |xargs kubectl replace -f

但返回错误:

the path "apiVersion:" does not exist

那么为kubectl ONLY 构建的短短破折号(-)语法是吗?还是Linux bash stdin管道的一些通用语法? 有人可以解释为什么xargs在这里不起作用,我必须在末尾加一个短破折号(-)吗?

1 个答案:

答案 0 :(得分:6)

这是一个合理的通用但非通用的Un * x约定。 (在POSIX规范中提到过,因此大多数非Linux Unices也将支持它。)

这里重要的细节是CREATE OR REPLACE FUNCTION sal_increase (p_salary f_emps.salary%TYPE, p_percent_incr NUMBER) RETURN NUMBER IS BEGIN RETURN (p_salary + (p_salary * p_percent_incr / 100)); END; SELECT last_name, salary, sal_increase(salary, 5) FROM f_emps; 选项需要一个文件名。如果您有一个名为kubectl ... -f的文件,那么写出所显示内容的一种更直接的方法就是

x.yaml

在您说kubectl replace -f x.yaml 的地方,表面上表示“名为-f -的文件”,但是-(以及许多其他工具)实际上将其解释为“流程的标准输入”。 。例如,您可以将其用于非常轻巧的模板系统,例如

kubectl

对于一般的Un * x工具,POSIX.1 states对于许多命令来说,

  

...可以将命名文件的操作数指定为'-',这意味着使用标准输入而不是命名文件。...

一些支持此功能的命令包括catgrepsort和tar(POSIX不需要)。例如,在两台Linux机器之间移动目录树的一种方法是在stdout上创建一个tar文件,通过ssh将流传输到远程机器,然后从stdin解压缩tar文件:

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

xargs是一种工具(通常)将标准输入中的文件名列表转换为命令行参数。例如,查找(1)可以将匹配的文件名列表打印到其stdout,因此您可以构建一个管道来删除shell备份文件,例如

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

您通常不会在Kubernetes上使用它;例如,您的示例尝试将YAML内容本身作为命令行参数传递给find . -name '*~' | xargs rm 。您可以在目录树上应用kubectl,例如

kubectl

但是由于find . name '*.yaml' | xargs -n1 kubectl apply -f 支持目录名(不是通用约定),因此您可以更直接地完成与

相同的操作
kubectl ... -f