Add new GroupVersionResource method to Kubernetes types

mjqavswn  于 6个月前  发布在  Kubernetes
关注(0)|答案(6)|浏览(86)

你想添加什么?
A GroupVersionResource() schema.GroupVersionResource 被添加到所有表示Kubernetes对象的类型中,包括核心和(鼓励)CRDs。

为什么需要这个?

目前,没有从对象到资源的好方法。这使得使用动态客户端、 #106846 等变得具有挑战性。
尽管如此,所有这些信息都已经知道并用于其他代码生成工具,如informers和listers。然而,它并不容易从外部获得。
我想生成的代码示例:

var gatewayclassesGroupVersionResource = schema.GroupVersionResource{Group: GroupVersion.Group, Version: GroupVersion.Version, Resource: "gatewayclasses"}

func (GatewayClass) GroupVersionResource() schema.GroupVersionResource {
       return gatewayclassesGroupVersionResource
}

var httproutesGroupVersionResource = schema.GroupVersionResource{Group: GroupVersion.Group, Version: GroupVersion.Version, Resource: "httproutes"}

func (HTTPRoute) GroupVersionResource() schema.GroupVersionResource {
       return httproutesGroupVersionResource
}

var gatewaysGroupVersionResource = schema.GroupVersionResource{Group: GroupVersion.Group, Version: GroupVersion.Version, Resource: "gateways"}

func (Gateway) GroupVersionResource() schema.GroupVersionResource {
       return gatewaysGroupVersionResource
}

我原型了一个register-gen的分支,用于生成此代码,但失望地发现k/k实际上并未使用此代码,因此我们可能需要采用不同的方法。

liwlm1x9

liwlm1x92#

在分配之前,让我们澄清一些事情。

  • Kubernetes对象可能具有分配的GroupVersionKind(GVK),要找到GVR <-> GVKMap,您需要一个RESTMapper
  • 一个对象可以有多个GVRs,至少是它的单数和复数形式,有时还有简短版本。例如,deploymentsdeploymentdeploy
  • 计算GVK <-> GVR的Map并不简单,通常需要网络往返到发现端点。

您是否尝试过RESTMapper并看看它是否符合您的用例?谢谢。

i7uaboj4

i7uaboj43#

你能帮我解释一下为什么给定的类型没有一个GVR吗?生成的informer和listener客户端(可能还有更多)已经为给定类型编码了资源(否则你需要一个RESTMapper来使用基本客户端,对吧?)

a64a0gku

a64a0gku4#

/assign
/triage accepted

xcitsw88

xcitsw885#

/assign @jpbetz
我在使用类型解析器时也遇到了这类问题。
资源名称与存储一起在API服务器处理器中注册,而不是作为类型定义的一部分。如果我们要在不进行往返发现的情况下查找它,我们需要扩展模式注册以包含其GVRs。

h7appiyu

h7appiyu6#

一般来说,GVR:GVK基数是N:1(有许多种类的Scale资源),但对于根资源始终是1:1(除非我知道有例外情况)。我对此问题感兴趣的PR在某种程度上仍然能够处理这种微妙之处。

相关问题