10

我想用 golang 从 kubernetes 访问指标。每个节点的 cpu 和内存以及 pod 和/或命名空间的相同。

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

我了解到有heapster(根据 github repo 已弃用)。还有metric server一个rest api。

我在哪里可以找到一些开始的例子?我不想在 Kubernetes 中安装另一个应用程序、包或服务。我想尽可能地获得本地信息。使用 client-go 和 golang 访问这些信息的首选方式是什么?

4

4 回答 4

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{})
于 2019-09-26T08:49:59.893 回答
6

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

data, err := clientset.RESTClient().Get().AbsPath("apis/metrics.k8s.io/v1beta1/nodes").DoRaw()
于 2018-10-09T10:00:16.947 回答
5

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

正如上面的答案所解释的,您可以获取 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
  • 命名空间的 Pod defaultapis/metrics.k8s.io/v1beta1/namespaces/default/pods
  • 特定吊舱:/apis/metrics.k8s.io/v1beta1/namespaces/default/pods/<POD-NAME>

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

于 2019-02-01T12:38:40.760 回答
0

从最新版本的 client-go 开始,您必须将 Context 添加到DoRaw(). 例如使用context.TODO()导入上下文库。

于 2021-09-12T23:33:17.863 回答