恒美微站 Logo 恒美微站
  • 首页
  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心
  • 联系我们

kgateway API 与 CRD 开发指南:从类型定义到代码生成与注册的完整实践

  • 首页
  • 资讯中心
  • /
  • kgateway API 与 CRD 开发指南:从类型定义到代码生成与注册的完整实践

相关资讯

全国省市县三级行政区划shp数据处理全攻略:从坐标系到代码清洗 2026/10/12 1:43:46
素数判断与筛法全解析:从暴力到埃氏筛、线性筛 2026/10/12 1:43:46
openagent 接入 BlueBubbles 发送与管理 iMessage:message 工具全动作实战指南 2026/10/12 1:43:46

最新资讯

小白程序员必看:巨头联手造Agent,AI智能体时代真的来了!
平面设计形考作业通关:Illustrator、InDesign、Photoshop实操与脚本技巧
数据分类分级的范式转换:从规则匹配到场景化高准确率一键部署
收藏 | 从“回答问题”到“完成任务”:小白也能懂的AI Agent学习指南
自由设计师的文件版本管理:从「最终版」到「最终版v6」的终结方案
springboot网上订餐系统51124-计算机课程设计、毕业设计

今日推荐

Debian新手入门:从部署到日常操作的完整指南
MongoDB复制集扩缩容实战:从rs.add到选主事故复盘
条形码目标检测数据集实战:从YOLOv8训练到部署

本周热门

UE动画修改实战:从资产编辑到重定向与蒙太奇驱动
统计随机数生成器攻击下的KLJN安全密钥交换协议Matlab仿真
政务API安全治理:资产测绘、低代码编排与行标对标实践

本月精选

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证
2026 大模型集体涨价:用 Python 做企业 Token 成本测算与选型避坑(附配置)

kgateway API 与 CRD 开发指南:从类型定义到代码生成与注册的完整实践

发布时间:2026/10/12 1:43:46
kgateway API 与 CRD 开发指南:从类型定义到代码生成与注册的完整实践 API网关云原生微服务【免费下载链接】kgatewayThe Cloud-Native API Gateway and AI Gateway项目地址https://gitcode.com/gh_mirrors/kg/kgateway点击查看免费下载kgateway 是一个云原生 API 网关与 AI 网关项目其所有网关能力Backend、TrafficPolicy、ListenerPolicy、GatewayParameters 等都构建在自定义资源CRD之上。本文以仓库中的 api/README.md 为核心骨架结合 gateway_parameters_types.go、hack/generate.sh、pkg/apiclient/types.go 等源码完整讲解为 kgateway 新增一个 API / CRD的五个标准步骤、API 类型编写规范以及如何将 Gateway API 的策略类型安全地复刻进 TrafficPolicy API。读完本文你将能够在 kgateway 代码库中独立添加新的自定义资源类型并理解其从 Go 类型到 CRD、RBAC、clientset 的全链路生成机制。api 目录定位kgateway 的 API 类型仓库api目录存放 kgateway 全部 API 与自定义资源的 Go 类型定义是控制面与数据面配置模型的事实来源source of truth。当前仓库中该目录的核心布局如下api/v1alpha1/kgatewaykgateway 自有资源的 Go 类型API 组为gateway.kgateway.dev版本为v1alpha1包含 backend_types.go、traffic_policy_types.go、listener_policy_types.go、gateway_parameters_types.go 等类型文件api/v1alpha1/shared跨资源复用的共享类型如 shared_types.go 中的LocalPolicyTargetReference、StringMatcher、HeaderModifiers以及 timeouts.go 中的Timeouts每个 API 版本目录下还有由 codegen 生成的 zz_generated.deepcopy.go 与 zz_generated.register.go带DO NOT EDIT注释均不可手工修改。从 zz_generated.register.go 可以看到生成的注册文件声明了GroupName gateway.kgateway.dev、GroupVersion {Group: gateway.kgateway.dev, Version: v1alpha1}并通过addKnownTypes将Backend、TrafficPolicy、ListenerPolicy、GatewayParameters等类型及其 List 类型注册进 Kubernetes scheme这是后续生成 clientset、进行 List/Watch 的基础。新增一个 API / CRD 的五个标准步骤api/README.md 给出了向 Kubernetes Gateway 集成中新增 CRD 的完整流程共五步。下面逐步展开并结合仓库源码说明每一步的实际含义。步骤 1创建 API 版本目录与doc.go如果是首次创建新 API 版本例如未来的v1、v2alpha1需要为该版本新建目录并在其中创建doc.go写入// kubebuilder:object:generatetrue注解使该目录下的 Go 类型在运行 codegen 时被转换为 CRD。以现有版本为例// api/v1alpha1/kgateway/doc.go // k8s:openapi-gentrue // kubebuilder:object:generatetrue // groupNamegateway.kgateway.dev // versionNamev1alpha1 package kgateway关键注解说明kubebuilder:object:generatetrue指示 controller-gen 为该目录下的类型生成zz_generated.deepcopy.gogroupName标记marker指定生成 CRD 的 API 组名gateway.kgateway.dev正是所有 kgateway 自有 CRD 的组名与 zz_generated.register.go 中的GroupName常量一致RBAC 规则通过kubebuilder:rbac注解定义。README 特别强调该注解不应挂在类型struct上而应挂在文件或包级别。查看 doc.go 可以看到它集中声明了 Gateway API 资源gatewayclasses、httproutes、grpcroutes 等、Controller 资源pods、secrets、namespaces、endpoints、Proxy deployer 资源deployments、services、serviceaccounts、poddisruptionbudgets、HPA/VPA、EDS 资源endpointslices、Istio 资源以及 leader election 所需 lease 的 RBAC 权限。步骤 2编写_types.go类型文件在 API 版本目录中创建_types.go文件定义资源类型与资源列表类型。README 以 gateway_parameters_types.go 为范本其结构如下资源类型struct包含 metadata 字段、Spec与Status并叠加kubebuilder注解// kubebuilder:rbac:groupsgateway.kgateway.dev,resourcesgatewayparameters,verbsget;list;watch // kubebuilder:rbac:groupsgateway.kgateway.dev,resourcesgatewayparameters/status,verbsget;update;patch // genclient // kubebuilder:object:roottrue // kubebuilder:metadata:labels{appkgateway,app.kubernetes.io/namekgateway} // kubebuilder:resource:categorieskgateway,pathgatewayparameters // kubebuilder:subresource:status type GatewayParameters struct { metav1.TypeMeta json:,inline // optional metav1.ObjectMeta json:metadata,omitempty // required Spec GatewayParametersSpec json:spec // optional Status GatewayParametersStatus json:status,omitempty }要点在类型上方的kubebuilder:rbac注解只声明本资源的 RBAC 规则如对gatewayparameters的get;list;watch对gatewayparameters/status的get;update;patchkubebuilder:object:roottrue标记该类型是根对象会生成 deepcopy 与 List 类型kubebuilder:subresource:status启用/status子资源kubebuilder:resource:categorieskgateway,pathgatewayparameters设置资源分类与路径复数形式。资源列表类型List包含 metadata 字段与Items切片// kubebuilder:object:roottrue type GatewayParametersList struct { metav1.TypeMeta json:,inline metav1.ListMeta json:metadata,omitempty Items []GatewayParameters json:items }此外从TrafficPolicy见 traffic_policy_types.go可以看到更多可用的资源级注解例如kubebuilder:printcolumn:nameAccepted,typestring,JSONPath.status.ancestors[*].conditions[?(.typeAccepted)].status用于在kubectl get时输出可读状态列以及kubebuilder:metadata:labelsgateway.networking.k8s.io/policyDirect用于标注策略的挂载语义。步骤 3运行 codegen 生成全套产物README 要求执行make generated-code -B这将调用 hack/generate.go 指定的controller-gen命令。hack/generate.go 本身是一个go:generate模板占位文件panic(this file is a go:generate template...)真正的生成逻辑在其同级脚本 hack/generate.sh 中关键流程包括go tool register-gen --output-file zz_generated.register.go生成类型注册文件随后通过 sed 将版本占位符替换为v1alpha1go tool controller-gen crd:maxDescLen50000 object rbac:roleNamekgateway paths.../api/v1alpha1/kgateway paths.../api/v1alpha1/shared同时生成 deepcopy、CRD 与 RBACgo tool client-gen --clientset-name versioned ... --plural-exceptions GatewayParameters:GatewayParameters生成 versioned clientset 到 pkg/client注意对GatewayParameters做了复数例外处理最后对生成的 CRD 做若干后处理如将 ClusterRole 名字模板化为kgateway-{{ .Release.Namespace }}、用 Helm 字符串字面量转义 CRD 描述中的{{ ... }}模板语法避免helm lint失败。codegen 完成后会产出以下几类文件产物输出位置zz_generated.deepcopy.go与 Go 类型同目录如 api/v1alpha1/kgateway/zz_generated.deepcopy.gozz_generated.register.go与 Go 类型同目录如 api/v1alpha1/kgateway/zz_generated.register.goCRD YAMLCRD Helm chart 模板目录 install/helm/kgateway-crds/templates当前已包含 7 个 CRDgateway.kgateway.dev_backendconfigpolicies.yaml、_backends.yaml、_directresponses.yaml、_gatewayextensions.yaml、_gatewayparameters.yaml、_listenerpolicies.yaml、_trafficpolicies.yamlRBAC Roleinstall/helm/kgateway/templates/role.yamlkube clientspkg/clientversioned clientsetREADME 还提到 codegen 会更新api/applyconfiguration、pkg/generated与pkg/client目录。从当前仓库快照看pkg/client/clientset/versioned 已包含clientset.go、fake/、scheme/、typed/而api/applyconfiguration与pkg/generated目录尚未生成结合 hack/generate.sh 的实际调用序列可以推断当前主流程实际执行的生成器是register-gen、controller-gen与client-gen。生成的 clientset 主要用于插件初始化plugin initialization其中的 fake client 用于测试。步骤 4向 apiclient 注册 CRD在 pkg/apiclient/types.go 中注册 CRD使控制面客户端能够对新增资源执行 List / Watch / Write。该文件通过RegisterTypes()内部用sync.Once保证只注册一次调用kubeclient.Register为每个资源注册 GVR、GVK 及三个闭包函数List、Watch、WriteAPI。例如对GatewayParameters的注册kubeclient.Register( wellknown.GatewayParametersGVR, wellknown.GatewayParametersGVK, func(c kubeclient.ClientGetter, namespace string, o metav1.ListOptions) (runtime.Object, error) { return c.(Client).Kgateway().GatewayKgateway().GatewayParameters(namespace).List(context.Background(), o) }, func(c kubeclient.ClientGetter, namespace string, o metav1.ListOptions) (watch.Interface, error) { return c.(Client).Kgateway().GatewayKgateway().GatewayParameters(namespace).Watch(context.Background(), o) }, func(c kubeclient.ClientGetter, namespace string) kubetypes.WriteAPI[*kgateway.GatewayParameters] { return c.(Client).Kgateway().GatewayKgateway().GatewayParameters(namespace) }, )types.go 中已注册的资源还包括TCPRoute、TLSRoute、Backend、BackendConfigPolicy、DirectResponse、ListenerPolicy、TrafficPolicy、GatewayExtension。新增资源时GVR/GVK 常量定义在 pkg/kgateway/wellknown/constants.go 等 wellknown 文件中。步骤 5为测试注册 CRD两处新增资源必须同时注册到两个测试位置filterObjects函数pkg/apiclient/fake/fake.go按对象类型将测试输入分为 kgateway 对象与 Istio 对象两组当前分支覆盖*kgateway.Backend、*kgateway.BackendConfigPolicy、*kgateway.DirectResponse、*kgateway.GatewayExtension、*kgateway.GatewayParameters、*kgateway.ListenerPolicy、*kgateway.TrafficPolicy。新增资源需在此 switch 中追加对应类型否则测试对象会被误判为 Istio 类型。AllCRDs列表test/testutils/crd.go集中声明测试环境需要安装的全部 CRD 的 GroupVersionResource分为 Gateway API、K8s API、Istio API、kgateway API 四组。kgateway 组当前包括wellknown.BackendGVR、BackendConfigPolicyGVR、TrafficPolicyGVR、ListenerPolicyGVR、DirectResponseGVR、GatewayExtensionGVR、GatewayParametersGVR新增资源的 GVR 需追加到此处测试环境才会安装对应的 CRD。此外该文件还提供GetStructuralSchemasForAllCharts、ApplyDefaults等工具用于从 install/helm/kgateway-crds/templates 加载 CRD 的结构化 schema 并执行默认值填充与未知字段裁剪模拟 API Server 行为。API 编写指南字段注解与类型规范api/README.md 的 API guidelines 部分是所有_types.go文件必须遵守的约定逐条展开如下均可在 gateway_parameters_types.go 中找到对应的源码示例。文档与注解要求所有字段都应包含文档注释以及合适的 json、kubebuilder 注解如果字段存在默认值必须文档化该默认值。例如EnvoyContainer.Image的注释明确写出了可单独覆盖的默认值registry: quay.io/solo-io、repository: envoy-wrapper、tag: kgateway version、pullPolicy: IfNotPresent。可选字段optional的写法使用optional标记使用omitemptyjson 标签使用指针类型如*string除非类型本身有 nil 零值如切片、map。唯一的例外是当字段带默认值kubebuilder:default...时允许使用非指针类型。典型例子是 retries.go 中的Attempts字段// kubebuilder:default1 // kubebuilder:validation:Minimum0 Attempts int32 json:attempts,omitempty它声明默认重试次数为 1因此可以不使用指针。必填字段required的写法使用required标记禁止设置omitemptyjson 标签。例如GatewayParameters.SpecSpec GatewayParametersSpec json:spec与TrafficPolicy.Spec都是必填且未加omitempty。避免指针切片优先使用[]string而不是[]*string避免切片元素为指针。该建议来自上游 kubernetes/code-generator 的已知问题issue #166。仓库中大量字段遵守了这一约定如EnvoyContainer.ExtraArgs []string、Retry.RetryOn []RetryOnCondition。时长字段使用 metav1.Duration时间时长字段统一使用metav1.Duration类型并配合 CEL 校验规则限制取值范围。例如 shared/timeouts.go 中的Timeouts.Request// kubebuilder:validation:Typestring // kubebuilder:validation:MaxLength32 // kubebuilder:validation:XValidation:rulematches(self, ^([0-9]{1,5}(h|m|s|ms)){1,4}$),messageinvalid duration value Request *metav1.Duration json:request,omitemptyretries.go中的PerTryTimeout与BackoffBaseInterval还额外声明了duration(self) duration(1ms)等下限约束。TrafficPolicySpec上甚至有一条跨字段 CEL 规则traffic_policy_types.goretry.perTryTimeout must be less than timeouts.request强制单次重试超时小于整体请求超时。跨字段约束优先用 AtLeastOneOf / ExactlyOneOf当约束跨越一组字段时使用kubebuilder:validation:AtLeastOneOf或kubebuilder:validation:ExactlyOneOf而不是手写 CEL。仓库中的实例包括gateway_parameters_types.go 的GatewayParametersSpeckubebuilder:validation:ExactlyOneOfkube;selfManaged即kube与selfManaged只能二选一gateway_parameters_types.go 的LogFormatkubebuilder:validation:ExactlyOneOfjson;textshared_types.go 的HTTPHeaderkubebuilder:validation:ExactlyOneOfvalue;secretRefshared_types.go 的StringMatcherkubebuilder:validation:ExactlyOneOfexact;prefix;suffix;contains;safeRegexshared_types.go 的HTTPHeaderFilterkubebuilder:validation:AtLeastOneOfset;add;removetraffic_policy_types.go 的APIKeySourcekubebuilder:validation:AtLeastOneOfheader;query;cookie。在 TrafficPolicy API 中复刻 Gateway API 策略为了让策略能够在配置层级的不同位置Gateway、Gateway 的 listener、route 级别挂载kgateway 会把部分 Gateway API 策略复刻进 TrafficPolicy API。README 给出了三条决策准则下面逐一结合源码说明。情形一Gateway API 类型足够时直接嵌入当 Gateway API 的现有类型足以满足需求时直接将其嵌入 TrafficPolicy API。TrafficPolicy的cors是典型例子——直接内嵌了 Gateway API 的HTTPCORSFilter类型。源码见 traffic_policy_types.gotype CorsPolicy struct { // kubebuilder:pruning:PreserveUnknownFields *gwv1.HTTPCORSFilter json:,inline // Disable the CORS filter. // Can be used to disable CORS policies applied at a higher level in the config hierarchy. // optional Disable *shared.PolicyDisable json:disable,omitempty }值得注意的是kgateway 在嵌入的同时扩展了一个disable字段用于关闭配置层级更高处应用的 CORS 策略——这正体现了 TrafficPolicy 作为聚合策略层的价值。情形二注意gateway:experimental标记嵌入 Gateway API 类型前必须判断该类型是否被标记为gateway:experimental。实验性类型可能引入破坏性变更因此不鼓励在 TrafficPolicy API 中嵌入实验性类型如果 Gateway API 类型发生了破坏性变更推荐把变更前的旧版本类型复刻进 TrafficPolicy API而不是把破坏性变更传播到 TrafficPolicy API。这样既隔离了上游实验性 API 的波动又保证了策略 API 的向后兼容。情形三Gateway API 类型不充分时新建自定义类型当 Gateway API 类型不足以表达更高级的需求时应在 TrafficPolicy API 中新建类型而不是嵌入 Gateway API 类型。TrafficPolicy的retry与timeouts就是典型例子——它们分别定义了新类型而非复用 Gateway API 的HTTPRouteRetry与HTTPRouteTimeouts。retry使用的Retry类型定义在独立的 api/v1alpha1/kgateway/retries.go提供的能力远超 Gateway API 原生重试类型RetryOn []RetryOnCondition带枚举校验的重试条件取值包括5xx、gateway-error、reset、connect-failure、envoy-ratelimited、retriable-4xx、refused-stream、retriable-status-codes等Attempts int32默认 1为 0 时禁用重试PerTryTimeout *metav1.Duration单次重试超时含首次尝试须小于全局路由超时StatusCodes []gwv1.HTTPRouteRetryStatusCode额外可重试的 400-599 状态码BackoffBaseInterval *metav1.Duration带完全抖动的指数退避基准间隔默认 25ms退避区间为[0, (2^N-1)*B]且封顶为基准的 10 倍。timeouts使用的Timeouts类型定义在 api/v1alpha1/shared/timeouts.go包含Request从网关到后端的单请求整体超时0 表示禁用与StreamIdle空闲流超时两个字段都通过 CEL 规则校验时长格式与上限。通过这两种模式TrafficPolicy 既与 Gateway API 生态保持了类型层面的兼容与复用又为网关特有能力如分级挂载、禁用覆盖、更细粒度的重试/超时控制保留了独立的演进空间。生成代码的日常维护与验证在 CI 与日常开发中codegen 的维护方式参见 devel/contributing/code-generation.md 与 Makefilemake generated-code -B强制重新生成全部代码clean-gen clean-stamps后无条件执行对应 README 中的步骤 3make generate-all基于 stamp 文件的增量生成目标只在源文件变化时重新生成速度更快make verify运行生成并检查是否有文件变更适合提交 PR 前验证是否忘记提交生成的代码make go-generate-apis只运行仓库中所有go generate指令API 变更时使用make go-generate-mocks只运行 mockgen 指令接口 API 变更时使用。一个实用的工作流是修改_types.go→ 执行make generated-code -B→ 检查 diff 中是否包含新增的zz_generated.deepcopy.go/zz_generated.register.go/ CRD YAML / role.yaml / clientset 变更 → 在 pkg/apiclient/types.go、pkg/apiclient/fake/fake.go 与 test/testutils/crd.go 三处完成注册 → 运行相关单测验证。实战示例从 YAML 反推 GatewayParameters 的字段体系代码生成的 CRD 最终由用户以 YAML 形式消费。以 examples/example-gatewayparameters-stats-matcher.yaml 为例可以直观看到GatewayParameters的字段如何对应到类型定义spec.kube.stats.enabled、routePrefixRewrite、enableStatsRoute、statsRoutePrefixRewrite对应 gateway_parameters_types.go 的StatsConfigmatcher.inclusionList支持prefix、suffix、safeRegex匹配对应StatsMatcher与 shared_types.go 的StringMatcher。spec.kube下的deployment、envoyContainer、sdsContainer、podTemplate、service、serviceAccount、istio、stats以及deploymentOverlay、serviceOverlay、podDisruptionBudget、horizontalPodAutoscaler、verticalPodAutoscaler等 overlay 字段见 GatewayParametersOverlays共同勾勒出 kgateway 数据面动态供给的完整配置面。总结在 kgateway 中新增 API / CRD 是一条清晰、高度自动化的流水线创建版本目录与doc.go→ 按 API 指南编写_types.go→ 运行make generated-code -B生成 deepcopy、注册表、CRD、RBAC 与 clientset → 在 pkg/apiclient/types.go 注册客户端 → 在 pkg/apiclient/fake/fake.go 与 test/testutils/crd.go 注册测试用 CRD。与此同时遵循字段注解规范optional/required、指针、Duration、AtLeastOneOf/ExactlyOneOf并按照直接嵌入、谨慎对待实验类型、按需新建类型三种模式与 Gateway API 生态协同就能保证新增 API 既规范又具备策略层级挂载能力。本文所述步骤与示例文件均可在仓库中直接查阅可作为后续扩展 kgateway API 的实操参考。赞分享API网关云原生微服务【免费下载链接】kgatewayThe Cloud-Native API Gateway and AI Gateway项目地址https://gitcode.com/gh_mirrors/kg/kgateway点击查看免费下载相关推荐Fission CRD 代码生成实战指南从 API 类型定义到 deepcopy 与客户端代码Fission CRD 代码生成实战指南从 API 类型定义到 deepcopy 与客户端代码 导读 Fission 是构建在 Kubernetes 之上的函云原生后端Numba扩展开发教程自定义类型注册、overload重载与低层代码生成API完整指南Numba扩展开发教程自定义类型注册、overload重载与低层代码生成API完整指南 Numba 是一款基于 LLVM 的 NumPy 感知动态 Pytho编译器高性能计算Win11Debloat勾选即用的一键 Windows 精简工具附 3 套可直接抄的配置包Win11Debloat勾选即用的一键 Windows 精简工具附 3 套可直接抄的配置包 先说结论Win11Debloat 是一个 PowerShell桌面应用CLI上一篇Theo CLI工具完全指南命令行操作设计令牌的10个技巧下一篇5个高级技巧彻底掌握BililiveRecorder的隐藏功能创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

关于恒美微站

恒美微站专注于为个体商户、工作室提供极简自助建站服务,让每个人都能轻松拥有专业网站。

快速链接

  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心

服务项目

  • 可视化建站
  • 拖拽编辑
  • 主题定制
  • SEO 优化
  • 网站托管

联系方式

  • 📍 地址:北京市朝阳区建国路 88 号
  • 📞 电话:400-888-8888
  • ✉️ 邮箱:info@hmyw.cn
  • 🕐 时间:周一至周日 9:00-18:00

© 2024 恒美微站 hmyw.cn 版权所有 | 京 ICP 备 12345678 号