前语:

获取单个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.annotationsmetadata.creationTimestampmetadata.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

kubectl获取命名空间下一切configmap调集的办法
这个指令会获取一切命名空间下的配置映射(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)'

kubectl获取命名空间下一切configmap调集的办法
在这条指令中,首要运用 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

kubectl获取命名空间下一切configmap调集的办法
这儿运用**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)'

kubectl获取命名空间下一切configmap调集的办法

计划二:自定义Go模板

此办法比较高档,你能够创立一个自定义的Go模板来准确操控哪些字段会被展现。下面是一个例子,获取一切命名空间下的ConfigMap但会疏忽metadata.annotationsmetadata.creationTimestampmetadata.resourceVersionmetadata.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}}'

kubectl获取命名空间下一切configmap调集的办法
这样导出的会有些强迫症,还是不太引荐!

计划三:结合文本处理东西

这是一个运用grep来完成的更根底的办法,能够从kubectl输出中挑选掉不需要的行。

kubectl get cm -n default -o yaml | grep -Ev '^s*creationTimestamp:|^s*annotations:|^s*resourceVersion:|^s*uid:' > all-configmaps.yaml

kubectl获取命名空间下一切configmap调集的办法
在上述指令中,grep -Ev用来扫除包括特定字段的行,然后将输出重定向到文件all-configmaps.yaml中。这个办法适用于简单的过滤,但或许无法处理杂乱的YAML结构。

上述办法能够依据你的具体需求进行调整,以习惯特定字段的删去或疏忽。

记住,某些字段,特别是触及多行值的,或许需要更杂乱的处理技巧,如运用yq或许自定义Go模板,以保证正确地解析和修改YAML。

能够发散思维的:

  1. 只导出A and B cm
  2. 导出A and B之外一切的cm
  3. 导出 A and B命名空间下一切的cm?

…………………..能够各种各样的组合,我们发散思维玩一下吧! 注:以上代码chatgpt辅佐生成!