kubectl获取ConfigMap导出YAML时如何忽略某些字段
前言:
当我们在使用Kubernetes时,常常需要通过kubectl命令行工具来管理资源。有时我们也想将某个资源的配置导出为YAML文件,这样做有助于版本控制和资源的迁移。然而,默认情况下,使用kubectl get命令导出资源配置会包含一些元数据字段:

如**annotations****, **creationTimestamp**, **resourceVersion**, ****uid**等,这些字段对于备份或版本控制来说并不是必需的,反而可能会造成一些问题。本文将教您如何忽略这些字段,导出一个更干净的YAML配置!
kubectl获取ConfigMap导出YAML时如何忽略某些字段
一、理解kubectl get命令
在深入了解如何忽略特定字段之前,我们先来了解一下kubectl get命令。
kubectl get cm

以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-confignamespace: defaultresourceVersion: "540796275"uid: 19ba11c5-a803-4a1e-8800-c4f569ec092f
为了导出更干净的配置,我们需要去除掉其中不必要的元数据字段。
二、如何忽略特定字段
在Kubernetes中,没有直接忽略特定字段的kubectl选项,但我们可以使用一些工具和技术来实现类似的效果。
方案一:使用kubectl结合文本处理工具
最简单的方法是将kubectl get的输出通过管道传递给文本处理命令来删除不需要的字段。在Linux系统上,我们通常使用grep、sed等工具来处理文本。
示例:简单使用grep排除特定行。
kubectl get cm mysql-config -o yaml | grep -v '^\s*creationTimestamp:'

上述命令将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:'

这里要特别提醒一下:由于 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

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

但是,这个方法实际上修改了 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之前的内容:

起码保留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

在上述示例中,当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

这个命令将creationTimestamp、resourceVersion、uid和annotations字段从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

这段命令利用Go模板语法生成一个过滤掉特定Metadatas字段的ConfigMap资源的清单,并保存到mysql-config.yaml。
结束语
在实践中,以上的每种方法都有其适用的场合。如果您只是偶尔需要进行这样的操作,简单的文本处理可能就足够了。如果您经常需要处理复杂的YAML文件,那么学习和使用yq将会很有帮助。对于对性能要求较高或者更复杂的处理需求,学习一些关于Go模板的知识会是一笔不错的投资。
希望这篇文章对你有所帮助,如果你有任何问题,欢迎在评论区留言讨论。
相关文章:
kubectl获取ConfigMap导出YAML时如何忽略某些字段
前言: 当我们在使用Kubernetes时,常常需要通过kubectl命令行工具来管理资源。有时我们也想将某个资源的配置导出为YAML文件,这样做有助于版本控制和资源的迁移。然而,默认情况下,使用kubectl get命令导出资源配置会包…...
复制粘贴——QT实现原理
复制粘贴——QT实现原理 QT 剪贴板相关类 QClipboard 对外通用的剪贴板类,一般通过QGuiApplication::clipboard() 来获取对应的剪贴板实例。 // qtbase/src/gui/kernel/qclipboard.h class Q_GUI_EXPORT QClipboard : public QObject {Q_OBJECT private:explici…...
(一)五种最新算法(SWO、COA、LSO、GRO、LO)求解无人机路径规划MATLAB
一、五种算法(SWO、COA、LSO、GRO、LO)简介 1、蜘蛛蜂优化算法SWO 蜘蛛蜂优化算法(Spider wasp optimizer,SWO)由Mohamed Abdel-Basset等人于2023年提出,该算法模型雌性蜘蛛蜂的狩猎、筑巢和交配行为&…...
LED透镜粘接UV胶是一种特殊的UV固化胶,用于固定和粘合LED透镜。
LED透镜粘接UV胶是一种特殊的UV固化胶,用于固定和粘合LED透镜。 它具有以下特点: 1. 高透明度:LED透镜粘接UV胶具有高透明度,可以确保光线的透过性,不影响LED的亮度和效果。 2. 快速固化:经过UV紫外线照射…...
C语言 题目
1.写一个函数算一个数的二进制(补码)表示中有几个1 #include<stdio.h>//统计二进制数中有几个1 //如13:1101 //需要考虑负数情况 如-1 结果应该是32// n 1101 //n-1 1100 //n 1100 //n-1 1011 //n 1000 //n-1 0111 //n 0000 //看n的变化 int funca(int c){int co…...
CDN 内容分发网络
CDN常见问题 什么是 CDN ? CDN 全称是 Content Delivery Network/Content Distribution Network,翻译过的意思是 内容分发网络 。 我们可以将内容分发网络拆开来看: 内容:指的是静态资源比如图片、视频、文档、JS、CSS、HTML。…...
Android : Xui- RecyclerView+BannerLayout 轮播图简单应用
实例图: 1.引用XUI http://t.csdnimg.cn/Wb4KR 2.创建显示图片布局 banner_item.xml <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"xmlns:app"…...
Java网络通信-第21章
Java网络通信-第21章 1.网络程序设计基础 网络程序设计基础涵盖了许多方面,包括网络协议、Web开发、数据库连接、安全性等。 1.1局域网与互联网 局域网(LAN)与互联网(Internet)是两个不同的概念,它们分…...
Leetcode 345. Reverse Vowels of a String
Problem Given a string s, reverse only all the vowels in the string and return it. The vowels are ‘a’, ‘e’, ‘i’, ‘o’, and ‘u’, and they can appear in both lower and upper cases, more than once. Algorithm Collect all the vowels and reverse the…...
[linux] 用命令行wget下载google drive的大文件
使用wget命令下载Google drive上的文件_ubuntu上wget下载谷歌云盘文件-CSDN博客 如何用命令行下载Google Drive上的共享文件?-腾讯云开发者社区-腾讯云 举例:https://drive.google.com/drive/folders/1vKj3VvJEKgS_o-uOSmz3I0-GomECpql3 1、在网页上&…...
Docker Network(网络)——8
目录: Docker 为什么需要网络管理Docker 网络架构简介 CNMLibnetwork驱动常见网络类型 bridge 网络host 网络container 网络none 网络overlay 网络docker 网络管理命令 docker network createdocker network inspectdocker network connectdocker network disconne…...
网页设计--第6次课后作业
试用Vue相关指令完成对以下json数据的显示。显示效果如下: 其中:gender1 显示为女,gender2显示为男。价格超过30元,显示“有点小贵”。价格少于等于30元,则显示“价格亲民”。 data: {books: [{"id": "…...
R语言学习
Part1阶段1:入门基础 1安装R和RStudio: 下载并安装R:https://cran.r-project.org/ 下载并安装RStudio:https://www.rstudio.com/products/rstudio/download/ 2Hello World: 学习如何在R中输出"Hello, World!"…...
基于Unity3D 低多边形地形模型纹理贴图
在线工具推荐: 3D数字孪生场景编辑器 - GLTF/GLB材质纹理编辑器 - 3D模型在线转换 - Three.js AI自动纹理开发包 - YOLO 虚幻合成数据生成器 - 三维模型预览图生成器 - 3D模型语义搜索引擎 当谈到游戏角色的3D模型风格时,有几种不同的风格…...
vue预览pdf,放大缩小拖动,dialog拖动,父页面滚动
公共组件部分代码 main.js import draggable from /directive/drag/index Vue.use(draggable) pdf组件部分代码...
泽攸科技二维材料转移台的应用场景及优势
随着二维材料的广泛研究和各种潜在应用的开发,对于二维材料样品的精密操控与转移的需求日益增加。特别是一些新型二维材料的制备和器件集成制备中,需要在显微镜下对样品进行观察与定位,并能够在微米甚至纳米量级上精确移動和转移样品。 传统…...
JavaScript——基本使用HelloWrold
1. 内部标签 html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title><!--script标签内:写js代码 也可以写在body标签内--><script>alert(hello,world)&l…...
关于DNS服务器地址总是127.0.0.1且无法解析域名地址
问题 笔者尝试nslookup解释域名时,出现服务器变成本地环回口地址,导致无法解析域名 C:\Users\Zsy>nslookup www.baidu.com 服务器: UnKnown Address: 127.0.0.1*** UnKnown 找不到 www.baidu.com: Server failed排查思路 尝试关闭虚拟网卡&#…...
制作一个RISC-V的操作系统四-嵌入式开发介绍
文章目录 什么是嵌入式开发交叉编译查看一些GCC文件夹 调试器GDB相关语法命令 模拟器QEMUQEMU的安装和使用项目构造工具MakeMakeFile的构成make的运行 练习4-1练习4-2练习4-3 什么是嵌入式开发 程序跑到开发板上,或者说运行到硬件上 交叉编译 简单理解交叉编译来说…...
Python爬虫-实现批量抓取王者荣耀皮肤图片并保存到本地
前言 本文是该专栏的第12篇,后面会持续分享python爬虫案例干货,记得关注。 本文以王者荣耀的英雄皮肤为例,用python实现批量抓取“全部英雄”的皮肤图片,并将图片“批量保存”到本地。具体实现思路和详细逻辑,笔者将在正文结合完整代码进行详细介绍。注意,这里抓取的图片…...
【Linux】shell脚本忽略错误继续执行
在 shell 脚本中,可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行,可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令,并忽略错误 rm somefile…...
Leetcode 3576. Transform Array to All Equal Elements
Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接:3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到…...
连锁超市冷库节能解决方案:如何实现超市降本增效
在连锁超市冷库运营中,高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术,实现年省电费15%-60%,且不改动原有装备、安装快捷、…...
【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力
引言: 在人工智能快速发展的浪潮中,快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型(LLM)。该模型代表着该领域的重大突破,通过独特方式融合思考与非思考…...
现代密码学 | 椭圆曲线密码学—附py代码
Elliptic Curve Cryptography 椭圆曲线密码学(ECC)是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础,例如椭圆曲线数字签…...
成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战
在现代战争中,电磁频谱已成为继陆、海、空、天之后的 “第五维战场”,雷达作为电磁频谱领域的关键装备,其干扰与抗干扰能力的较量,直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器,凭借数字射…...
.Net Framework 4/C# 关键字(非常用,持续更新...)
一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...
算法笔记2
1.字符串拼接最好用StringBuilder,不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...
vulnyx Blogger writeup
信息收集 arp-scan nmap 获取userFlag 上web看看 一个默认的页面,gobuster扫一下目录 可以看到扫出的目录中得到了一个有价值的目录/wordpress,说明目标所使用的cms是wordpress,访问http://192.168.43.213/wordpress/然后查看源码能看到 这…...
【无标题】湖北理元理律师事务所:债务优化中的生活保障与法律平衡之道
文/法律实务观察组 在债务重组领域,专业机构的核心价值不仅在于减轻债务数字,更在于帮助债务人在履行义务的同时维持基本生活尊严。湖北理元理律师事务所的服务实践表明,合法债务优化需同步实现三重平衡: 法律刚性(债…...
