在上篇文章《Kubernetes资源使用监控实践》中,我们已经介绍了如何在Kubernetes上面部署Heapster,以及结合InfluxDB和Grafana做了界面展示,但在最后我们提到很多系统可能只是获取这些监控信息,然后使用自己的方式去做展示。所以本文主要介绍如何通过Heapster提供的REST API来获取这些监控信息。

Heapster通过Metric模型来组织这些监控数据,这些数据可以通过REST API来获取,目前提供的监控维度可参考:https://github.com/kubernetes/heapster/blob/master/docs/storage-schema.md。基本上涵盖了CPU、内存、网络、文件系统、运行时间等四个维度的监控统计,但是不同的资源(Cluster、Node、Namespace、Pod、Container)一般只会覆盖一部分监控维度,比如Cluster目前只支持memory/usagecpu/requestcpu/limitmemory/requestmemory/limitcpu/usage_rate几个监控维度,这些都可以通过API获取到。

在上面给出的文档链接中,也已经给出了REST API,为了更方便的使用这些API,我写了一个简单的Library:heapster-client,通过这个库可以更方便的去使用Heapster提供的REST API。这里给一个简单的例子,实现获取Cluster支持的Metric,以及获取其中一个Metric的监控数据:

package main

import (
    "fmt"
    "github.com/niyanchun/heapster-client/client"
    "time"
    "github.com/niyanchun/heapster-client/type/v1"
)

func main() {
    HEAPSTER_URL := "http://192.168.56.101:8080/api/v1/proxy/namespaces/kube-system/services/heapster"
    client := client.NewClient(HEAPSTER_URL, "", "")

    start, end := getTimeRange()
    list, err := client.ListClusterMetric()
    checkErr(err)
    fmt.Printf("ListClusterMetric:\n %v", list)

    metrics, err := client.GetClusterMetrics(v1.CPU_USAGE_RATE, start, end)
    checkErr(err)
    fmt.Printf("ListClusterMetric:\n %v", metrics)
}

func checkErr(err error) {
    if err != nil {
        panic(err)
    }
}

func getTimeRange() (string, string) {
    now := time.Now().UTC()
    end := now.Format(time.RFC3339)
    start := now.Add(-600 * 1e9).Format(time.RFC3339) // ten minutes before
    fmt.Println(start, end)

    return start, end
}