如何从集群内客户端访问api调用中从kubectl描述pod <namespace>中获取所有数据

时间:2019-09-10 13:50:38

标签: go kubernetes kubectl client-go

我需要获取一些pod信息,这些信息将用于将在集群中运行的某些单元测试。我需要kubectl描述po给出的所有信息,但是需要来自in cluster api调用。

我有一些工作代码,可以对apis / metrics.k8s.io / v1beta1 / pods进行api调用,并且已经在minikube上安装了metrics-server以进行测试,并且一切正常,并提供如下输出:

Namespace: kube-system
Pod name: heapster-rgnlj
SelfLink: /apis/metrics.k8s.io/v1beta1/namespaces/kube-system/pods/heapster-rgnlj
CreationTimestamp: 2019-09-10 12:27:13 +0000 UTC
Window: 30s
Timestamp: 2019-09-10 12:26:23 +0000 UTC
Name: heapster
Cpu usage: 82166n
Mem usage: 19420Ki 
...
func getMetrics(clientset *kubernetes.Clientset, pods *PodMetricsList) error {
    data, err := clientset.RESTClient().Get().AbsPath("apis/metrics.k8s.io/v1beta1/pods").DoRaw()
    if err != nil {
        return err
    }
    err = json.Unmarshal(data, &pods)
    return err
}

func main() {

    config, err := rest.InClusterConfig()
    if err != nil {
        fmt.Println(err)
    }
    // creates the clientset
    clientset, err := kubernetes.NewForConfig(config)
    if err != nil {
        fmt.Println(err)
    }
    var pods PodMetricsList
    err = getMetrics(clientset, &pods)
    if err != nil {
        fmt.Println(err)
    }

    for _, m := range pods.Items {

        fmt.Print("Namespace: ", m.Metadata.Namespace, "\n", "Pod name: ", m.Metadata.Name, "\n", )
        fmt.Print("SelfLink: ", m.Metadata.SelfLink, "\n", "CreationTimestamp: ", m.Metadata.CreationTimestamp, "\n", )
        fmt.Print("Window: ", m.Window, "\n", "Timestamp: ", m.Timestamp, "\n", )

        for _, c := range m.Containers {
            fmt.Println("Name:", c.Name)
            fmt.Println("Cpu usage:", c.Usage.CPU)
            fmt.Println("Mem usage:", c.Usage.Memory, "\n")
...

正如我所说,我真正需要的是您通过“ describe pods”类型调用得到的东西。在浏览了kubernetes的源代码之后,这个NodeDescriber看起来像是正确的函数类型,但是我对于如何集成/实现它以获得期望的结果有点困惑。

kubernetes / pkg / printers / internalversion / describe.go

4f2d7b9中的第2451行

func(d * NodeDescriber)描述(名称空间,名称字符串,describerSettings等)

我是Go的新手,对kubernetes并不特别熟悉。 任何有关如何执行此操作的指针将不胜感激。

2 个答案:

答案 0 :(得分:2)

从staging / src / k8s.io / kubectl / pkg / describe / versioned / describe.go中查看describePodDescribe函数,应该为您提供了一个更好的方法。并且由于DescribePodDescriber是公开的,因此您可以在用例中重复使用它们。

您可以将其与具有CoreV1Client函数的Pods结合使用,该函数将返回具有PodInterface函数的List,该函数将返回{{3 }}对象用于给定的名称空间。

那些pod对象将提供Pod函数所需的名称,名称空间是已知的,并且Describe只是一种结构类型,您可以内联以启用在{{ 3}}输出。

使用describe.DescriberSettings函数将只列出一次pod。如果您希望定期更新此列表,则可能需要查看Reflector和Informer模式。两者都主要在Describe包中实现,而文档在List部分中简要说明了这一概念。

希望这会有所帮助。

答案 1 :(得分:0)

我没有尝试,但是我建议从以下开始:

1。。使用带有--verbosity选项的kubectl查看完整的api请求

 kubectl describe pod xxx -v=8 

喜欢:

  GET https://xx.xx.xx.xx:6443/api/v1/namespaces/default/events?fieldSelector=involvedObject.uid%3Ddd77c4aa-28e6-4bf0-8dfe-0d8610cbe9c9%2CinvolvedObject.name%3Dmy-app%2CinvolvedObject.namespace%3Ddefault

它包含与您的POD相关的字段: fieldSelector = involvedObject.uid,涉及的对象。名称,涉及的对象。名称空间

2。。我想一个好的开始是从github func describePod开始的代码。

希望获得帮助。