我需要一些关于kubectl标准和管道的解释 [英] Need some explaination of kubectl stdin and pipe

查看:15
本文介绍了我需要一些关于kubectl标准和管道的解释的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我是kubectl的日常用户,但不是Linux专家。最近我需要在部署后编辑一些服务类型,所以搜索并使用了kubectlreplace,效果很好。

cat yaml | kubectl replace -f -

service/tracs-pool-1sv replaced

但我不明白为什么在最后添加一个短破折号-。 医生只说:

根据传入标准输入的JSON替换Pod。

我搜索并找到了thisSO问题,了解到kubectl命令可能是不读标准输入命令(对吗?)。

我试过

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对于许多命令,

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

支持此功能的一些命令包括catgrepsort和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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆