作者:17114php | 来源:互联网 | 2022-11-22 18:28
我是kubectl的日常用户,但不是linux的专家.最近我需要在部署后编辑一些服务类型,所以搜索并使用kubectl 替换它并且运行良好.
cat yaml | kubectl replace -f -
service/tracs-pool-1sv replaced
但是我不明白为什么要在最后添加短划线 -
.该文件只说:
根据传入stdin的JSON替换pod.
我搜索并发现了这个问题,并且学到了kubectl命令可能是那种不读取标准输入的命令(我是对的吗?).
我试过了
cat yaml |xargs kubectl replace -f
但错误返回:
the path "apiVersion:" does not exist
所以是结束短破折号( - )语法kubectl内置ONLY?或者是linux bash stdin管道的一些更常见的语法?有人可以解释为什么xargs不能在这里工作,我必须在最后放一个短划线( - )?
1> David Maze..:
这是一个相当普遍但不通用的Un*x约定.(它在POSIX规范中提到,因此大多数非Linux Unices也会支持它.)
这里重要的细节是该kubectl ... -f
选项需要一个文件名.如果你有一个名为的文件x.yaml
,那么更直接的方式来编写你所展示的内容
kubectl replace -f x.yaml
你说的-f -
,表面上意味着"一个名为"的文件-
,但是kubectl
(以及许多其他工具)实际上将其解释为"过程的标准输入".例如,您可以将它用于非常轻量级的模板系统,例如
sed 's/TAG/1.2.3-20190103/g' x.yaml | kubectl replace -f -
对于一般的Un*x工具,POSIX.1指出,对于许多命令,
...命名文件的操作数可以指定为' - ',这意味着使用标准输入而不是命名文件....
一些支持它的命令包括cat,grep,sort和tar(POSIX不需要).例如,在两台Linux机器之间移动目录树的一种方法是在stdout上创建一个tar文件,通过ssh将流传输到远程机器,然后从stdin解压缩tar文件:
tar cf - . | ssh elsewhere tar xf - -C /other/dir
xargs是一种工具,可以将(最常见的)标准输入上的文件名列表转换为命令行参数.例如,find(1)可以将匹配文件名的列表打印到其stdout,因此您可以构建一个管道来删除shell备份文件,例如
find . -name '*~' | xargs rm
你通常不会在Kubernetes中使用它; 例如,您的示例尝试将YAML内容本身作为命令行参数传递kubectl
给.您可以kubectl
在目录树中应用类似的内容
find . name '*.yaml' | xargs -n1 kubectl apply -f
但由于kubectl ... -f
也支持目录名称(不是通用约定),你可以更直接地做同样的事情
kubectl apply -f . # where . is the current directory