资源指标管道
对于 Kubernetes,指标 API 提供了一组基本指标,以支持自动扩缩和类似的用例。此 API 提供有关节点和 Pod 的资源使用情况的信息,包括 CPU 和内存的指标。如果您将指标 API 部署到您的集群中,则 Kubernetes API 的客户端可以查询此信息,并且您可以使用 Kubernetes 的访问控制机制来管理执行此操作的权限。
HorizontalPodAutoscaler(HPA)和 VerticalPodAutoscaler (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
端点提供的每个节点的汇总统计信息。metrics-server:集群附加组件,用于收集和聚合从每个 kubelet 拉取的资源指标。API 服务器提供指标 API,供 HPA、VPA 和
kubectl top
命令使用。Metrics Server 是指标 API 的参考实现。指标 API:Kubernetes API,支持访问用于工作负载自动扩缩的 CPU 和内存。为了使此功能在您的集群中工作,您需要一个提供指标 API 的 API 扩展服务器。
注意
cAdvisor 支持从 cgroup 读取指标,这适用于 Linux 上的典型容器运行时。如果您使用使用另一种资源隔离机制(例如虚拟化)的容器运行时,那么该容器运行时必须支持 CRI 容器指标,以便指标可用于 kubelet。
指标 API
Kubernetes 1.8 [beta]
metrics-server 实现了指标 API。此 API 允许您访问集群中节点和 Pod 的 CPU 和内存使用率。它的主要作用是将资源使用指标馈送到 K8s 自动扩缩组件。
以下是通过 jq
管道传输的 minikube
节点的指标 API 请求示例,以便于阅读
kubectl get --raw "/apis/metrics.k8s.io/v1beta1/nodes/minikube" | jq '.'
这是使用 curl
的相同 API 调用
curl https://127.0.0.1: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 https://127.0.0.1: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。
注意
您必须部署 metrics-server 或提供指标 API 的替代适配器才能访问它。测量资源使用情况
CPU
CPU 以 cpu 单位测量的平均核心使用率报告。在 Kubernetes 中,一个 CPU 等效于云提供商的 1 个 vCPU/核心,以及裸机 Intel 处理器上的 1 个超线程。
此值是通过对内核提供的累积 CPU 计数器(在 Linux 和 Windows 内核中)进行速率计算得出的。用于计算 CPU 的时间窗口显示在指标 API 的 window 字段下。
要了解有关 Kubernetes 如何分配和测量 CPU 资源的更多信息,请参阅 CPU 的含义。
内存
内存报告为收集指标时的工作集,以字节为单位测量。
在理想情况下,“工作集”是内存压力下无法释放的正在使用的内存量。但是,工作集的计算因主机操作系统而异,通常会大量使用启发式方法来生成估计值。
容器工作集的 Kubernetes 模型期望容器运行时计算与所讨论的容器关联的匿名内存。工作集指标通常还包括一些缓存(文件支持)的内存,因为主机操作系统并非总是可以回收页面。
要了解有关 Kubernetes 如何分配和测量内存资源的更多信息,请参阅 内存的含义。
Metrics Server
metrics-server 从 kubelet 获取资源指标,并通过指标 API 将其暴露在 Kubernetes API 服务器中,供 HPA 和 VPA 使用。您还可以使用 kubectl top
命令查看这些指标。
metrics-server 使用 Kubernetes API 来跟踪集群中的节点和 Pod。metrics-server 通过 HTTP 查询每个节点以获取指标。metrics-server 还构建 Pod 元数据的内部视图,并保留 Pod 健康状况的缓存。可以通过 metrics-server 提供的扩展 API 访问该缓存的 Pod 健康信息。
例如,对于 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 访问这些指标的信息,请阅读 节点指标数据。