kubectl获取命名空间下所有configmap集合的方法

前言:

获取单个configmap并忽略特定字段的操作可参照:kubectl获取ConfigMap导出YAML时如何忽略某些字段。 要获取命名空间下所有ConfigMap并忽略特定字段,你可以使用kubectl命令与例如yq这样的工具结合使用来忽略或删除不需要的字段。以下是一个步骤和示例,展示了如何结合使用这些工具来实现你的目标。

方案一:使用yq处理YAML文件

依然以default命名空间为例:

arduino 复制代码
kubectl get cm
NAME               DATA   AGE
kube-root-ca.crt   1      2y149d
mail               4      2y133d
mysql-config       1      138d

首先安装yq。如你提到的,对于Ubuntu系统,可以使用以下命令安装:

shell 复制代码
sudo apt-get install yq

导出default namespace下所有configmap:

然后,使用查找并删除操作来过滤掉不需要的字段。例如,如果你想要移除所有ConfigMap的metadata.annotationsmetadata.creationTimestampmetadata.resourceVersion,和metadata.uid字段,可以执行如下命令:

shell 复制代码
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

css 复制代码
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:

css 复制代码
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 变通一下:

css 复制代码
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.annotationsmetadata.creationTimestampmetadata.resourceVersionmetadata.uid字段:

shell 复制代码
kubectl get cm  -o go-template-file=template.txt

在上述命令中,template.txt是一个包含Go模板内容的文件,可以如下编写(确保文件路径和名称与命令中的相匹配):

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对象,只包含名称、命名空间以及数据字段。注意,模板语法可能根据你想要显示的确切内容和格式有所不同。 当然也可以写成下面的样子:

shell 复制代码
kubectl get cm -n default -o go-template='{{range .items}}{{printf "apiVersion: v1\nkind: ConfigMap\nmetadata:\n  name: %s\nnamespace: %s\ndata:\n" .metadata.name .metadata.namespace}}{{range $key, $value := .data}}{{printf "  %s: |-\n    %s\n" $key $value}}{{end}}{{end}}'

这样导出的会有些强迫症,还是不太推荐!

方案三:结合文本处理工具

这是一个使用grep来实现的更基础的方法,可以从kubectl输出中筛选掉不需要的行。

shell 复制代码
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。

可以发散思维的:

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

.......................可以各种各样的组合,大家发散思维玩一下吧! 注:以上代码chatgpt辅助生成!

相关推荐
潘高2 小时前
Codex 太能吃 Token?给它配个 GPT 军师!
chatgpt
wangruofeng3 小时前
用 GPT-6 Astra 打磨 Vecsy:我的浏览器 SVG 编辑器进化记
chatgpt·aigc
名字还没想好☜4 小时前
用 systemd 托管后台服务:Restart 策略、日志接管、资源限制与开机自启全踩一遍
运维·docker·kubernetes
野熊佩骑9 小时前
Kubernetes实战系列文章(三) 之 K8S运维常用命令
linux·运维·docker·微服务·云原生·容器·kubernetes
一个向上的运维者11 小时前
Kubernetes 网络三部曲:CNI、kube-proxy 与 CoreDNS 是如何协作的?
网络·容器·kubernetes
鹤落晴春12 小时前
【K8s】Kustomize管理
云原生·容器·kubernetes
全栈弄潮儿12 小时前
GPT-6 Astra 发布:OpenAI 正式宣告“AGI 时代到来”
gpt·chatgpt·openai
RAOY的AI笔记13 小时前
Codex注册教程:从账号认证、环境配置到AI编程任务实践
chatgpt·ai编程
码--到成功14 小时前
Docker、Kubernetes安装系列 一
docker·容器·kubernetes
武子康14 小时前
Seedream 5.0 Pro 进入 Vercel AI Gateway:图像生成开始网关化
人工智能·ai·chatgpt·gateway·agent·claude·harness