我想用 golang 从 kubernetes 访问指标。每个节点的 cpu 和内存以及 pod 和/或命名空间的相同。
我有点迷失在这里,因为文档不够清晰。
我了解到有heapster
(根据 github repo 已弃用)。还有metric server
一个rest api。
我在哪里可以找到一些开始的例子?我不想在 Kubernetes 中安装另一个应用程序、包或服务。我想尽可能地获得本地信息。使用 client-go 和 golang 访问这些信息的首选方式是什么?
我想用 golang 从 kubernetes 访问指标。每个节点的 cpu 和内存以及 pod 和/或命名空间的相同。
我有点迷失在这里,因为文档不够清晰。
我了解到有heapster
(根据 github repo 已弃用)。还有metric server
一个rest api。
我在哪里可以找到一些开始的例子?我不想在 Kubernetes 中安装另一个应用程序、包或服务。我想尽可能地获得本地信息。使用 client-go 和 golang 访问这些信息的首选方式是什么?
有一个更好的 API:https ://github.com/kubernetes/metrics 。使用它,您不必创建数据结构或处理行字节切片。
import (
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
metricsv "k8s.io/metrics/pkg/client/clientset/versioned"
...
)
...
clientset, err := metricsv.NewForConfig(config)
podMetricsList, err := clientset.MetricsV1beta1().PodMetricses("").List(metav1.ListOptions{})
这是使用 REST API 查询节点指标并返回 JSON 格式的 []byte 的示例。将“nodes”替换为“pods”以获取 pod/容器指标。
data, err := clientset.RESTClient().Get().AbsPath("apis/metrics.k8s.io/v1beta1/nodes").DoRaw()
正如问题中所解释的,对于初学者来说,文档不清楚。即使是 go-client 示例检索数据,我也想获得类型支持。
正如上面的答案所解释的,您可以获取 JSON 格式的 []byte 中的数据。我就是这样做的。
package main
import (
"encoding/json"
"fmt"
"time"
"k8s.io/client-go/kubernetes"
"k8s.io/client-go/rest"
)
// PodMetricsList : PodMetricsList
type PodMetricsList struct {
Kind string `json:"kind"`
APIVersion string `json:"apiVersion"`
Metadata struct {
SelfLink string `json:"selfLink"`
} `json:"metadata"`
Items []struct {
Metadata struct {
Name string `json:"name"`
Namespace string `json:"namespace"`
SelfLink string `json:"selfLink"`
CreationTimestamp time.Time `json:"creationTimestamp"`
} `json:"metadata"`
Timestamp time.Time `json:"timestamp"`
Window string `json:"window"`
Containers []struct {
Name string `json:"name"`
Usage struct {
CPU string `json:"cpu"`
Memory string `json:"memory"`
} `json:"usage"`
} `json:"containers"`
} `json:"items"`
}
func getMetrics(clientset *kubernetes.Clientset, pods *PodMetricsList) error {
data, err := clientset.RESTClient().Get().AbsPath("apis/metrics.k8s.io/v1beta1/pods").DoRaw()
if err != nil {
return err
}
err = json.Unmarshal(data, &pods)
return err
}
func main() {
// creates the in-cluster config
// https://github.com/kubernetes/client-go/tree/master/examples#configuration
config, err := rest.InClusterConfig()
if err != nil {
panic(err.Error())
}
// creates the clientset
clientset, err := kubernetes.NewForConfig(config)
if err != nil {
panic(err.Error())
}
var pods PodMetricsList
err = getMetrics(clientset, &pods)
if err != nil {
panic(err.Error())
}
for _, m := range pods.Items {
fmt.Println(m.Metadata.Name, m.Metadata.Namespace, m.Timestamp.String())
}
}
安装以下 Go 包:go get -u k8s.io/client-go/kubernetes k8s.io/client-go/rest
您可以根据需要使用以下端点检索数据;
apis/metrics.k8s.io/v1beta1/nodes
apis/metrics.k8s.io/v1beta1/pods
default
:apis/metrics.k8s.io/v1beta1/namespaces/default/pods
/apis/metrics.k8s.io/v1beta1/namespaces/default/pods/<POD-NAME>
注意:您可能需要先更改类型json.Unmarshal
。您可以仅为您感兴趣的字段定义类型。
从最新版本的 client-go 开始,您必须将 Context 添加到DoRaw()
. 例如使用context.TODO()
导入上下文库。