我需要一些关于kubectl标准和管道的解释 [英] Need some explaination of kubectl stdin and pipe
本文介绍了我需要一些关于kubectl标准和管道的解释的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我是kubectl的日常用户,但不是Linux专家。最近我需要在部署后编辑一些服务类型,所以搜索并使用了kubectlreplace,效果很好。
cat yaml | kubectl replace -f -
service/tracs-pool-1sv replaced
但我不明白为什么在最后添加一个短破折号-
。
医生只说:
我搜索并找到了thisSO问题,了解到kubectl命令可能是不读标准输入命令(对吗?)。根据传入标准输入的JSON替换Pod。
我试过
cat yaml |xargs kubectl replace -f
但返回错误:
the path "apiVersion:" does not exist
那么结尾的短连字符(-)语法是否仅为kubectl构建?或者是Linux bash stdin管道的一些更常见的语法? 谁能解释一下为什么xargs在这里不起作用,我必须在末尾加一个短划线(-)?
推荐答案
这是一个相当常见但不通用的联合国*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 states对于许多命令,
支持此功能的一些命令包括cat、grep、sort和tar(POSIX不需要)。例如,在两台Linux机器之间移动目录树的一种方法是在stdout上创建一个tar文件,通过ssh将流通过管道传输到远程机器,然后从stdin:解压tar文件。...命名文件的操作数可以指定为‘-’,这意味着使用标准输入而不是命名文件...
tar cf - . | ssh elsewhere tar xf - -C /other/dir
xargs是一个将标准输入上的文件名列表转换(通常)为命令行参数的工具。例如,find(1)可以将匹配的文件名列表打印到其标准输出,因此您可以构建一个管道来删除类似
的外壳备份文件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
这篇关于我需要一些关于kubectl标准和管道的解释的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文