如何使用 kubectl 和 jsonpath 将 configmap 的内容保存到文件中?

25

我正在尝试将一个configmap的内容保存到我的本地硬盘上的文件中。Kubectl支持使用JSONPath进行选择,但是我找不到需要选择文件内容的表达式。

该configmap是使用以下命令创建的:

kubectl create configmap my-configmap --from-file=my.configmap.json=my.file.json
当我运行时。
kubectl describe configmap my-configmap

我看到了以下的输出:

Name:         my-configmap 
Namespace:    default 
Labels:       <none> 
Annotations:  <none>

Data
==== 
my.file.json:
---- 
{
    "key": "value" 
} 
Events:  <none>

我所做的最远的事情就是仅选择文件内容:

 kubectl get configmap my-configmap -o jsonpath="{.data}"

输出哪些内容

map[my.file.json:{
    "key": "value"
}]

我想要的输出是

{
  "key": "value"
}

JSONPath中的最后一块拼图是什么?

2个回答

39
在 Kubernetes GitHub 存储库中有一个公开的 issue,其中列出了需要修复 kubectl(和 JSONpath)方面的事项,其中之一是 16707 问题 jsonpath 模板输出应该是 json编辑: 这样怎么样:
kubectl get cm my-configmap -o jsonpath='{.data.my\.file\.json}'

我刚意识到我已经回答了另一个相关(有点)的问题。上述命令应该输出你想要的内容!

1
它可以工作,但如果配置映射包含多个键且希望在不事先知道键的情况下下载所有文件,该怎么办? - stackoverflowed

2
如果您有使用jq的能力,那么您可以使用以下方法来列出所有选择器的配置映射,并提取文件:
readarray -d $'\0' -t a < <(kubectl get cm -l grafana=dashboards -o json | jq -cj '.items[] | . as $cm | .data | to_entries[] | [ ($cm.metadata.name + "-" + .key), .value ][]+"\u0000"') ; count=0; while [ $count -lt ${#a[@]} ]; do echo "${a[$((count + 1))]}" > ${a[$count]}; count=$(( $count + 2)); done

这里使用kubectl(使用-l进行标签选择器)来获取所有的configmaps。接下来,将它们通过jq传递,创建带有空字节终止符的键值对(键还包含configmap的名称,这样我就确保了重复文件名不是问题)。然后将其读入bash数组中,以2个步长迭代数组。创建具有内容的文件。
这也适用于包含换行符的配置映射值。

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