微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

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

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

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

我希望能够做这样的事情:

cat file.yml | yq <get only test-config-three> | kubectl apply -f -

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

有没有办法在不创建新文件的情况下从包含多个资源的 yaml 文件中隔离和输出单个资源?

更新

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

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

解决方法

如果你有python,你可以尝试以下

export MYFILE=file.yml
export DOC_NUMBER=2

python3 -c "import yaml; print(yaml.dump(list(yaml.safe_load_all(open('"$MYFILE"')))["$DOC_NUMBER"]))" | kubectl apply -f -

yaml.safe_load_all(open('"$MYFILE"')) 将 yaml 文件中的所有文档加载到列表中。然后您正在选择带有 ["$DOC_NUMBER"] 的“$DOC_NUMBER”文档。

yaml.dump 会将加载的对象转储回 yaml 格式,然后打印出来。

,

实现了两个版本的 yq,一个在 Python 中,一个在 Go 中,正如我在 How can I parse a YAML file from a Linux shell script? 的回答中强调的那样

使用 Python 版本 - kislyuk/yq

yq -y 'select(.data.TEST == "three")' yaml

Go 版本 - mikefarah/yq

yq e 'select(.data.TEST == "three")' yaml

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。