【问题标题】:Need some explaination of kubectl stdin and pipe需要对 kubectl 标准输入和管道进行一些解释
【发布时间】:2019-05-30 15:15:21
【问题描述】:

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

cat yaml | kubectl replace -f -

service/tracs-pool-1sv replaced

但我不明白为什么要在最后添加短破折号 -。 文档只说:

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

我搜索发现this SO question,了解到 kubectl 命令可能是那种不读取标准输入的命令(我说的对吗?)。

我试过了

cat yaml |xargs kubectl replace -f

但返回错误:

the path "apiVersion:" does not exist

那么结束短破折号(-)语法是为 kubectl ONLY 构建的吗?还是 linux bash 标准输入管道的更多 common 语法? 有人可以解释为什么 xargs 在这里不起作用,我必须在最后放置一个短破折号(-)吗?

【问题讨论】:

    标签: bash kubernetes pipe stdin kubectl


    【解决方案1】:

    这是一个相当普遍但不普遍的 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 states 对于许多命令,

    ...命名文件的操作数可以指定为'-',表示使用标准输入而不是命名文件...。

    支持此功能的一些命令包括 cat、grep、sort 和 tar(POSIX 不需要)。例如,在两台 Linux 机器之间移动目录树的一种方法是在 stdout 上创建一个 tar 文件,通过 ssh 将该流传输到远程机器,然后从 stdin 解压缩 tar 文件:

    tar cf - . | ssh elsewhere tar xf - -C /other/dir
    

    xargs 是一种将标准输入上的文件名列表(通常)转换为命令行参数的工具。例如,find(1) 可以将匹配的文件名列表打印到其标准输出,因此您可以构建一个管道来删除 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
    

    【讨论】:

    • 非常感谢!你能提供其他一些 linux 命令,它们接受以与 kubectl 相同的方式结尾的 - 吗?
    • 有些会使用它们有些不会依赖于命令,这里的关键是它不能将文件名或stdin 作为输入。这里的通用性是您始终可以使用- 作为命令的标准输入。
    • @Rico 如果没有列出其他要使用的命令 - 我们宁愿认为它是 kubectl 特定的语法?
    • 我在答案中添加了一些示例。当你需要它时,**tar**(1) 是一个有用的。
    • 对于任何对 kubectl 如何做到这一点感兴趣的人 - github.com/kubernetes/cli-runtime/blob/v0.21.0/pkg/resource/…
    猜你喜欢
    • 2021-11-13
    • 1970-01-01
    • 2012-07-08
    • 1970-01-01
    • 1970-01-01
    • 2012-03-13
    • 1970-01-01
    • 1970-01-01
    • 2012-02-23
    相关资源
    最近更新 更多