代码之家  ›  专栏  ›  技术社区  ›  silverfighter

如何通过客户端go和golang检索kubernetes度量

  •  4
  • silverfighter  · 技术社区  · 6 年前

    我有点迷路了,因为文件不够清楚。

    我知道 heapster metric server 以及rest api。

    我在哪里可以找到一些例子开始?我不想在kubernetes中安装其他应用程序、包或服务。我想得到尽可能地道的信息。 与客户go和golang一起访问这些信息的首选方式是什么?

    2 回复  |  直到 6 年前
        1
  •  4
  •   gihanchanuka    6 年前

    如问题所述, the documentations 对初学者来说还不清楚。即使go客户端示例检索数据,我也希望获得类型支持。

    正如它所解释的 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
    • apis/metrics.k8s.io/v1beta1/pods
    • 豆荚 default 命名空间: apis/metrics.k8s.io/v1beta1/namespaces/default/pods
    • 特定吊舱: /apis/metrics.k8s.io/v1beta1/namespaces/default/pods/<POD-NAME>

    注意 json.Unmarshal . 只能为感兴趣的字段定义类型。

        2
  •  3
  •   cakan user6364254    6 年前

    下面是一个使用REST API查询节点度量并返回JSON格式的[]字节的示例。将“nodes”替换为“pods”以获取pod/容器度量。

    data, err := clientset.RESTClient().Get().AbsPath("apis/metrics.k8s.io/v1beta1/nodes").DoRaw()
    
        3
  •  2
  •   gnvk    5 年前

    有一个更好的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{})