如何使用Node.js的@kubernetes/client-node模块获取Kubernetes Pod指标
我之前在项目里也遇到过这个问题,当时查了好久才搞明白——@kubernetes/client-node本身确实没有直接封装Pod指标的方法,但咱们可以通过Kubernetes的Metrics API来实现,毕竟kubectl top pods也是靠这个API干活的😉
前提条件
首先得确保你的Kubernetes集群已经部署了Metrics Server,这是Metrics API(metrics.k8s.io)的后端服务,没有它的话不仅kubectl top用不了,咱们的代码也拿不到数据。可以用下面的命令检查:
kubectl get apiservices metrics.k8s.io/v1beta1
如果状态是Available,就说明没问题了。
方案1:用CustomObjectsApi调用Metrics API
Metrics API属于Kubernetes的扩展API,不在核心API组里,所以@kubernetes/client-node没有为它生成专门的客户端,但我们可以用CustomObjectsApi来直接调用这个API:
const k8s = require('@kubernetes/client-node'); // 初始化KubeConfig,会自动读取本地的kubeconfig或者集群内的服务账号配置 const kc = new k8s.KubeConfig(); kc.loadFromDefault(); // 创建CustomObjectsApi客户端 const customApi = kc.makeApiClient(k8s.CustomObjectsApi); async function fetchPodMetrics(namespace = '') { try { // 调用metrics.k8s.io/v1beta1的pods资源 // 如果指定namespace,就传具体的命名空间名称,空字符串表示所有命名空间 const response = await customApi.listNamespacedCustomObject( 'metrics.k8s.io', 'v1beta1', namespace, 'pods' ); // 遍历返回的Pod指标数据 response.body.items.forEach(podMetric => { const podName = podMetric.metadata.name; const podNamespace = podMetric.metadata.namespace; const cpuUsage = podMetric.usage.cpu; // 格式类似"100m",表示100毫核 const memoryUsage = podMetric.usage.memory; // 格式类似"256Mi",表示256兆字节 console.log(`Pod: ${podName} (${podNamespace})`); console.log(`CPU: ${cpuUsage}, Memory: ${memoryUsage}\n`); }); } catch (error) { console.error('获取Pod指标失败:', error.response?.body || error.message); } } // 调用函数获取所有命名空间的Pod指标 fetchPodMetrics();
这段代码会返回和kubectl top pods完全一样的CPU、内存数据,格式也是一致的(比如100m CPU、256Mi内存)。
方案2:直接用RESTClient发送请求
如果你觉得CustomObjectsApi不够灵活,也可以用@kubernetes/client-node的通用RESTClient来发送原始HTTP请求:
const k8s = require('@kubernetes/client-node'); const kc = new k8s.KubeConfig(); kc.loadFromDefault(); const restClient = kc.makeApiClient(k8s.RESTClient); async function fetchPodMetrics() { try { const response = await restClient.get('/apis/metrics.k8s.io/v1beta1/pods'); console.log(response.body); // 同样可以遍历items提取数据 } catch (error) { console.error('请求失败:', error); } } fetchPodMetrics();
这个方法和方案1本质上是一样的,只是更接近底层的HTTP调用。
关于网络指标的说明
遗憾的是,Metrics Server默认不提供网络指标(比如收发流量),如果需要获取网络数据,你需要部署额外的监控组件,比如:
- Prometheus + Node Exporter + kube-state-metrics
- 或者用CNI插件自带的监控功能
这时候你可以通过查询Prometheus的API来获取网络指标,@kubernetes/client-node可以用来访问集群内的Prometheus服务(比如通过Service名称或IP),或者直接发送HTTP请求到Prometheus的端点。
比如,查询某个Pod的网络接收流量的PromQL可能是:
sum(container_network_receive_bytes_total{pod="your-pod-name"}) by (pod)
内容的提问来源于stack exchange,提问作者relief.melone

