package ClientSet import ( "ClientGo/utils" "context" "fmt" v1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/client-go/kubernetes" "log" "reflect" ) /** @author: sre @date: 2022/8/10 0010 @desc: RESTClient虽然可以操作 Kubernetes 的所有资源对象,但是使用起来确实比较复杂,需要配置的参数过于繁琐,因此,为了更优雅的更方便的与 Kubernetes APIServer 进行交互,则需要进一步的封装。 前面有过介绍,ClientSet 是基于 RESTClient 的封装,同时 ClientSet 是使用预生成的 API 对象与 APIServer 进行交互的,这样做更方便进行二次开发。 ClientSet 是一组资源对象客户端的集合,例如负责操作 Pods、Services 等资源的 CoreV1Client,负责操作 Deployments、DaemonSets 等资源的 AppsV1Client 等。通过这些资源对象客户端提供的操作方法,即可对 Kubernetes 内置的资源对象进行 Create、Update、Get、List、Delete 等操作。 **/ // GetClientSet ClientSet 是一组资源对象客户端的集合,例如负责操作 Pods、Services 等资源的 CoreV1Client,负责操作 Deployments、DaemonSets 等资源的 AppsV1Client 等。 // 通过这些资源对象客户端提供的操作方法,即可对 Kubernetes 内置的资源对象进行 Create、Update、Get、List、Delete 等操作。 func GetClientSet() (*kubernetes.Clientset, error) { config, err := utils.GetConfig() if err != nil { log.Println("GetConfig 失败: ", err.Error()) return nil, err } // 实例化 ClientSet clientset, err := kubernetes.NewForConfig(config) if err != nil { log.Println("实例化 ClientSet 失败: ", err.Error()) return nil, err } return clientset, nil } // ListCms 列出所有的 ConfigMap func ListCms(namespace string) (*v1.ConfigMapList, error) { clientSet, err := GetClientSet() if err != nil { log.Println("GetClientSet 失败: ", err.Error()) return nil, err } configMaps, err := clientSet.CoreV1().ConfigMaps(namespace).List(context.TODO(), metav1.ListOptions{}) if err != nil { return nil, err } return configMaps, err //for _, cm := range configMaps.Items { // fmt.Printf("configName: %v, configData: %v \n", cm.Name, cm.Data) //} //return nil } func ListNodes() (*v1.NodeList, error) { clientSet, err := GetClientSet() if err != nil { log.Println("GetClientSet 失败: ", err.Error()) return nil, err } nodeList, err := clientSet.CoreV1().Nodes().List(context.TODO(), metav1.ListOptions{}) if err != nil { return nil, err } return nodeList, err //for _, node := range nodeList.Items { // fmt.Printf("nodeName: %v, status: %v", node.GetName(), node.GetCreationTimestamp()) //} //return nil } func ListPods(namespace string) (*v1.PodList, error) { clientSet, err := GetClientSet() if err != nil { log.Println("GetClientSet 失败: ", err.Error()) return nil, err } pods, err := clientSet.CoreV1().Pods(namespace).List(context.TODO(), metav1.ListOptions{}) if err != nil { return nil, err } return pods, nil //for _, v := range pods.Items { // fmt.Printf("namespace: %v podname: %v podstatus: %v \n", v.Namespace, v.Name, v.Status.Phase) //} } func ListDeployment(namespace string) error { clientSet, err := GetClientSet() if err != nil { log.Println("GetClientSet 失败: ", err.Error()) return err } deployments, err := clientSet.AppsV1().Deployments(namespace).List(context.TODO(), metav1.ListOptions{}) if err != nil { return err } fmt.Println(reflect.TypeOf(deployments)) for index, deployment := range deployments.Items { //fmt.Println(reflect.TypeOf(deployment)) fmt.Printf("deployment %v: %v \n", index, deployment) } //fmt.Println("deployments: ", deployments) //for _, v := range deployments.Items { // fmt.Printf("deploymentname: %v, available: %v, ready: %v", v.GetName(), v.Status.AvailableReplicas, v.Status.ReadyReplicas) //} return nil }