当前位置: 首页 > news >正文

记一次 Kubebuilder Operator 开发中的 CRD 注解超限问题

问题现象

在开发一个名为 <font style="color:rgba(0, 0, 0, 0.87);background-color:rgb(241, 241, 241);">nova</font> 的 Operator 过程中,当我执行 <font style="color:rgba(0, 0, 0, 0.87);background-color:rgb(241, 241, 241);">make install</font>(其底层是 <font style="color:rgba(0, 0, 0, 0.87);background-color:rgb(241, 241, 241);">kubectl apply</font>)来安装 CustomResourceDefinition (CRD) 时,终端抛出了一个错误:

The CustomResourceDefinition "nova.batch.suknna" is invalid: metadata.annotations: Too long: may not be more than 262144 bytes
make: *** [install] Error 1

这个错误信息非常明确:CRD 的 <font style="color:rgba(0, 0, 0, 0.87);background-color:rgb(241, 241, 241);">metadata.annotations</font> 字段总大小超过了 262144 字节的硬性限制。

概念厘清:注解、CSA 与三路合并的来龙去脉

要理解这个问题,需要先弄清楚几个关键概念。

1. annotations 是什么?

在 Kubernetes 中,注解是与对象关联的键值对,用于存储非标识性的元数据。这些信息可以被工具、库或控制器读取,但 Kubernetes 自身不依赖它们来核心逻辑。

2. last-applied-configuration

当使用 kubectl apply 命令时,默认采用的是 客户端应用(Client-Side Apply, CSA) 模式。为了智能地计算用户下一次 apply 时究竟需要修改哪些字段(而不是盲目覆盖),kubectl 需要一个参照物。

它的解决方案是:将你上次通过 apply 提交的整个 YAML/JSON 文件内容,完整地保存在一个名为 <font style="color:rgba(0, 0, 0, 0.87);background-color:rgb(241, 241, 241);">kubectl.kubernetes.io/last-applied-configuration</font> 的注解里。

这个过程依赖于三路合并

  • 旧状态<font style="color:rgba(0, 0, 0, 0.87);background-color:rgb(241, 241, 241);">last-applied-configuration</font> 注解中的内容。
  • 当前状态:从 Kubernetes API 服务器获取的资源当前状态。
  • 新状态:用户本次想要应用的 YAML 文件。
    <font style="color:rgba(0, 0, 0, 0.87);background-color:rgb(241, 241, 241);">kubectl</font> 会对比这三者,精确计算出需要修改、添加或删除的字段。

3. 问题原因

Kubebuilder 生成的 CRD 包含了非常详尽的 OpenAPI 验证规则(即 <font style="color:rgba(0, 0, 0, 0.87);background-color:rgb(241, 241, 241);">spec.versions[*].schema</font>)。这些规则本身就是一个极其庞大的 JSON 结构。当这个庞大的结构被整个塞进 <font style="color:rgba(0, 0, 0, 0.87);background-color:rgb(241, 241, 241);">last-applied-configuration</font> 注解时,注解的大小就很容易触达 256KB 的天花板。

解决办法

既然问题的根源是 CSA 模式依赖于一个本地的、可能很大的注解,那么解决方案就是换用一种不依赖这个注解的模式。

服务端应用(Server-Side Apply, SSA) 正是为此而生。

SSA 的核心思想:

  • 所有权转移:SSA 将字段管理的职责从客户端转移到了 API 服务器。
  • 字段管理器:服务器会为每个字段记录一个“管理者”。当你声明一个字段时,你就成为了它的管理者。
  • 冲突解决:如果另一个管理者(比如另一个工程师或控制器)试图修改你管理的字段,默认情况下会产生冲突,需要明确指定 <font style="color:rgba(0, 0, 0, 0.87);background-color:rgb(241, 241, 241);">--force-conflicts</font> 来覆盖。

实施与效果:
切换到 SSA 非常简单,只需在 <font style="color:rgba(0, 0, 0, 0.87);background-color:rgb(241, 241, 241);">kubectl apply</font> 命令后加上 <font style="color:rgba(0, 0, 0, 0.87);background-color:rgb(241, 241, 241);">--server-side</font> 标志。例如,修改你的 <font style="color:rgba(0, 0, 0, 0.87);background-color:rgb(241, 241, 241);">Makefile</font>

install: manifests kustomize ## Install CRDs into the K8s cluster specified in ~/.kube/config.$(KUSTOMIZE) build config/crd | $(KUBECTL) apply --server-side=true  -f -

执行此命令后:

  1. API 服务器接管了字段合并的职责。
  2. 不再需要生成和存储那个庞大的 <font style="color:rgba(0, 0, 0, 0.87);background-color:rgb(241, 241, 241);">last-applied-configuration</font> 注解。
  3. CRD 的元数据大小显著减小,256KB 的限制自然就不再是问题了。
http://www.jsqmd.com/news/25471/

相关文章:

  • 2025年10月上海装修公司榜单:五家口碑对比排行
  • 2025年10月黄褐斑改善产品排行:五款口碑单品评测
  • 【学习笔记】tarjan 算法大杂烩
  • 2025年保安亭厂家推荐排行榜
  • 【每日一面】对 Promise.race 的理解
  • 2025年10月淡化痘印产品推荐榜:权威对比与实测排行
  • 问大模型CAN的co-attention
  • 2025年10月美白精华产品推荐榜:温和多通路对比评测
  • 2025年10月美白精华产品推荐榜:口碑与成分深度评测
  • 在AI技术唾手可得的时代,挖掘新需求成为制胜关键——某知名1位量化AI框架需求探索
  • 2025 年地漏厂家最新推荐榜:涵盖铜 / 防臭 / 抗菌 / 磁悬浮 / 防溢水等类型,精选实力企业助力消费者精准选购
  • PBS, 以太坊的棘刺雕猴 - 教程
  • 2025年10月网上兼职赚钱正规平台推荐:知名平台榜单全收录
  • 2025年定制啤酒设备制造厂权威推荐:德国啤酒生产设备定制厂家/德国精酿设备厂家供应商/啤酒设备企业/啤酒厂设备优质厂家精选
  • 2025年10月网上兼职赚钱正规平台推荐:市场报告与对比列表
  • 【转载】孪生网络(Siamese Network)
  • nvlink和nvswitch的区别
  • 2025年10月敏感肌产品推荐榜:口碑与功效双排行
  • 2025年10月敏感肌产品推荐榜:持证美白舒缓功效全记录
  • 别再用手绘架构图了!ArchiMate才是架构师的标准乐高
  • 2025 年幕墙灯饰画,灯饰画设计,背胶灯饰画厂家最新推荐,聚焦资质、案例、售后的五家机构深度解读
  • 基于MATLAB的DUET算法实现欠定盲源分离
  • 2025 年墙体灯饰画,led 灯饰画,灯饰画定制,大型灯饰画 厂家最新推荐,聚焦资质、案例、售后的五家机构深度解读!
  • 2025 年商场灯饰画,户外灯饰画,天幕灯饰画厂家最新推荐,聚焦资质、案例、售后的五家机构深度解读
  • 本地客户端ssh连接远程服务器,远程服务器的ssh进程都做了哪些工作?
  • goldengate 12.x安装(oracle)
  • 数据采集故障频发,中控技术靠SeaTunnel实现日均TB级核心数据同步任务0出错
  • 2025年10月祛斑产品推荐榜:五款单品横向对比
  • yolo简单使用
  • 穿透式页面和菜单页面同时共存的解决方案