如何通过client-go和golang检索kubernetes指标

我想通过golang访问kubernetes的指标.类似于每个节点的cpu和内存,以及pod和/或命名空间的相同内容.

我有点迷失在这里,因为文档不是那么清晰.

我了解到有heapster(根据github repo不推荐使用).还有度量服务器和休息api.

我在哪里可以找到一些开始的例子?我不想在kubernetes中安装其他应用,包或服务.我想尽可能地获取本地信息.
使用client-go和golang访问这些信息的首选方法是什么?

最佳答案 正如问题中所解释的那样,
the documentations对初学者来说并不清楚.即使是go-client示例也会检索数据,我想获得Type支持.

正如above answer所解释的那样,您可以用JSON格式的[]字节获取数据.这就是我做到的.

package main

import (
    "encoding/json"
    "fmt"
    "time"

    "k8s.io/client-go/kubernetes"
    "k8s.io/client-go/rest"
)

// PodMetricsList : PodMetricsList
type PodMetricsList struct {
    Kind       string `json:"kind"`
    APIVersion string `json:"apiVersion"`
    Metadata   struct {
        SelfLink string `json:"selfLink"`
    } `json:"metadata"`
    Items []struct {
        Metadata struct {
            Name              string    `json:"name"`
            Namespace         string    `json:"namespace"`
            SelfLink          string    `json:"selfLink"`
            CreationTimestamp time.Time `json:"creationTimestamp"`
        } `json:"metadata"`
        Timestamp  time.Time `json:"timestamp"`
        Window     string    `json:"window"`
        Containers []struct {
            Name  string `json:"name"`
            Usage struct {
                CPU    string `json:"cpu"`
                Memory string `json:"memory"`
            } `json:"usage"`
        } `json:"containers"`
    } `json:"items"`
}

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() {
    // creates the in-cluster config
    // https://github.com/kubernetes/client-go/tree/master/examples#configuration
    config, err := rest.InClusterConfig()
    if err != nil {
        panic(err.Error())
    }
    // creates the clientset
    clientset, err := kubernetes.NewForConfig(config)
    if err != nil {
        panic(err.Error())
    }
    var pods PodMetricsList
    err = getMetrics(clientset, &pods)
    if err != nil {
        panic(err.Error())
    }
    for _, m := range pods.Items {
        fmt.Println(m.Metadata.Name, m.Metadata.Namespace, m.Timestamp.String())
    }
}

安装以下Go包:go get -u k8s.io/client-go/kubernetes k8s.io/client-go/rest

您可以使用以下端点来根据需要检索数据;

>节点:apis / metrics.k8s.io / v1beta1 / nodes
> Pods:apis / metrics.k8s.io / v1beta1 / pods
>默认命名空间的Pod:apis / metrics.k8s.io / v1beta1 / namespaces / default / pods
>特定Pod:/apis/metrics.k8s.io/v1beta1/namespaces/default/pods/\u0026lt;POD-NAME\u0026gt;

注意:您可能需要在json.Unmarshal之前更改类型.您可以仅为您感兴趣的字段定义类型.

点赞