Получить текущее использование ресурса модуля в Kubernetes с клиентом Go - PullRequest
0 голосов
/ 11 октября 2018

В клиенте kubernetes go есть множество методов, и я не могу найти, как получить текущее использование ЦП и ОЗУ определенного (или всех модулей).

Может кто-нибудь сказать мне, какие методы мне нужны?позвонить, чтобы узнать текущее использование модулей и узлов?

Мой NodeList:

nodes, err := clientset.CoreV1().Nodes().List(metav1.ListOptions{})

Kubernetes Go Client: https://github.com/kubernetes/client-go

Метрикипакет: https://github.com/kubernetes/kubernetes/tree/master/staging/src/k8s.io/metrics

Насколько мне известно, сервер метрик реализует пакет метрик Kubernetes для извлечения использования ресурсов из модулей и узлов, но я не мог понять, где и как они это делают:https://github.com/kubernetes-incubator/metrics-server

Ответы [ 3 ]

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

Правильно, что go-client не поддерживает тип метрики, но в пакете метрик есть предварительно сгенерированный клиент , который можно использовать для извлечения объектов метрик и назначения их сразу соответствующемусостав.Сначала вам нужно сгенерировать конфигурацию и передать ее клиенту метрик.Таким образом, простой клиент для метрик будет выглядеть так:

package main


import (
    "k8s.io/client-go/tools/clientcmd"
    metrics "k8s.io/metrics/pkg/client/clientset/versioned"
    metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)



func main() {
    var kubeconfig, master string //empty, assuming inClusterConfig
    config, err := clientcmd.BuildConfigFromFlags(master, kubeconfig)
    if err != nil{
        panic(err)
    }

    mc, err := metrics.NewForConfig(config)
    if err != nil {
        panic(err)
    }

    mc.MetricsV1beta1().NodeMetricses().Get("your node name", metav1.GetOptions{})
    mc.MetricsV1beta1().NodeMetricses().List(metav1.ListOptions{})
    mc.MetricsV1beta1().PodMetricses(metav1.NamespaceAll).List(metav1.ListOptions{})
    mc.MetricsV1beta1().PodMetricses(metav1.NamespaceAll).Get("your pod name", metav1.GetOptions{})
}

Каждый из перечисленных выше методов из клиента метрики возвращает соответствующую структуру (вы можете проверить эти здесь ) и ошибку (еслилюбой) который вы должны обработать в соответствии с вашими требованиями.

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

вот пример.

package main

import (
    "fmt"

    metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
    "k8s.io/client-go/tools/clientcmd"
    metrics "k8s.io/metrics/pkg/client/clientset/versioned"
)

func main() {
    var kubeconfig, master string //empty, assuming inClusterConfig
    config, err := clientcmd.BuildConfigFromFlags(master, kubeconfig)
    if err != nil {
        panic(err)
    }

    mc, err := metrics.NewForConfig(config)
    if err != nil {
        panic(err)
    }
    podMetrics, err := mc.MetricsV1beta1().PodMetricses(metav1.NamespaceAll).List(metav1.ListOptions{})
    if err != nil {
        fmt.Println("Error:", err)
        return
    }
    for _, podMetric := range podMetrics.Items {
        podContainers := podMetric.Containers
        for _, container := range podContainers {
            cpuQuantity, ok := container.Usage.Cpu().AsInt64()
            memQuantity, ok := container.Usage.Memory().AsInt64()
            if !ok {
                return
            }
            msg := fmt.Sprintf("Container Name: %s \n CPU usage: %d \n Memory usage: %d", container.Name, cpuQuantity, memQuantity)
            fmt.Println(msg)
        }

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

API, который вы ищете в новых версиях Kubernetes (проверено на моем по состоянию на 1.10.7), это metrics.k8s.io/v1beta1 маршрут API.

Вы можете увидеть его локально, если вы запустите kubectl proxy и отметьте http://localhost:8001/apis/metrics.k8s.io/v1beta1/pods и /nodes на вашем локальном хосте.

Я вижу, где ваше замешательство, хотя.На момент написания, похоже, что metrics/v1beta1 не имеет сгенерированного типизированного пакета (https://godoc.org/k8s.io/client-go/kubernetes/typed), и не отображается в объекте kubernetes.ClientSet .

Вы можете поразить все доступные конечные точки напрямую через объект rest.RestClient и просто указать metrics/v1beta1 в качестве versionedAPIPath, что будет более удобным и менее удобным, чем красиво упакованный ClientSet, но яЯ не уверен, сколько времени пройдет, прежде чем этот API появится в этом интерфейсе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...