Kubernetes编程——client-go基础—— 深入 API Machinery —— REST 映射

深入 API Machinery —— REST 映射

https://github.com/kubernetes/client-go/blob/release-1.27/restmapper/

  GVK 与 GVR 之间的映射关系被称为 REST 映射。

我理解意思是说: 在 Kubernetes 中,RESTMapping(REST 映射)用于将 GroupVersionKind(GVK)与 GroupVersionResource(GVR)之间建立映射关系。

    1. GVK 是 API 对象的唯一标识,包括 API 组、版本和资源类型。
    2. GVR 是 API 资源的标识,包括 API 组、版本和资源类型的名称。

REST 映射是 Kubernetes 提供的 API 功能之一,它负责处理客户端到服务器的 API 请求和响应,并确保请求发送到正确的 API 资源上。通过 REST 映射,客户端可以通过 GVK 来指定要操作的资源类型,然后 REST 映射会将其转换为服务器理解的 GVR 形式。

RESTMapping 对象包含以下属性:

    1. GroupVersionKind (GVK):指定要操作的资源类型的 API 组、版本和类型信息。
    2. GroupVersionResource (GVR):指定要操作的资源类型的 API 组、版本和资源名称信息。
    3. Scope:指定资源的作用范围,可以是 "Cluster" 或 "Namespaced",表示资源是集群范围的还是命名空间范围的。
    4. Kind:表示资源类型的字符串,例如 "Pod"、"Deployment" 等。
    5. APIVersion:表示资源类型的 API 版本,例如 "v1"、"apps/v1" 等。
    6. Resource:表示资源类型的字符串,例如 "pods"、"deployments" 等。

通过 RESTMapping,客户端可以根据 GVK 获取与其关联的 GVR,从而发送正确的 API 请求以操作相应的资���。这对于构建 Kubernetes 客户端或开发 Kubernetes 控制器等应用程序非常有用,因为它们需要与不同的 API 资源进行交互。

需要注意的是,RESTMapping 是根据已知的 Kubernetes API 服务器上的信息生成的,并且可能随着各个 Kubernetes 集群之间的配置和版本而有所不同。因此,要正确地进行 REST 映射,需要通过适当的方式与 Kubernetes API 服务器进行交互,获得有关 GVK 和 GVR 的准确信息。

RestMapper 是一个 Golang 接口,用于请求一个 GVK 所对应的 GVR,以下展示了如何根据给定的 GroupKind 和版本信息创建一个 RESTMapping 的实例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//
//https://github.com/kubernetes/client-go/blob/release-1.27/restmapper/discovery.go#L285
//
func (d *DeferredDiscoveryRESTMapper) RESTMapping(gk schema.GroupKind, versions ...string) (m *meta.RESTMapping, err error) {
    del, err := d.getDelegate()
    if err != nil {
        return nil, err
    }
    m, err = del.RESTMapping(gk, versions...)
    if err != nil && !d.cl.Fresh() {
        d.Reset()
        m, err = d.RESTMapping(gk, versions...)
    }
    return
}

其中,RESTMapping 类型的定义如下:

1
2
3
4
5
6
7
8
type RESTMapping struct {
    GroupVersionKind    schema.GroupVersionKind
    GroupVersionResource schema.GroupVersionResource
    Resource            schema.GroupVersionResource
    Scope               meta.RESTScope
    Kind                string
    APIVersion          string
}

RESTMapper 接口有很多种不同的实现。对于客户端应用来说,最重要的一种实现是基于发现机制的 DeferredDiscoveryRESTMapper。它使用来自 Kubernetes API 服务器的发现信息动态地创建 REST 映射。

1
2
3
4
5
6
7
8
9
10
11
12
//
// https://github.com/kubernetes/client-go/blob/release-1.27/restmapper/discovery.go#L179
//
// DeferredDiscoveryRESTMapper is a RESTMapper that will defer
// initialization of the RESTMapper until the first mapping is
// requested.
//
type DeferredDiscoveryRESTMapper struct {
    initMu   sync.Mutex
    delegate meta.RESTMapper
    cl       discovery.CachedDiscoveryInterface
}      
posted @   左扬  阅读(242)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
levels of contents
点击右上角即可分享
微信分享提示