引言

Kubernetes的Ingress资源是定义外部访问集群服务的规则。随着微服务架构和容器化技术的普及,Ingress作为路由流量的关键组件变得愈发重要。当我们需要在环境之间迁移Ingress资源或者备份当前的配置时,就会用到导出功能。然而,直接使用kubectl导出可能会包括一些我们不需要的元数据。本篇博客将教您如何优雅地导出Kubernetes命名空间下的Ingress资源,同时保留关键的annotations字段。
注意:其实这个跟获取configmap是连贯的,增加一些新的玩法!

在Kubernetes中优雅地导出和清理Ingress资源

初识kubectl和yq

kubectl是Kubernetes的命令行工具,它允许我们运行命令对Kubernetes集群进行操作。一个常用的功能是导出资源对象的YAML描述,以便迁移或备份。

yq是一款流行的命令行YAML处理器,类似于针对XML的xq和针对JSON的jq。使用yq可以轻松地对YAML数据进行查询、修改和编写。

导出Ingress资源

首先,让我们从所有Ingress资源开始,您可以通过运行以下命令来检索当前Kubernetes环境中的所有Ingress对象:

kubectl get ingress -o yaml

这个命令会生成一个包含了您所有Ingress资源的YAML文件,包括大量的元数据字段。

清理不必要的元数据

当执行kubectl get ingress -o yaml 的时候 每个ingress的数据内容格式如下:
image.png
这些元数据可能在当前环境中有用,但在资源迁移的过程中,字段如uidresourceVersioncreationTimestampmanagedFields通常是没必要的,甚至可能引起问题。我们可以结合使用kubectlyq来清理这些不必要的信息,并获得一个干净的YAML输出:

kubectl get ingress -o yaml | yq eval '
  del(
    .items[].metadata.creationTimestamp,
    .items[].metadata.managedFields,
    .items[].metadata.ownerReferences,
    .items[].metadata.uid,
    .items[].metadata.resourceVersion,
    .items[].metadata.generation
  )'

此命令针对Ingress对象数组中的每个项目删除了指定的字段。
image.png
但是这个annotations字段下面的这些数据我还想处理一下,怎么处理呢?

保留关键Annotations字段

Kubernetes中的annotations可以用来存储非标准的元数据,这对于定义特定的行为非常有用。例如,kubernetes.io/ingress.classtraefik.ingress.kubernetes.io/router.entrypoints对于Ingress控制器的工作至关重要。移除这些annotations可能会导致Ingress不再按预期工作,因此我们需要保留它们。只是删除kubectl.kubernetes.io/last-applied-configuration字段:

为了达到这个目的,我们需要稍微修改刚才的yq表达式,仅保留特定的annotations:

kubectl get ingress -n <your-namespace> -o yaml | yq eval '
  del(
    .items[].metadata.creationTimestamp,
    .items[].metadata.managedFields,
    .items[].metadata.ownerReferences,
    .items[].metadata.uid,
    .items[].metadata.resourceVersion,
    .items[].metadata.generation
  )
  | (.items[].metadata.annotations) |= with_entries(
      select(.key == "kubernetes.io/ingress.class" or .key == "traefik.ingress.kubernetes.io/router.entrypoints")
    )' -o yaml

请确保将<your-namespace>替换为您实际的命名空间。

这个命令会创建一个YAML文件,其中仅包括了我们特别指定的annotations,并且去除了所有其他不必要的metadata字段。
image.png
还有另外一种方法,这样也可以:

kubectl get ingress -n <your-namespace> -o yaml | yq eval '
  del(
    .items[].metadata.creationTimestamp,
    .items[].metadata.managedFields,
    .items[].metadata.ownerReferences,
    .items[].metadata.uid,
    .items[].metadata.annotations."kubectl.kubernetes.io/last-applied-configuration",
    .items[].metadata.resourceVersion,
    .items[].metadata.generation
  )'

image.png

结尾

使用这种方法,我们不但可以避免潜在的迁移冲突,还能确保关键配置信息的持久化。这为Kubernetes管理员提供了一个方便的方式来管理他们的Ingress配置,确保Ingress资源的迁移或备份可以无缝进行。

导出过程的自定义和优化对于维护清晰和高效的集群管理至关重要。希望本文介绍的方法能帮助您在自己的集群上执行精细化的Ingress资源管理和导出任务。
请注意,您需要有yq命令行工具的适当版本安装在您的系统上来执行以上的命令。若没有,您可以从yq的GitHub页面上找到安装指南和详情文档。同时,确保使用的是适合您文档结构和需求的yq表达式。


对你无可奈何
40 声望12 粉丝