如何使用 kubectl 命令从 k8s configmap 中的 yaml 文件中获取一个值?

4
假设 configmap 如下所示:
apiVersion: v1
kind: ConfigMap
metadata:
  name: my-configmap
  namespace: ${namespace}
data:
  my-config.yaml: |-
    keyA:
      keyB: a-value

如何使用kubectl命令从configmap获取keyB的值(即a-value)?PS: 我考虑使用-o jsonpath或-o 'go-template=...选项,但我无法找出正确的语法。

-o jsonpath 是一个好的选择。请查看 https://dev59.com/S1QK5IYBdhLWcg3wev6V我想提供完整的答案,但是我的 kubectl 有点生疏,而且我也没有可用的集群。但是,看起来下面 @Eduardo 的回答已经涵盖了这个问题。JSONPath 可能会让人感到困惑,因为它使用了那些花括号,与 jq 不同。祝你好运! - Bean Taxi
2个回答

5
您可以使用jsonpathgo-template来获取data.my-config.yaml的值。

jsonpath示例:

$ kubectl get cm my-configmap -o "jsonpath={.data['my-config\.yaml']}"
keyA:
  keyB: a-value

go-template 示例:

$ kubectl get cm my-configmap -o 'go-template={{index .data "my-config.yaml"}}'
keyA:
  keyB: a-value

请注意,如果在您的YAML中使用|-,则定义了一个多行YAML字符串,这意味着返回的值是单个带有换行符(\n)的字符串。
如果您只想要keyB的值,您可以使用输出来提供给像yq这样的YAML处理器。例如:
$ kubectl get cm my-configmap -o 'go-template={{index .data "my-config.yaml"}}' | yq -r .keyA.keyB
a-value

1

由于这个问题被标记为jq,而且yq只是jq的一个包装器,所以这里提供一个只使用yq的解决方案:

yq -r '.data."my-config.yaml"' configmap.yml |
  yq .keyA.keyB

当然,使用类似于grep/sed组合的方法可能也同样好:

 grep keyB: | sed 's/.*keyB: *//'

这可以通过上述第一次调用yq完成,或者完全不使用yq来完成,当然,这种方法也有许多注意事项。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接