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

sil*_*ter 6 metrics go kubernetes heapster

我想使用golang从kubernetes访问指标。每个节点的CPU和内存之类的元素,以及Pod和/或名称空间的属性。

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

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

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

gnv*_*nvk 9

有一个更好的 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{})
Run Code Online (Sandbox Code Playgroud)

  • 现在,`.List()`接受一个`context.Context`参数:`clientset.MetricsV1beta1().PodMetricses("").List(context.TODO(), metav1.ListOptions{})` (2认同)

小智 6

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

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


gih*_*uka 5

正如问题中所解释的,初学者的文档不清楚。即使 go-client 示例检索数据,我也想获得 Type 支持。

正如上面的回答所解释的那样,您可以以 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())
    }
}
Run Code Online (Sandbox Code Playgroud)

安装以下 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命名空间的Pod :apis/metrics.k8s.io/v1beta1/namespaces/default/pods
  • 具体吊舱: /apis/metrics.k8s.io/v1beta1/namespaces/default/pods/<POD-NAME>

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