前语:
获取单个configmap并疏忽特定字段的操作可参照:kubectl获取ConfigMap导出YAML时怎么疏忽某些字段。
要获取命名空间下一切ConfigMap并疏忽特定字段,你能够运用kubectl
指令与例如yq
这样的东西结合运用来疏忽或删去不需要的字段。以下是一个步骤和示例,展现了怎么结合运用这些东西来完成你的方针。
计划一:运用yq
处理YAML文件
依然以default命名空间为例:
kubectl get cm
NAME DATA AGE
kube-root-ca.crt 1 2y149d
mail 4 2y133d
mysql-config 1 138d
首要装置yq
。如你提到的,对于Ubuntu体系,能够运用以下指令装置:
sudo apt-get install yq
导出default namespace下一切configmap:
然后,运用查找并删去操作来过滤掉不需要的字段。例如,假如你想要移除一切ConfigMap的metadata.annotations
,metadata.creationTimestamp
,metadata.resourceVersion
,和metadata.uid
字段,能够履行如下指令:
kubectl get cm -o yaml | yq e 'del(.items[].metadata.creationTimestamp, .items[].metadata.resourceVersion, .items[].metadata.uid, .items[].metadata.annotations)' - > default-configmaps.yaml
这个指令会获取一切命名空间下的配置映射(ConfigMap),并输出成一个单一的YAML文件,其间现已删去了一切制定的字段。
但是这儿还有一个问题,怎么疏忽某一个或许多个configmap呢比如上面的**kube-root-ca.crt **configmap呢?
怎么导出namespace下除kube-root-ca.crt cm下的一切configmap
kubectl get cm -o yaml | yq e 'del(.items[] | select(.metadata.name == "kube-root-ca.crt")) | del(.items[].metadata.creationTimestamp, .items[].metadata.resourceVersion, .items[].metadata.uid, .items[].metadata.annotations)'
在这条指令中,首要运用 del
函数删去名为kube-root-ca.crt
的configmap。这是经过 select
函数和比较运算符完成的。当.metadata.name
等于kube-root-ca.crt
时,这个configmap会从列表中删去。接着,其他的删去操作会应用到剩下的configmaps上。最终,改动后的YAML内容将被重定向到 default-configmaps.yaml
文件中。
注:请保证你装置了 yq
版别 4 或以上,由于 yq
的语法在不同版别间有较大差异。上述示例是依据 yq
版别 4 的语法。假如你的 yq
版别与此不同,请依据你的版别调整语法。
怎么完成匹配屏蔽多个configmap呢?继续屏蔽mail configmap:
kubectl get cm -o yaml | yq e 'del(.items[] | select(.metadata.name == "kube-root-ca.crt" or .metadata.name == "mail")) | del(.items[].metadata.creationTimestamp, .items[].metadata.resourceVersion, .items[].metadata.uid, .items[].metadata.annotations)' - > default-configmaps.yaml
这儿运用**or **能够匹配多个,忽然觉得这儿也能够改动一下办法只导出两个 mail与mysql-config cm的方式是不是and 变通一下:
kubectl get cm -o yaml | yq e 'del(.items[] | select(.metadata.name != "mail" and .metadata.name != "mysql-config")) | del(.items[].metadata.creationTimestamp, .items[].metadata.resourceVersion, .items[].metadata.uid, .items[].metadata.annotations)'
计划二:自定义Go模板
此办法比较高档,你能够创立一个自定义的Go模板来准确操控哪些字段会被展现。下面是一个例子,获取一切命名空间下的ConfigMap但会疏忽metadata.annotations
,metadata.creationTimestamp
,metadata.resourceVersion
和metadata.uid
字段:
kubectl get cm -o go-template-file=template.txt
在上述指令中,template.txt
是一个包括Go模板内容的文件,能够如下编写(保证文件途径和称号与指令中的相匹配):
{{- range .items }}
---
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .metadata.name }}
namespace: {{ .metadata.namespace }}
data:
{{- range $key, $value := .data }}
{{ $key }}: |-
{{ $value | indent 4 }}
{{- end }}
{{- end }}
此模板文件迭代一切ConfigMap目标,只包括称号、命名空间以及数据字段。注意,模板语法或许依据你想要显示的切当内容和格局有所不同。 当然也能够写成下面的姿态:
kubectl get cm -n default -o go-template='{{range .items}}{{printf "apiVersion: v1nkind: ConfigMapnmetadata:n name: %snnamespace: %sndata:n" .metadata.name .metadata.namespace}}{{range $key, $value := .data}}{{printf " %s: |-n %sn" $key $value}}{{end}}{{end}}'
这样导出的会有些强迫症,还是不太引荐!
计划三:结合文本处理东西
这是一个运用grep
来完成的更根底的办法,能够从kubectl
输出中挑选掉不需要的行。
kubectl get cm -n default -o yaml | grep -Ev '^s*creationTimestamp:|^s*annotations:|^s*resourceVersion:|^s*uid:' > all-configmaps.yaml
在上述指令中,grep -Ev
用来扫除包括特定字段的行,然后将输出重定向到文件all-configmaps.yaml
中。这个办法适用于简单的过滤,但或许无法处理杂乱的YAML结构。
上述办法能够依据你的具体需求进行调整,以习惯特定字段的删去或疏忽。
记住,某些字段,特别是触及多行值的,或许需要更杂乱的处理技巧,如运用yq
或许自定义Go模板,以保证正确地解析和修改YAML。
能够发散思维的:
- 只导出A and B cm
- 导出A and B之外一切的cm
- 导出 A and B命名空间下一切的cm?
…………………..能够各种各样的组合,我们发散思维玩一下吧! 注:以上代码chatgpt辅佐生成!