如何用Go语言调用K8s/OpenShift API获取集群资源利用率指标?
集群资源利用率获取方案(Go程序)
一、K8s/OpenShift API能否直接返回集群级利用率?
Kubernetes和OpenShift的核心API不提供直接的集群级资源利用率聚合数据——核心API的定位是资源编排与状态管理,实时监控聚合属于附加组件的职责。但你可以通过以下标准API途径获取所需数据:
- Metrics Server API:官方基础监控组件,通过
metrics.k8s.io接口提供节点、Pod的CPU/内存瞬时使用率。需自行累加节点数据计算集群总利用率。 - Prometheus API:如果集群部署了Prometheus+Node Exporter,可直接用PromQL查询聚合后的集群指标(如
sum(node_cpu_seconds_total{mode!="idle"}) / sum(node_cpu_seconds_total)计算集群CPU使用率),Go程序调用其HTTP接口即可拿到结构化结果。 - OpenShift内置监控API:OpenShift自带Prometheus栈,直接通过其监控API就能查询集群级资源指标,无需额外部署。
二、集群总利用率的正确计算方式
要得到准确的集群级数据,需按以下逻辑处理:
- CPU/内存利用率:通过Metrics Server或Prometheus获取每个节点的使用量与总容量,分别累加后计算占比(总使用量/集群总可用容量),注意排除系统预留资源(kubelet、容器运行时占用的部分)。
- 文件系统/网络传输:这类指标需从节点监控数据(如Node Exporter的
node_filesystem_usage_bytes、node_network_transmit_bytes_total)聚合而来,累加所有节点对应指标得到集群总量。 - Pod数量:直接通过K8s核心API的Pods列表接口查询,统计全集群(或指定命名空间)的Pod数量,无需节点数据累加。
三、替代os/exec调用kubectl的优化方案
用os/exec执行kubectl并解析文本输出易出错,推荐使用官方client-go库直接调用API:
- 获取Pod数量:通过
corev1客户端列出全集群Pod,直接统计数量(示例代码如下)。 - 获取资源使用率:用dynamic client调用Metrics Server API,或直接请求Prometheus查询接口,拿到结构化JSON数据,避免文本解析的麻烦。
示例:用client-go获取全集群Pod数量
package main import ( "context" "fmt" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/client-go/kubernetes" "k8s.io/client-go/tools/clientcmd" ) func main() { // 加载kubeconfig(集群内运行可省略路径,改用InClusterConfig) config, err := clientcmd.BuildConfigFromFlags("", "/path/to/your/kubeconfig") if err != nil { panic(err.Error()) } clientset, err := kubernetes.NewForConfig(config) if err != nil { panic(err.Error()) } // 列出所有命名空间的Pod pods, err := clientset.CoreV1().Pods("").List(context.TODO(), metav1.ListOptions{}) if err != nil { panic(err.Error()) } fmt.Printf("Total pods in cluster: %d\n", len(pods.Items)) }
内容的提问来源于stack exchange,提问作者G2code
相关产品推荐
相关产品推荐

