如何使用 go-template 替换 kubectl 输出中的 JSON 值?

How to replace JSON value in kubectl output using go-template?

我有一个 configMap,我想使用其中最后应用的配置创建一个备份 configMap。

我使用以下命令获取最后应用的配置:

    kubectl get cm app-map -n app-space \
    -o go-template \
    --template='{{index .metadata "annotations" "kubectl.kubernetes.io/last-applied-configuration"}}' > backup.json

它returns是这样的[backup.json]的内容:

{"kind":"ConfigMap","apiVersion":"v1","metadata":{"name":"app-map","creationTimestamp":null},"data":{"app.yml":"xxxxxxxxx","config.yml":"yyyyyyyyy"}}

现在,我希望我的备份 configMap 具有不同的名称。所以,我想将 .metadata.nameapp-map 更改为 app-map-backup

有什么方法可以用 kubectl-o go-template 实现吗?我想在将其写入 backup.json 文件之前更改名称。

我知道我可以使用 jq 来做到这一点,但我没有在我使用 kubectl.

的服务器上安装 jq 的权限

你不能仅使用 kubectl 来做到这一点。但还有其他方法。

您可以从 official jq website 下载静态链接的 jq 二进制文件:

wget https://github.com/stedolan/jq/releases/download/jq-1.6/jq-linux64
chmod +x jq-linux64

然后你可以像下面这样使用这个二进制文件:

kubectl -o go-template [...] | ./jq-linux64 ...

或者您可以使用 sed:

kubectl -o go-template [...] | sed 's/"name":"app-map"/"name":"app-map-backup"/'

您可以使用 kubectl bulk 插件。以下命令将复制您的配置映射

# get resource(s) and create with field(name) change 
kubectl bulk configmap app-map -n app-space create name app-mapp-backup

kubectl bulk使用起来很强大,建议查看samples