使用Go客户端获取Kubernetes中Pod的当前资源使用情况

ken*_*tor 4 go kubernetes

kubernetes go客户端有很多方法,我找不到如何获得特定(或所有Pod)的当前CPU和RAM使用率的方法。

有人可以告诉我我需要调用什么方法才能获得Pod和节点的当前用法?

我的NodeList:

nodes, err := clientset.CoreV1().Nodes().List(metav1.ListOptions{})
Run Code Online (Sandbox Code Playgroud)

Kubernetes Go客户端:https : //github.com/kubernetes/client-go

指标包:https : //github.com/kubernetes/kubernetes/tree/master/staging/src/k8s.io/metrics

据我所知,指标服务器实现了Kubernetes指标包,以便从pod和节点获取资源使用情况,但是我不知道它们在哪里以及如何实现:https//github.com/kubernetes-incubator / metrics-server

cap*_*ala 6

这是一个例子。

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)
        }

    }
}
Run Code Online (Sandbox Code Playgroud)


Ott*_*sky 5

正确的是,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{})
}
Run Code Online (Sandbox Code Playgroud)

度量标准客户端的上述每种方法都返回一个适当的结构(您可以在此处检查那些结构)和一个错误(如果有),您应根据自己的要求进行处理。