我是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在这里不起作用,我必须在末尾加一个短破折号(-)吗?
答案 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对于许多命令来说,
...可以将命名文件的操作数指定为'-',这意味着使用标准输入而不是命名文件。...
一些支持此功能的命令包括cat,grep,sort和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