You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

79 lines
2.6 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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)
}
}