【问题标题】:Get current resource usage of a pod in Kubernetes with Go client使用 Go 客户端获取 Kubernetes 中 Pod 的当前资源使用情况
【发布时间】:2019-03-16 17:26:32
【问题描述】:

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

谁能告诉我需要调用哪些方法来获取 pod 和节点的当前使用情况?

我的节点列表:

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

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

【问题讨论】:

    标签: go kubernetes


    【解决方案1】:

    go-client 不支持 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{})
    }
    

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

    【讨论】:

    • 非常感谢!你能解释一下我是怎么找到这个的吗?
    • 不幸的是,没有一种简单的方法可以找到此类信息。一般来说,如果你有一个官方的 k8s 类型,很可能也会为其生成客户端代码,但只能通过爬取 k8s 源代码或 godoc (godoc.org/k8s.io/metrics/pkg/client/clientset/versioned/typed/…) 找到。
    • 您的解决方案有效,但是当您不知道您的 pod 名称,您需要先找到它时如何管理?
    • 抱歉回复晚了,但这真的取决于您的应用程序逻辑以及您想要监控的 pod 以及如何获取它们的名称。我想您可以只列出所有 pod,然后根据您的条件过滤它们。
    【解决方案2】:

    这是一个例子。

    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】:

      您在新版本的 Kubernetes 中寻找的 API(在我的 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 需要很长时间才能显示在该界面中。

      【讨论】:

      • 嘿@Andrew,感谢您深入了解图书馆。我明白你的意思,但我对 Golang 完全陌生,因此非常感谢实现 RestClient 方法(没有类型化响应)的代码示例。 PS:我有点困惑它没有输入响应,因为 kubectl get top podskubectl get nodes 也返回 pods/nodes 的资源使用情况
      • 老实说,我发现 RestClient 使用起来非常痛苦。它是“通用的”并且不假设您正在与实际的 k8s API 交谈,因此它需要一大堆额外的工作才能让它快乐。实际上,您最好将身份验证令牌和 TLS 配置从您用于 ClientSet 的配置中提取出来,并直接将其与普通的 http 请求一起使用。
      • kubectl top 在旧版本中的工作方式是直接使用this util package 与 heapster 服务通信。我不知道它在最新版本中是如何工作的,没有深入研究过代码。
      猜你喜欢
      • 2020-11-27
      • 2018-11-27
      • 2019-01-09
      • 2019-03-04
      • 2019-03-03
      • 1970-01-01
      • 1970-01-01
      • 2019-10-09
      • 2015-10-21
      相关资源
      最近更新 更多