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 定义创建相应的类型和方法:

  根据 Kubernetes API 的定义,手动编写相应的类型和方法。例如,可以创建一个名为 MyResource 的类型,并为其添加相应的方法,Get()Create()Delete()等。这样,就可以通过 MyResource 类型来访问自定义资源。

(3)使用客户端集合并调用自定义资源的 API:

  使用强类型客户端时,可以通过调用相应的方法来访问自定义资源。例如,可以使用 MyResource.Get() 方法获取自定义资源的详细信息。同时,也可以根据需要添加更多的方法和逻辑。

  总之,client-go 和强类型客户端都是访问 Kubernetes API 的常用方法。client-go 提供了动态访问 API 的能力,而强类型客户端提供了更清晰、更易于使用的 API 接口。在实际应用中,可以根据需要选择适合的方法来访问自定义资源。

posted @ 2023-08-21 14:55  左扬  阅读(55)  评论(0编辑  收藏  举报
levels of contents