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

时间:2018-08-09 13:58:12

标签: kubernetes jsonpath kubectl configmap

我正在尝试将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 个答案:

答案 0 :(得分:7)

Kubernetes GitHub存储库中有一个开放的issue,其中列出了需要解决的有关kubectl(和JSONpath)的问题,其中一个是问题16707 jsonpath模板输出应为json

编辑:

如何?

kubectl get cm my-configmap -o jsonpath='{.data.my\.file\.json}'

我刚刚意识到我还有answered个与此问题有关的问题。上面的命令应该输出您的想法!

答案 1 :(得分:0)

如果您有能力使用 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 作为标签选择器)来获取所有配置映射。接下来它通过 jq 管道它们,创建带有空字节终止的键值对(键还包含配置映射的名称,这样我确保重复的文件名不是问题)。然后它将其读入一个 bash 数组,按步骤 2 迭代该数组。使用内容创建文件。

这也适用于包含换行符的文件配置映射值。