以编程方式应用多资源 Kubernetes YAML 文件中的单个资源

dan*_*dan 5 yaml kubernetes kubectl yq

我有一个包含三个配置映射的文件,如下所示。

apiVersion: v1
data:
  TEST: "one"
kind: ConfigMap
metadata:
  name: test-config-one
---
apiVersion: v1
data:
  TEST: "two"
kind: ConfigMap
metadata:
  name: test-config-two
---
apiVersion: v1
data:
  TEST: "three"
kind: ConfigMap
metadata:
  name: test-config-three
Run Code Online (Sandbox Code Playgroud)

我试图仅应用于test-config-three集群。我知道我可以将其分解成自己的文件并运行kubectl apply -f test-config-three.yaml,但是有没有办法做到这一点而无需创建新文件?

我希望能够做类似的事情:

cat file.yml | yq <get only test-config-three> | kubectl apply -f -
Run Code Online (Sandbox Code Playgroud)

yq似乎不支持在文件中查找单个资源。我还研究了kubesplit等工具,但它们倾向于将所有资源输出到单独的文件中。

有没有一种方法可以从包含多个资源的 yaml 文件中隔离并输出单个资源,而无需创建新文件?

更新

感谢@Inian 下面的回答,我能够让这个完整的命令正常工作。

cat file.yml | yq e 'select(.data.TEST == "three")' - | kubectl apply -f -
Run Code Online (Sandbox Code Playgroud)

Ini*_*ian 4

有两种yq实现版本,一种在 Python 中,一种在 Go 中,正如我在如何从 Linux shell 脚本中解析 YAML 文件?

使用Python版本 - kislyuk/yq

yq -y 'select(.data.TEST == "three")' yaml
Run Code Online (Sandbox Code Playgroud)

Go 版本 - mikefarah/yq

yq e 'select(.data.TEST == "three")' yaml
Run Code Online (Sandbox Code Playgroud)