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

时间:2018-10-11 15:00:44

标签: go kubernetes

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

3 个答案:

答案 0 :(得分:4)

正确的做法是,go-client不支持度量标准类型,但是在度量标准包中有一个预生成的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{})
}

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

答案 1 :(得分:2)

这是一个例子。

- (void)insertEntries:(<id<PTDBGeneralInfoTableEntry>>)entry inDatabase:(FMDatabase *)db {

  [db beginTransaction];

  [self createTableInDatabase:db];

  NSString *insertSQL = [NSString stringWithFormat:@"INSERT OR REPLACE INTO MyTableName"
                         "(%@, %@, %@)"
                         " VALUES(?, ?, ?)",
                         COLUMN_NAME_A,
                         COLUMN_NAME_B,
                         COLUMN_NAME_C];

  NSArray* values = @[entry.valueA ? entry.valueA : [NSNull null],
                      entry.valueB ? entry.valueB : [NSNull null],
                      entry.ValueC ? entry.ValueC : [NSNull null]];

  BOOL res = [db executeUpdate:insertSQL withArgumentsInArray:values];


  [db commit];
}

- (void)createTableInDatabase:(FMDatabase *)db {

  NSString* createTableSQL =
  [NSString stringWithFormat:@"CREATE TABLE IF NOT EXISTS %@ ("
   "%@ TEXT NOT NULL PRIMARY KEY,"
   "%@ INTEGER,"            
   "%@ REAL"             
   ")",
   COLUMN_NAME_A,
   COLUMN_NAME_B
   COLUMN_NAME_C
   ];

   [db executeUpdate:createTableSQL];

}

答案 2 :(得分:1)

在新版本的Kubernetes中寻找的API(在我的1.10.7版本上进行了测试)是PropertyReal API路由。

如果您运行metrics.k8s.io/v1beta1并在本地主机上选中kubectl proxyhttp://localhost:8001/apis/metrics.k8s.io/v1beta1/pods,则可以在本地看到它。

我知道你的困惑在哪里。在撰写本文时,/nodes似乎没有生成的类型化包(https://godoc.org/k8s.io/client-go/kubernetes/typed),并且没有出现在kubernetes.ClientSet对象中。

您可以通过rest.RestClient对象直接命中所有可用的端点,只需将metrics/v1beta1指定为metrics/v1beta1,这将比包装好的ClientSet更加工作且不方便。我不确定该接口上显示该API将花费多长时间。