kubectl获取ConfigMap导出YAML时如何忽略某些字段

news2024/9/29 21:19:37

前言:

当我们在使用Kubernetes时,常常需要通过kubectl命令行工具来管理资源。有时我们也想将某个资源的配置导出为YAML文件,这样做有助于版本控制和资源的迁移。然而,默认情况下,使用kubectl get命令导出资源配置会包含一些元数据字段:
r7EUlNNKvc.png
**annotations****, **creationTimestamp**, **resourceVersion**, ****uid**等,这些字段对于备份或版本控制来说并不是必需的,反而可能会造成一些问题。本文将教您如何忽略这些字段,导出一个更干净的YAML配置!

kubectl获取ConfigMap导出YAML时如何忽略某些字段

一、理解kubectl get命令

在深入了解如何忽略特定字段之前,我们先来了解一下kubectl get命令。

kubectl get cm

image.png
以mysql-config为例:

 kubectl get cm mysql-config -o yaml

以上命令会打印出指定ConfigMap的YAML格式输出,包括所有元数据信息。例如:

apiVersion: v1
data:
  my.cnf: "[mysqld]\nserver-id=1\ncharacter-set-server=utf8mb4 \nlower_case_table_names
    = 1\n"
kind: ConfigMap
metadata:
  annotations:
    kubectl.kubernetes.io/last-applied-configuration: |
      {"apiVersion":"v1","data":{"my.cnf":"[mysqld]\nserver-id=1\ncharacter-set-server=utf8mb4 \nlower_case_table_names = 1\n"},"kind":"ConfigMap","metadata":{"annotations":{},"name":"mysql-config","namespace":"default"}}
  creationTimestamp: "2023-07-19T07:16:34Z"
  name: mysql-config
  namespace: default
  resourceVersion: "540796275"
  uid: 19ba11c5-a803-4a1e-8800-c4f569ec092f

为了导出更干净的配置,我们需要去除掉其中不必要的元数据字段。

二、如何忽略特定字段

在Kubernetes中,没有直接忽略特定字段的kubectl选项,但我们可以使用一些工具和技术来实现类似的效果。

方案一:使用kubectl结合文本处理工具

最简单的方法是将kubectl get的输出通过管道传递给文本处理命令来删除不需要的字段。在Linux系统上,我们通常使用grepsed等工具来处理文本。

示例:简单使用grep排除特定行。
kubectl get cm mysql-config -o yaml | grep -v '^\s*creationTimestamp:'

image.png
上述命令将ConfigMap输出的YAML内容中的creationTimestamp行删除了,相似地,您可以添加更多的grep -v来排除其他不需要的字段:

kubectl get cm mysql-config -o yaml | grep -v '^\s*creationTimestamp:'|grep -v '^\s*annotations:'|grep -v '^\s*resourceVersion:'|grep -v '^\s*uid:'

image.png
这里要特别提醒一下:由于 YAML 中这些字段可能有缩进,使用 grep -v 可能不足够灵活来处理所有情况。此外,grep 仅逐行工作,annotations字段可能是多行值,这里并不适用!

示例:使用grep与kubeclt patch结合:
kubectl patch cm mysql-config -p '{"metadata": {"annotations": null, "creationTimestamp": null, "resourceVersion": null, "uid": null}}'

kubectl get cm mysql-config

image.png

ubectl get cm mysql-config -o yaml | grep -v "^\s*annotations:" | grep -v "^\s*creationTimestamp:" | grep -v "^\s*resourceVersion:" | grep -v "^\s*uid:"

image.png
但是,这个方法实际上修改了 ConfigMap。如果你想保持 ConfigMap 不变,这个方法并不适用!
输出到mysql-config文件中:

ubectl get cm mysql-config -o yaml | grep -v "^\s*annotations:" | grep -v "^\s*creationTimestamp:" | grep -v "^\s*resourceVersion:" | grep -v "^\s*uid:" > mysql-config.yaml
示例:使用awk进行复杂的文本处理

如果不想使用grep,而是想继续使用传统的文本处理工具链,awk是一个比grep更强大的文本处理工具,能处理跨行的模式匹配和范围操作。我们可以使用awk来按块处理YAML内容。

以下是一个示例awk脚本,用于删除annotations和其他一些字段:
注: configmap还原为path之前的内容:
image.png
起码保留annotations字段

kubectl get cm mysql-config -o yaml | awk '
  /annotations:/{a=1} 
  /^    [a-zA-Z0-9_]+:/{a=0} 
  !a && !/creationTimestamp:/ && !/resourceVersion:/ && !/uid:/ {print}
  /name:|namespace:/{print}
' > mysql-config.yaml

image.png
在上述示例中,当awk遇到以annotations:开头的行时,设置一个标志位a为1,然后在遇到下一个以一些空格后跟文字字符开头的行时,重新设置标志位为0,完成范围的处理。同时,我们检查每一行是否不是要排除的字段,如果是的话,就跳过不打印。

方案二:借助yq工具处理YAML文件

yq是一个强大的YAML处理工具,它类似于JSON的jq工具。你可以利用yq来精准地处理YAML格式的内容。

首先,您需要安装yq。它可以通过包管理工具(如Homebrew、apt等)或直接从其GitHub页面下载。
我的操作系统ubuntu直接使用sudo apt-get install yq 安装:
使用yq删除特定字段的命令如下:

kubectl get cm mysql-config -o yaml | yq eval 'del(.metadata.creationTimestamp, .metadata.resourceVersion, .metadata.uid, .metadata.annotations)' - > mysql-config.yaml

image.png
这个命令将creationTimestampresourceVersionuidannotations字段从YAML中删除,并将结果保存到my-config.yaml文件中。

方案三:自定义Go模板

另一个更高级的解决方案是使用kubectl的自定义Go模板输出。通过编写一个模板,您可以精确控制输出哪些内容。

kubectl get cm my-config -o go-template='{{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}}' > mysql-config.yaml

image.png
这段命令利用Go模板语法生成一个过滤掉特定Metadatas字段的ConfigMap资源的清单,并保存到mysql-config.yaml

结束语

在实践中,以上的每种方法都有其适用的场合。如果您只是偶尔需要进行这样的操作,简单的文本处理可能就足够了。如果您经常需要处理复杂的YAML文件,那么学习和使用yq将会很有帮助。对于对性能要求较高或者更复杂的处理需求,学习一些关于Go模板的知识会是一笔不错的投资。

希望这篇文章对你有所帮助,如果你有任何问题,欢迎在评论区留言讨论。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1283643.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【IPv6】IPv6协议

一、IPv6数据报格式 这是与v4报头的对比 1.8bit的版本保留了,v4版本就是4,v6就是6。 2.v6去除了v4的首部长度字段,因为v6的首部长是固定的40字节。 3.服务类型(Type of Service, ToS)和通信类型(Traffi…

【Linux下如何生成coredump文件】

一,什么是coredump 我们经常听到大家说到程序core掉了,需要定位解决,这里说的大部分是指对应程序由于各种异常或者bug导致在运行过程中异常退出或者中止,并且在满足一定条件下(这里为什么说需要满足一定的条件呢&#…

贝叶斯网络 (人工智能期末复习)

文章目录 贝叶斯网络(概率图模型)定义主要考点例题- 要求画出贝叶斯网络图- 计算各节点的条件概率表- 计算概率- 分析独立性 贝叶斯网络(概率图模型) 定义 一种简单的用于表示变量之间条件独立性的有向无环图(DAG&am…

操作系统概述及发展史、Linux内核、发行版及应用领域

一、 操作系统(Operation System,OS) 裸机:没有安装操作系统的计算机 如果想在 裸机 上运行自己所编写的程序,就必须用机器语言书写程序如果计算机上安装了操作系统,就可以在操作系统上安装支持的高级语言…

工程师业余生活之制作蔬菜盆景

工程师业余生活陶冶情操之制作蔬菜盆景 (蔬 果 盆 景 裝 點 家 居) 市場上好多蔬菜瓜果,稍用一些心思,將一些價廉的蔬果製成別致的盆景, 便能使家居充滿自然氣息,增添生活情趣。以下介紹幾種製作方法: 【番薯盆景】 (番薯又名地…

人工智能_机器学习060_核函数对应数学公式_数据空间错位分割_简单介绍_以及核函数总结---人工智能工作笔记0100

我们之前做的都是线性分类问题,那么需要一根线来分割类别,但是,如果出现了,环形数据,我们知道,在二维中我们就无法分割了,那么有没有什么办法分割呢? 实际上是有的,可以看到,我们可以把数据进行升维,可以看到,如果把数据升高到2维度以上,可以看到,神奇的一幕出现了,这个时候,因…

每日3道PWN(第一天)

环境准备 我现在用的是kali 现阶段工具:checkesc、IDA、比较完善的python环境 下载工具的话,我这里不提供了 buuctf——test_your_nc1 参考wp: BUUCTF PWN-----第1题:test_your_nc_buuctf test_your_nc-CSDN博客 查看的资料:…

风格迁移网络修改流程(自用版)

一. AdaAttN-Revisit Attention Mechanism in Arbitrary Neural Style Transfer(ICCV2021) 下载vgg_normalised.pth打开visdom python -m visdom.server在 train_adaattn.sh 中配置 content_path、style_path 和 image_encoder_path,分别表…

深入理解Zookeeper系列-4.Watcher原理

👏作者简介:大家好,我是爱吃芝士的土豆倪,24届校招生Java选手,很高兴认识大家📕系列专栏:Spring源码、JUC源码、Kafka原理、分布式技术原理🔥如果感觉博主的文章还不错的话&#xff…

深入浅出理解kafka

1.Kafka简介 Kafka 本质上是一个 MQ(Message Queue),使用消息队列的优点: 解耦:允许独立的扩展或修改队列两边的处理过程。可恢复性:即使一个处理消息的进程挂掉,加入队列中的消息仍然可以在系…

LinuxBasicsForHackers笔记 -- 控制文件和目录权限

对于每个文件和目录,我们可以指定文件所有者、特定用户组以及所有其他用户的权限状态。 不同类型的用户 在Linux中,root用户是拥有一切权力的。 root 用户基本上可以在系统上执行任何操作。 系统上的其他用户具有有限的能力和权限,并且几乎…

使用正则表达式时-可能会导致性能下降的情况

目录 前言 正则表达式引擎 NFA自动机的回溯 解决方案 前言 正则表达式是一个用正则符号写出的公式,程序对这个公式进行语法分析,建立一个语法分析树,再根据这个分析树结合正则表达式的引擎生成执行程序(这个执行程序我们把它称作状态机&a…

GitHub项目推荐-Deoldify

有小伙伴推荐了一个老照片上色的GitHub项目,看了简介,还不错,推荐给大家。 项目地址 GitHub - SpenserCai/sd-webui-deoldify: DeOldify for Stable Diffusion WebUI:This is an extension for StableDiffusions AUTOMATIC1111 w…

IDEA 下载mysql驱动下载在不下来

结合一下 https://www.cnblogs.com/dadian/p/11936056.htmlhttps://www.cnblogs.com/dadian/p/11936056.html并且下载的 在idea改名 加入 加入到库 等待一会就要你输入sql的root和密码了,就OK

React创建项目

React创建项目 提前安装好nodejs再进行下面的操作,通过node -v验证是否安装 1.设置源地址 npm config set registry https://registry.npmmirror.com/2.确认源地址 npm config get registry返回如下 https://registry.npmmirror.com/3.输入命令 npx create-re…

SpringCloud | Dubbo 微服务实战——注册中心详解

前言 「作者主页」:雪碧有白泡泡 「个人网站」:雪碧的个人网站 |Eureka,Nacos,Consul,Zookeeper在Spring Cloud和Dubbo中实战 引言 在项目开发过程中,随着项目不断扩大,也就是业务的不断增多,我们将采用集群&#xf…

(C语言)通过循环按行顺序为一个矩阵赋予1,3,5,7,9,等奇数,然后输出矩阵左下角的值。

#include<stdio.h> int main() {int a[5][5];int n 1;for(int i 0;i < 5;i ){for(int j 0;j < 5;j ){a[i][j] n;n 2;}}for(int i 0;i < 5;i ){for(int j 0;j < i;j )printf("%-5d",a[i][j]);printf("\n");}return 0; } 运行截图…

Win7 旗舰版打开Rustdesk软件提示无法启动程序 ,计算机中丢失api-ms-win-shcore-scaling-|1-1-1.dll

环境: Win7 旗舰版 64位 Rustdesk1.19自编译客户端 问题描述: Win7 旗舰版打开Rustdesk软件提示无法启动程序 ,计算机中丢失api-ms-win-shcore-scaling-|1-1-1.dll "api-ms-win-shcore-scaling-|1-1-1.dll" 是一个系统动态链接库文件,它是Windows操作系统的一…

迪文串口5使用查询方式发送数据

迪文屏串口5寄存器如下 发送数据我采用的不是中断&#xff0c;而是查询发送标志位实现的。 串口5不像串口2一样&#xff08;串口2可以位寻址&#xff0c;串口5不行&#xff09;&#xff0c;所以如果采用查询模式&#xff0c;需要判断寄存器的数据&#xff0c;我的写法比较简单…