Kubernetes编程——client-go基础—— 深入 API Machinery —— Scheme
深入 API Machinery —— Scheme
https://github.com/kubernetes/apimachinery/tree/release-1.27/pkg/runtime
1、scheme
我理解意思是说: Scheme 是 Kubernetes client-go 库中的一个核心组件,用于管理和注册 API 对象的信息和类型。它为 client-go 提供了一种机制,通过其中的注册表来了解可用的 API,并提供类型转换、编组和解组数据的能力。
Scheme 主要有以下几个重要的职责和特性:
-
- 类型注册:通过 Scheme,可以将自定义的类型注册为 Kubernetes API 对象的类型。这些自定义类型可以是与 Kubernetes API 中的资源对象(如 Pod、Deployment 等)对应的结构体,或者是扩展类型。注册后的类型可以在 client-go 的各种操作中使用。
- 编组和解组数据:Scheme 提供了编组(序列化)和解组(反序列化) Kubernetes API 对象的数据的功能。它可以将结构体或 JSON/yaml 格式的数据转换为 Kubernetes API 对象,并且可以将 Kubernetes API 对象转换为结构体或 JSON/yaml 格式的数据。
- API 版本管理:Scheme 还可以管理和跟踪 Kubernetes 中的 API 版本。它可以识别和管理多个 API 组以及每个组的不同版本,以便正确地处理和转换对应的 API 对象。
- 自定义扩展:通过 Scheme,还可以实现自定义扩展,将自定义类型与 Kubernetes API 对象进行关联。这使得可以使用自定义类型来表示 Kubernetes API 扩展中定义的字段或行为。
Scheme 对象与 Kubernetes API 中的资源类型、自定义资源类型以及任何扩展类型之间的映射关系是由各个 Kubernetes 客户端库(如 clientset)根据当前运行环境的配置和配置文件进行自动化初始化和管理的。因此,在使用 Scheme 时,通常不需要手动操作或修改其中的配置,而是由客户端库自动处理。
2、scheme如何将golang数据类型和GVK关联
我理解意思是说: 在 Kubernetes 中,k8s apimachinery scheme 是一种用于实现 Golang 类型与 GVK(Group, Version, Kind)之间建立映射关系的工具。通过 scheme,可以让 Kubernetes 运行时系统能够根据 GVK 信息,正确地处理和转换资源对象。
具体来说,在 Golang 中使用 scheme 实现类型与 GVK 之间的映射,需要进行以下步骤:
-
- 定义自定义的对象类型:首先,在 Golang 代码中定义自定义对象类型,即实现了 runtime.Object 接口的结构体。这些自定义类型通常用于表示 Kubernetes 中的资源对象,如 Pod、Deployment 等。
- 注册对象类型:通过将自定义对象类型与其对应的 GVK 进行注册,将其添加到 scheme 中。这可以使用 Register 函数来实现,例如 scheme.Scheme().AddKnownTypes()。
- 解析和转换:在 Kubernetes 运行时系统中,当需要处理 Kubernetes 资源对象时,scheme 会根据 GVK 信息将相应类型的对象进行解析和转换。通过调用相应的函数,可以将从 API Server 接收到的 JSON 数据转换为 Golang 中的相应类型,并在需要时执行对象之间的转换。
- 序列化和反序列化:在与 API Server 交互时,scheme 还负责将 Golang 中的对象序列化成 JSON 格式的数据,并在需要时将 JSON 数据反序列化为相应的对象。
在 client-go 客户端集合中包含了一些预定义的 Scheme,位于 https://github.com/kubernetes/client-go/tree/release-1.27/kubernetes/scheme 包中,其中预注册了所有的 Kubernetes 核心类型。事实上,所有通过 client-gen 代码生成器生成的客户端集合中,都包含了一个名为 scheme 的子包,里面注册了该客户端集合中所有类型的所有组和所有版本。