package main import ( "ClientGo/utils" "context" "fmt" corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/client-go/kubernetes/scheme" "k8s.io/client-go/rest" "log" ) /** @author: sre @date: 2022/8/10 0010 @desc: RESTClient 是所有客户端的父类,这也是为啥前面说,它是最基础的客户端的原因。 它提供了 RESTful 对应的方法的封装,如:Get()、Put()、Post()、Delete() 等。通过这些封装发方法与 Kubernetes APIServer RESTful API 进行交互。 因为它是所有客户端的父类,所以它可以操作 Kubernetes 内置的所有资源对象以及 CRD。 **/ // GetRESTClient RESTClient 其实就是底层使用 net/http 库,将调用 Kubernetes APIServer 的 API 请求,进行了封装,对参数和返回结果进行了序列化及反序列化 func GetRESTClient() (*rest.RESTClient, error) { config, err := utils.GetConfig() if err != nil { log.Println("GetConfig 失败: ", err.Error()) return nil, err } // 配置 API 路径 config.APIPath = "api" // 配置分组版本 config.GroupVersion = &corev1.SchemeGroupVersion // 配置数据的编解码器 config.NegotiatedSerializer = scheme.Codecs // 实例化 RESTClient restClient, err := rest.RESTClientFor(config) if err != nil { //panic(err.Error()) log.Println("实例化 RESTClient 失败: ", err.Error()) return nil, err } return restClient, nil //它虽然可以操作 Kubernetes 的所有资源对象,但是使用起来确实比较复杂,需要配置的参数过于繁琐,因此,为了更优雅的更方便的与 Kubernetes APIServer 进行交互,则需要进一步的封装。 } // GetRes from GetRESTClient func GetRes(namespace string) { // 定义返回接收值 restClient, err := GetRESTClient() if err != nil { log.Println("获取客户端失败: ", err.Error()) return } // 声明空结构体 result := &corev1.PodList{} err = restClient.Get(). Namespace(namespace). // 查询的 Namespace Resource("pods"). // 查询的资源类型 VersionedParams(&metav1.ListOptions{Limit: 100}, scheme.ParameterCodec). // 参数及序列化工具 Do(context.TODO()). // 发送请求 Into(result) // 写入返回值 if err != nil { panic(err.Error()) } // 输出返回结果 for _, res := range result.Items { fmt.Println(res.GenerateName) fmt.Printf("namespace: %v, name: %v, status: %v\n", res.Namespace, res.Name, res.Status.Phase) } }