package main

import (
    "context"
    "fmt"
    "log"

    metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
    "k8s.io/client-go/kubernetes"
    "k8s.io/client-go/tools/clientcmd"
)

func main() {
    configPath := "config"                                        // 配置文件路径
    config, err := clientcmd.BuildConfigFromFlags("", configPath) // 从配置文件创建Kubernetes客户端配置
    if err != nil {
        log.Fatal(err)
    }

    clientset, err := kubernetes.NewForConfig(config) // 使用Kubernetes客户端配置创建Kubernetes客户端集
    if err != nil {
        log.Fatal(err)
    }

    nodeList, err := clientset.CoreV1().Nodes().List(context.TODO(), metav1.ListOptions{}) // 获取集群中所有节点的信息列表
    if err != nil {
        log.Fatal(err)
    }

    for _, node := range nodeList.Items {
        fmt.Printf("%s\t%s\t%s\t%s\t%s\t%s\t%s\n",
            node.Name,
            node.Status.Phase,
            node.Status.NodeInfo.OSImage,
            node.Status.NodeInfo.KubeletVersion,
            node.Status.NodeInfo.OperatingSystem,
            node.Status.NodeInfo.Architecture,
            node.CreationTimestamp,
        )
    }

    // 获取名称空间
    namespaceList, err := clientset.CoreV1().Namespaces().List(context.TODO(), metav1.ListOptions{})
    if err != nil {
        log.Fatal(err)
    }
    for _, namespace := range namespaceList.Items {
        fmt.Printf("%s\t%s\t%s\n", namespace.Name, namespace.Status.Phase, namespace.CreationTimestamp)
    }

    fmt.Println("serviec: ---------------------------------")
    // 获取service列表
    serviceList, err := clientset.CoreV1().Services("").List(context.TODO(), metav1.ListOptions{})
    if err != nil {
        log.Fatal(err)
    }
    for _, service := range serviceList.Items {
        fmt.Printf("%s\t%s\t%s\n",
            service.Name,
            service.Spec.Type,
            service.CreationTimestamp,
        )
    }

    // 获取deployment列表 Deployments("名称空间")
    deploymentList, err := clientset.AppsV1().Deployments("").List(context.TODO(), metav1.ListOptions{})
    if err != nil {
        log.Fatal(err)
    }
    for _, deployment := range deploymentList.Items {

        fmt.Printf("%s\t%s\t%s\t%s\n",
            deployment.Namespace,
            deployment.Name,
            deployment.Spec.Template.Name,
            deployment.CreationTimestamp,
        )
    }
}