资源度量管道

对于 Kubernetes,_指标 API_ 提供了一组基本的指标来支持自动伸缩和类似的使用场景。此 API 提供了节点和 Pod 的资源使用情况信息,包括 CPU 和内存指标。如果你在集群中部署了指标 API,Kubernetes API 客户端就可以查询这些信息,并且你可以使用 Kubernetes 的访问控制机制来管理相关权限。

HorizontalPodAutoscaler (HPA) 和 VerticalPodAutoscaler (VPA) 使用来自指标 API 的数据来调整工作负载的副本和资源,以满足客户需求。

你还可以使用 kubectl top 命令查看资源指标。

图 1 展示了资源指标管道的架构。

flowchart RL subgraph cluster[集群] direction RL S[

] A[Metrics-
Server] subgraph B[节点] direction TB D[cAdvisor] --> C[kubelet] E[容器
运行时] --> D E1[容器
运行时] --> D P[Pod 数据] -.- C end L[API
服务器] W[HPA] C ---->|节点级别
资源指标| A -->|指标
API| L --> W end L ---> K[kubectl
top] classDef box fill:#fff,stroke:#000,stroke-width:1px,color:#000; class W,B,P,K,cluster,D,E,E1 box classDef spacewhite fill:#ffffff,stroke:#fff,stroke-width:0px,color:#000 class S spacewhite classDef k8s fill:#326ce5,stroke:#fff,stroke-width:1px,color:#fff; class A,L,C k8s

图 1. 资源指标管道

架构组件,从图中右到左,包括以下内容:

  • cAdvisor:用于收集、聚合和暴露容器指标的守护程序,集成在 Kubelet 中。

  • kubelet:用于管理容器资源的节点代理。资源指标可通过 /metrics/resource/stats kubelet API 端点访问。

  • 节点级别资源指标:kubelet 提供的 API,用于发现和检索通过 /metrics/resource 端点获得的每个节点的汇总统计信息。

  • metrics-server:集群插件组件,用于收集并聚合从每个 kubelet 拉取的资源指标。API 服务器通过指标 API 提供给 HPA、VPA 和 kubectl top 命令使用。Metrics Server 是指标 API 的参考实现。

  • 指标 API:Kubernetes API,支持访问用于工作负载自动伸缩的 CPU 和内存。要在集群中实现此功能,你需要一个提供指标 API 的 API 扩展服务器。

指标 API

功能状态: Kubernetes 1.8 [beta]

metrics-server 实现了指标 API。此 API 允许你访问集群中节点和 Pod 的 CPU 和内存使用情况。其主要作用是向 K8s 自动伸缩组件提供资源使用指标。

以下是一个针对 minikube 节点的指标 API 请求示例,通过 jq 管道输出以方便阅读

kubectl get --raw "/apis/metrics.k8s.io/v1beta1/nodes/minikube" | jq '.'

这是使用 curl 的相同 API 调用

curl https://:8080/apis/metrics.k8s.io/v1beta1/nodes/minikube

示例响应

{
  "kind": "NodeMetrics",
  "apiVersion": "metrics.k8s.io/v1beta1",
  "metadata": {
    "name": "minikube",
    "selfLink": "/apis/metrics.k8s.io/v1beta1/nodes/minikube",
    "creationTimestamp": "2022-01-27T18:48:43Z"
  },
  "timestamp": "2022-01-27T18:48:33Z",
  "window": "30s",
  "usage": {
    "cpu": "487558164n",
    "memory": "732212Ki"
  }
}

以下是一个针对 kube-system 命名空间中包含的 kube-scheduler-minikube Pod 的指标 API 请求示例,通过 jq 管道输出以方便阅读

kubectl get --raw "/apis/metrics.k8s.io/v1beta1/namespaces/kube-system/pods/kube-scheduler-minikube" | jq '.'

这是使用 curl 的相同 API 调用

curl https://:8080/apis/metrics.k8s.io/v1beta1/namespaces/kube-system/pods/kube-scheduler-minikube

示例响应

{
  "kind": "PodMetrics",
  "apiVersion": "metrics.k8s.io/v1beta1",
  "metadata": {
    "name": "kube-scheduler-minikube",
    "namespace": "kube-system",
    "selfLink": "/apis/metrics.k8s.io/v1beta1/namespaces/kube-system/pods/kube-scheduler-minikube",
    "creationTimestamp": "2022-01-27T19:25:00Z"
  },
  "timestamp": "2022-01-27T19:24:31Z",
  "window": "30s",
  "containers": [
    {
      "name": "kube-scheduler",
      "usage": {
        "cpu": "9559630n",
        "memory": "22244Ki"
      }
    }
  ]
}

指标 API 定义在 k8s.io/metrics 仓库中。你必须启用 API 聚合层并为 metrics.k8s.io API 注册一个 APIService

要了解更多关于指标 API 的信息,请参阅 资源指标 API 设计metrics-server 仓库资源指标 API

衡量资源使用情况

CPU

CPU 以 CPU 单位表示,测量为平均核心使用率。在 Kubernetes 中,一个 CPU 相当于云提供商的 1 个 vCPU/核心,以及裸金属 Intel 处理器上的 1 个超线程。

此值是通过对内核(在 Linux 和 Windows 内核中)提供的累积 CPU 计数器进行速率计算得出的。用于计算 CPU 的时间窗口在指标 API 的窗口字段中显示。

要了解 Kubernetes 如何分配和衡量 CPU 资源,请参阅 CPU 的含义

内存

内存以工作集大小报告,以字节为单位,在收集指标的瞬间测量。

在理想情况下,“工作集”是指在内存压力下无法释放的正在使用的内存量。然而,工作集的计算因主机操作系统而异,并且通常大量使用启发式方法来生成估计值。

Kubernetes 容器工作集模型期望容器运行时计算与该容器相关的匿名内存。工作集指标通常也包括一些缓存(文件支持)内存,因为主机操作系统不能总是回收页面。

要了解 Kubernetes 如何分配和衡量内存资源,请参阅 内存的含义

指标服务器

metrics-server 从 kubelet 获取资源指标,并通过指标 API 将其暴露在 Kubernetes API 服务器中,供 HPA 和 VPA 使用。你还可以使用 kubectl top 命令查看这些指标。

metrics-server 使用 Kubernetes API 来跟踪集群中的节点和 Pod。metrics-server 通过 HTTP 查询每个节点以获取指标。metrics-server 还构建了 Pod 元数据的内部视图,并维护 Pod 健康状态的缓存。该缓存的 Pod 健康信息可通过 metrics-server 提供的扩展 API 获得。

例如,对于 HPA 查询,metrics-server 需要识别哪些 Pod 符合部署中的标签选择器。

metrics-server 调用 kubelet API 从每个节点收集指标。根据 metrics-server 版本,它使用:

  • v0.6.0+ 版本中的指标资源端点 /metrics/resource
  • 旧版本中的摘要 API 端点 /stats/summary

下一步

要了解更多关于 metrics-server 的信息,请参阅 metrics-server 仓库

你还可以查看以下内容:

要了解 kubelet 如何提供节点指标,以及如何通过 Kubernetes API 访问这些指标,请阅读 节点指标数据

上次修改时间:2024 年 8 月 31 日太平洋标准时间晚上 8:50:更新 resource-metrics-pipeline.md (d984d503ed)