Kubernetes编程—— 开发者眼中的自定义资源
开发者眼中的自定义资源
在 Golang 中可以使用多种客户端来访问自定义资源。
一、使用 client-go 动态客户端
k8s.io/client-go/dynamic 提供的动态客户端的设计使其对 GVK(Group, Version, Kind)完全无感知,它只依赖于 Unstructured 类型。Unstructured 是一个简单的封装,用于处理 JSON 解码及其输出。
由于动态客户端不使用 Scheme 或 RESTMapper,开发者需要手动提供一种方式来描述资源的类型信息。通常情况下,这可以通过提供一个实现了 rest.RESTMapper
接口的对象来实现。
这种设计使得 dynamic
客户端非常轻量且易于使用,但它也带来了一些限制。例如,由于它不使用 Scheme,因此无法利用 Kubernetes API 中的一些高级功能,如对象验证、自定义字段等。
总的来说,dynamic
客户端适用于那些只需要处理 JSON 数据,并且不需要使用 Kubernetes API 中的高级功能的场景。对于需要更复杂功能的应用程序,可能需要使用更强大的 Kubernetes 客户端,如 client-go
的 typed
包。
schema.GroupVersionResource{ Group: "apps", Version: "v1", Resource: "deployments", }
如果系统中存在 REST 客户端的配置,只需要一行代码就可以创建一个动态客户端,这行代码创建了一个动态客户端。
client, err := NewForConfig(cfg)
1、这行代码创建了一个动态客户端。cfg 是一个包含配置信息的对象,通常是一个 rest.Config 类型的对象,它包含了与 Kubernetes API 服务器通信所需的信息,如 URL、认证信息等。
2、NewForConfig 函数根据提供的配置信息创建一个 dynamic.Interface 对象,该对象提供了与 Kubernetes API 进行动态交互的方法。
访问特定 GVR 的 REST 接口也很简单:
client.Resource(gvr).Namespace(namespace).Get(name, options)
1、client.Resource(gvr):调用客户端的 Resource 方法并传入一个 schema.GroupVersionResource 类型的参数 gvr。这告诉客户端要操作的资源类型。
2、Namespace(namespace):在调用 Namespace 方法并传入命名空间 namespace。这指定了要访问的命名空间,对于命名空间隔离的资源,这是必要的。
3、Get(name, options):最后,调用 Get 方法并传入资源名称 name 和选项 options。这表示要获取具有给定名称的特定资源。
通过这种方式,您可以轻松地创建一个动态客户端并访问特定 GVR 的 REST 接口,而无需了解资源的具体结构或手动构建请求。这对于与 Kubernetes API 进行高级交互非常有用,尤其是当处理不同类型的资源和需要进行自定义操作时。
二、使用强类型的客户端
- kubernetes-sigs/controller-runtime 提供的客户端,在 Kubebuilder 和 Operator SDK 广泛使用。
- https://pkg.go.dev/sigs.k8s.io/controller-runtime#section-readme
- https://github.com/kubernetes-sigs/controller-runtime
- client-gen 生成的客户端,与 k8s.io/client-go/kubernetes 中使用的一样。
强类型客户端不适用 map[string]interface{} 这样的通用数据结构,而是为每种 GVK 都采用各不相同的专用的实际 Go 语言类型。它们使用起来更方便,并极大的提高了类型安全,代码也更加简洁可读。缺点是这样做不够灵活,因为所有需要处理的类型都必须在编译器就确定下来了,这样的客户端需要通过工具去生成,流程上增加了额外的复杂度。
选择用哪一种客户端主要取决于所写的代码上下文,尤其是逻辑复杂度和具体的需求。
强类型客户端是一种手动编写的客户端,可以根据 API 定义生成相应的类型和方法。使用强类型客户端可以提供更清晰、更易于使用的 API 接口,同时也可以避免一些潜在的问题。
以下是使用强类型客户端访问自定义资源的一般步骤:
(1)导入所需的包:
import ( "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" )
(2)根据 API 定义创建相应的类型和方法:
MyResource
的类型,并为其添加相应的方法,Get()
, Create()
, Delete()
等。这样,就可以通过 MyResource
类型来访问自定义资源。(3)使用客户端集合并调用自定义资源的 API:
使用强类型客户端时,可以通过调用相应的方法来访问自定义资源。例如,可以使用 MyResource.Get()
方法获取自定义资源的详细信息。同时,也可以根据需要添加更多的方法和逻辑。
总之,client-go 和强类型客户端都是访问 Kubernetes API 的常用方法。client-go 提供了动态访问 API 的能力,而强类型客户端提供了更清晰、更易于使用的 API 接口。在实际应用中,可以根据需要选择适合的方法来访问自定义资源。