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实现批量抓取“全部英雄”的皮肤图片,并将图片“批量保存”到本地。具体实现思路和详细逻辑,笔者将在正文结合完整代码进行详细介绍。注意,这里抓取的图片…...
TDengine 快速体验(Docker 镜像方式)
简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能,本节首先介绍如何通过 Docker 快速体验 TDengine,然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker,请使用 安装包的方式快…...
visual studio 2022更改主题为深色
visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中,选择 环境 -> 常规 ,将其中的颜色主题改成深色 点击确定,更改完成...
Rust 异步编程
Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...
如何在网页里填写 PDF 表格?
有时候,你可能希望用户能在你的网站上填写 PDF 表单。然而,这件事并不简单,因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件,但原生并不支持编辑或填写它们。更糟的是,如果你想收集表单数据ÿ…...
九天毕昇深度学习平台 | 如何安装库?
pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子: 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...
使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度
文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...
return this;返回的是谁
一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请,不同级别的经理有不同的审批权限: // 抽象处理者:审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...
JavaScript基础-API 和 Web API
在学习JavaScript的过程中,理解API(应用程序接口)和Web API的概念及其应用是非常重要的。这些工具极大地扩展了JavaScript的功能,使得开发者能够创建出功能丰富、交互性强的Web应用程序。本文将深入探讨JavaScript中的API与Web AP…...
淘宝扭蛋机小程序系统开发:打造互动性强的购物平台
淘宝扭蛋机小程序系统的开发,旨在打造一个互动性强的购物平台,让用户在购物的同时,能够享受到更多的乐趣和惊喜。 淘宝扭蛋机小程序系统拥有丰富的互动功能。用户可以通过虚拟摇杆操作扭蛋机,实现旋转、抽拉等动作,增…...
毫米波雷达基础理论(3D+4D)
3D、4D毫米波雷达基础知识及厂商选型 PreView : https://mp.weixin.qq.com/s/bQkju4r6med7I3TBGJI_bQ 1. FMCW毫米波雷达基础知识 主要参考博文: 一文入门汽车毫米波雷达基本原理 :https://mp.weixin.qq.com/s/_EN7A5lKcz2Eh8dLnjE19w 毫米波雷达基础…...
