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