资源指标管道
对于 Kubernetes,指标 API 提供了一组基本指标,以支持自动扩展和类似用例。此 API 提供有关节点和 Pod 资源使用情况的信息,包括 CPU 和内存的指标。如果您将指标 API 部署到集群中,Kubernetes API 的客户端就可以查询此信息,并且您可以使用 Kubernetes 的访问控制机制来管理对它的权限。
您可以使用 水平 Pod 自动缩放器 (HPA) 和 垂直 Pod 自动缩放器 (VPA) 使用指标 API 中的数据来调整工作负载副本和资源,以满足客户需求。
您也可以使用 kubectl top
命令查看资源指标。
注意
指标 API 及其启用的指标管道仅提供最低限度的 CPU 和内存指标,以使用 HPA 和/或 VPA 启用自动扩展。如果您想提供更完整的指标集,可以通过部署一个使用自定义指标 API 的第二个 指标管道 来补充更简单的指标 API。图 1 说明了资源指标管道的架构。
] A[指标-
服务器] 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
端点提供的每个节点的汇总统计信息。指标服务器:收集并聚合从每个 kubelet 中提取的资源指标的集群附加组件。API 服务器为 HPA、VPA 和
kubectl top
命令提供指标 API。指标服务器是指标 API 的参考实现。指标 API:Kubernetes API 支持访问用于工作负载自动缩放的 CPU 和内存。为了使其在您的集群中正常工作,您需要一个提供指标 API 的 API 扩展服务器。
注意
cAdvisor 支持从 cgroup 中读取指标,这适用于 Linux 上典型的容器运行时。如果您使用使用其他资源隔离机制(例如虚拟化)的容器运行时,那么该容器运行时必须支持 CRI 容器指标,以便指标可供 kubelet 使用。
指标 API
Kubernetes 1.8 [beta]
指标服务器实现了指标 API。此 API 允许您访问集群中节点和 Pod 的 CPU 和内存使用情况。它的主要作用是将资源使用指标提供给 K8s 自动缩放组件。
以下是如何通过 jq
轻松读取 minikube
节点的指标 API 请求示例:
kubectl get --raw "/apis/metrics.k8s.io/v1beta1/nodes/minikube" | jq '.'
以下是如何使用 curl
执行相同 API 调用的示例:
curl http://localhost: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"
}
}
以下是如何通过 jq
轻松读取包含在 kube-system
命名空间中的 kube-scheduler-minikube
Pod 的指标 API 请求示例:
kubectl get --raw "/apis/metrics.k8s.io/v1beta1/namespaces/kube-system/pods/kube-scheduler-minikube" | jq '.'
以下是如何使用 curl
执行相同 API 调用的示例:
curl http://localhost: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 设计、指标服务器存储库 和 资源指标 API。
注意
您必须部署指标服务器或提供指标 API 的备用适配器才能访问它。衡量资源使用情况
CPU
CPU 报告为以 CPU 单位衡量的平均核心使用率。在 Kubernetes 中,一个 CPU 等效于云提供商的 1 个 vCPU/核心,以及裸机 Intel 处理器上的 1 个超线程。
此值是通过对内核提供的累积 CPU 计数器(在 Linux 和 Windows 内核中)进行速率计算得出的。用于计算 CPU 的时间窗口显示在指标 API 中的 window 字段下。
要详细了解 Kubernetes 如何分配和衡量 CPU 资源,请参阅 CPU 的含义。
内存
内存报告为收集指标时以字节为单位的活动集。
在理想情况下,“活动集”是在内存压力下无法释放的正在使用的内存量。但是,活动集的计算因主机操作系统而异,通常会大量使用启发式方法来生成估计值。
Kubernetes 容器活动集模型期望容器运行时统计与所讨论容器关联的匿名内存。活动集指标通常还包括一些缓存的(基于文件的)内存,因为主机操作系统无法始终回收页面。
要详细了解 Kubernetes 如何分配和衡量内存资源,请参阅 内存的含义。
指标服务器
指标服务器从 kubelet 获取资源指标,并通过指标 API 将其公开在 Kubernetes API 服务器中,供 HPA 和 VPA 使用。您也可以使用 kubectl top
命令查看这些指标。
指标服务器使用 Kubernetes API 跟踪集群中的节点和 Pod。指标服务器通过 HTTP 查询每个节点以获取指标。指标服务器还构建 Pod 元数据的内部视图,并保留 Pod 健康状况的缓存。该缓存的 Pod 健康状况信息可通过指标服务器提供的扩展 API 获取。
例如,使用 HPA 查询时,指标服务器需要识别哪些 Pod 满足部署中的标签选择器。
指标服务器调用 kubelet API 从每个节点收集指标。根据指标服务器版本,它使用
- v0.6.0+ 版本中的指标资源端点
/metrics/resource
,或 - 旧版本中的摘要 API 端点
/stats/summary
下一步
要详细了解指标服务器,请参阅 指标服务器存储库。
您还可以查看以下内容:
要详细了解 kubelet 如何提供节点指标,以及如何通过 Kubernetes API 访问它们,请阅读 节点指标数据。