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

前言:

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

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

一、理解kubectl get命令

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

bash 复制代码
kubectl get cm

以mysql-config为例:

shell 复制代码
 kubectl get cm mysql-config -o yaml

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

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排除特定行。

shell 复制代码
kubectl get cm mysql-config -o yaml | grep -v '^\s*creationTimestamp:'

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

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

shell 复制代码
kubectl patch cm mysql-config -p '{"metadata": {"annotations": null, "creationTimestamp": null, "resourceVersion": null, "uid": null}}'
shell 复制代码
kubectl get cm mysql-config
shell 复制代码
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文件中:

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

shell 复制代码
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删除特定字段的命令如下:

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

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

方案三:自定义Go模板

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

shell 复制代码
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模板的知识会是一笔不错的投资。

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

相关推荐
灼烧的疯狂40 分钟前
K8S + Jenkins 做CICD
容器·kubernetes·jenkins
wenyue11212 小时前
Revolutionize Your Kubernetes Experience with Easegress: Kubernetes Gateway API
容器·kubernetes·gateway
Python私教4 小时前
ubuntu搭建k8s环境详细教程
linux·ubuntu·kubernetes
O&REO6 小时前
单机部署kubernetes环境下Overleaf-基于MicroK8s的Overleaf应用部署指南
云原生·容器·kubernetes
politeboy6 小时前
k8s启动springboot容器的时候,显示找不到application.yml文件
java·spring boot·kubernetes
运维小文6 小时前
K8S资源限制之LimitRange
云原生·容器·kubernetes·k8s资源限制
登云时刻7 小时前
Kubernetes集群外连接redis集群和使用redis-shake工具迁移数据(二)
redis·容器·kubernetes
wuxingge15 小时前
k8s1.30.0高可用集群部署
云原生·容器·kubernetes
志凌海纳SmartX16 小时前
趋势洞察|AI 能否带动裸金属 K8s 强势崛起?
云原生·容器·kubernetes
锅总16 小时前
nacos与k8s service健康检查详解
云原生·容器·kubernetes