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

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

  •  3
  • kentor  · 技术社区  · 6 年前

    kubernetes go客户机有很多方法,我找不到如何获得当前的CPU&特定(或所有pod)的RAM使用情况。

    有人能告诉我需要调用什么方法来获取pods&的当前用法吗;节点?

    我的节点列表:

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

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

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

    https://github.com/kubernetes-incubator/metrics-server

    3 回复  |  直到 6 年前
        1
  •  13
  •   Ottovsky    6 年前

    go客户端不支持metrics类型是正确的,但是在metrics包中有一个预生成的 client 可用于获取度量对象并立即将其分配给适当的结构。首先需要做的唯一一件事是生成一个配置并将其传递给metrics客户端。因此,一个简单的度量客户机如下所示:

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

    metric client的上述每个方法都返回一个适当的结构(您可以检查 here )和一个错误(如果有的话),你应该根据你的要求处理。

        2
  •  4
  •   captainchhala    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)
            }
    
        }
    }
    
        3
  •  2
  •   Andrew    6 年前

    您在Kubernetes的新版本(从1.10.7开始在我的系统上测试)中寻找的API是 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 对象,只需指定 指标/v1beta1 作为 versionedAPIPath ,这将比包装良好的ClientSet更容易工作,也不方便,但我不确定该API在该接口中出现需要多长时间。