如何导出ConfigMap为YAML,让文件内容用管道符号而非转义字符串?
把CoreDNS ConfigMap的Corefile转成YAML管道格式的方法
以下是几种实用的实现方式:
方法一:用yq工具自动化处理(推荐)
yq是专门处理YAML的命令行工具,能高效完成格式转换:
- 先导出原始ConfigMap到文件:
kubectl get cm coredns -n kube-system -o yaml > coredns-cm.yaml
- 执行yq命令转换格式(适配yq v4版本):
kubectl get cm coredns -n kube-system -o yaml | yq eval '.data.Corefile |= gsub("\\\\n"; "\n") | .data.Corefile |= style("literal")' > coredns-cm-formatted.yaml
这条命令会自动把Corefile里的转义\n替换成实际换行,同时将字段设置为YAML literal风格(即使用|符号)。
3. 验证格式没问题后,应用更新:
kubectl apply -f coredns-cm-formatted.yaml -n kube-system
方法二:手动编辑(适合快速调整)
如果不想用额外工具,直接手动修改最直观:
- 导出ConfigMap到本地文件:
kubectl get cm coredns -n kube-system -o yaml > coredns-cm.yaml
- 用文本编辑器打开文件,找到
Corefile字段:- 把原来的
Corefile: "xxxx\\nxxxx\\n..."格式,改成Corefile: | - 将引号内的内容拆分成多行,把所有
\\n替换成实际换行,并且每一行保持和Corefile字段一致的缩进(通常是在原有基础上再缩进2-4个空格,保证YAML格式合法)
- 把原来的
- 保存文件后应用更新:
kubectl apply -f coredns-cm.yaml -n kube-system
也可以直接用kubectl edit cm coredns -n kube-system在终端编辑器里直接修改,无需导出文件。
方法三:用sed命令处理(无额外工具场景)
如果环境里没有yq,可借助sed完成转换:
kubectl get cm coredns -n kube-system -o yaml | sed -e '/Corefile: "/,/"/{s/Corefile: "/Corefile: |/;s/"$//;s/\\n/\n /g}' > coredns-cm-formatted.yaml
这条命令会匹配Corefile的引号内容,替换开头为|符号,去掉结尾引号,并将转义换行替换为实际换行加缩进。
内容的提问来源于stack exchange,提问作者Dojo
相关产品推荐
相关产品推荐

