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

时间:2018-08-26 19:36:21

标签: go kubernetes metrics heapster

我想使用golang从kubernetes访问指标。每个节点的cpu和内存之类的内容,以及pod和/或名称空间的内容。

我有点迷失在这里,因为文档不够清晰。

我了解到有heapster(根据github存储库已弃用)。还有metric server和一个REST API。

在哪里可以找到一些入门示例?我不想在kubernetes中安装其他应用程序,程序包或服务。我想获得尽可能本地化的信息。 使用client-go和golang访问这些信息的首选方式是什么?

3 个答案:

答案 0 :(得分:1)

如问题中所述,the documentations对于初学者来说并不明确。即使是go-client示例检索数据,我也想获得Type支持。

above answer所述,您可以JSON格式获取[] byte数据。这就是我做的。

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
  • 豆荚:apis/metrics.k8s.io/v1beta1/pods
  • default名称空间的窗格:apis/metrics.k8s.io/v1beta1/namespaces/default/pods
  • 特定Pod:/apis/metrics.k8s.io/v1beta1/namespaces/default/pods/<POD-NAME>

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

答案 1 :(得分:1)

有一个更好的API:https://github.com/kubernetes/metrics。使用此功能,您不必创建数据结构或处理行字节切片。

import (
  metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
  metricsv "k8s.io/metrics/pkg/client/clientset/versioned"
  ...
)

...
clientset, err := metricsv.NewForConfig(config)
podMetricsList, err := clientset.MetricsV1beta1().PodMetricses("").List(metav1.ListOptions{})

答案 2 :(得分:0)

下面是使用REST API查询节点指标并返回JSON格式的[] byte的示例。将“节点”替换为“荚”,以获取荚/容器指标。

data, err := clientset.RESTClient().Get().AbsPath("apis/metrics.k8s.io/v1beta1/nodes").DoRaw()