我需要一些关于kubectl标准和管道的解释

人气:302 发布:2022-10-16 标签: pipe stdin bash kubernetes 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对于许多命令,

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

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

943