You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 00:50:23