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

如何使用Node.js的@kubernetes/client-node模块获取Kubernetes Pod指标

如何用@kubernetes/client-node获取Pod的CPU、内存等指标

我之前在项目里也遇到过这个问题,当时查了好久才搞明白——@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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 09:02:54