Как получить метрики kubernetes через client-go и golang - PullRequest
0 голосов
/ 26 августа 2018

Я хочу получить доступ к метрикам из kubernetes с помощью golang.Что-то вроде процессора и памяти на узел, а также то же самое для модулей и / или пространств имен.

Я немного растерялся, потому что документация не так ясна, как могла бы быть.

Iузнали, что есть heapster (что устарело согласно репозиторию github).Существует также metric server и API для отдыха.

Где я могу найти примеры для начала?Я не хочу устанавливать другое приложение, пакет или услугу в kubernetes.Я хотел бы получить информацию как можно более родной.Каков предпочтительный способ доступа к этой информации с помощью client-go и golang?

Ответы [ 2 ]

0 голосов
/ 01 февраля 2019

Как объяснено в вопросе, документация не понятна для начинающего.Даже примеры go-client извлекают данные, я хотел получить поддержку Type.

Как объясняется ответом выше , вы можете получить данные в байтах [] в формате 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.Вы можете определить тип только для интересующего вас поля.

0 голосов
/ 09 октября 2018

Вот пример использования REST API для запроса метрик узла и возврата байта [] в формате JSON.Замените "узлы" на "стручки", чтобы получить метрику контейнера / контейнера.

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