资源指标管线
对于 Kubernetes 来说,*Metrics API* 提供了一组基本的指标来支持自动伸缩和类似用例。此 API 提供关于节点和 Pod 的资源使用信息,包括 CPU 和内存指标。如果你在集群中部署 Metrics API,则 Kubernetes API 的客户端可以查询此信息,并且你可以使用 Kubernetes 的访问控制机制来管理执行此操作的权限。
HorizontalPodAutoscaler (HPA) 和 VerticalPodAutoscaler (VPA) 使用 Metrics API 中的数据来调整工作负载副本和资源以满足客户需求。
你也可以使用 kubectl top
命令查看资源指标。
注意
Metrics API 及其启用的指标管线仅提供最少的 CPU 和内存指标,用于通过 HPA 和/或 VPA 实现自动伸缩。如果你想提供更完整的指标集,可以通过部署使用 *Custom Metrics API* 的第二个指标管线来补充更简单的 Metrics API。图 1 展示了资源指标管线的架构。
] A[Metrics-
Server] subgraph B[Nodes] direction TB D[cAdvisor] --> C[kubelet] E[Container
runtime] --> D E1[Container
runtime] --> D P[pod data] -.- C end L[API
server] W[HPA] C ---->|node level
resource metrics| A -->|metrics
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 服务器提供 Metrics API,供 HPA、VPA 以及
kubectl top
命令使用。Metrics Server 是 Metrics API 的参考实现。Metrics API:支持访问用于工作负载自动伸缩的 CPU 和内存的 Kubernetes API。要在你的集群中使其工作,你需要一个提供 Metrics API 的 API 扩展服务器。
注意
cAdvisor 支持从 cgroup 读取指标,这适用于 Linux 上的典型容器运行时。如果你使用的容器运行时使用其他资源隔离机制(例如虚拟化),则该容器运行时必须支持 CRI 容器指标,以便指标可供 kubelet 使用。
Metrics API
Kubernetes 1.8 [beta]
metrics-server 实现了 Metrics API。此 API 允许你访问集群中节点和 Pod 的 CPU 和内存使用情况。其主要作用是将资源使用指标提供给 K8s 自动伸缩组件。
以下是通过 jq
管道处理以便于阅读的针对 minikube
节点的 Metrics 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 的 Metrics 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"
}
}
]
}
Metrics API 定义在 k8s.io/metrics 仓库中。你必须启用 API 聚合层 并为 metrics.k8s.io
API 注册一个 APIService。
要了解有关 Metrics API 的更多信息,请参阅资源指标 API 设计、metrics-server 仓库以及资源指标 API。
注意
你必须部署 metrics-server 或提供 Metrics API 的替代适配器才能访问它。测量资源使用情况
CPU
CPU 以 CPU 单位测量的平均核心使用率来报告。在 Kubernetes 中,一个 CPU 对于云提供商相当于 1 个 vCPU/核心,对于裸金属 Intel 处理器相当于 1 个超线程。
此值是通过对内核提供的累积 CPU 计数器(在 Linux 和 Windows 内核中)取速率得出的。用于计算 CPU 的时间窗口显示在 Metrics API 的 window 字段下。
要了解 Kubernetes 如何分配和测量 CPU 资源,请参阅CPU 的含义。
内存
内存以工作集(以字节为单位)在指标收集时的瞬时值报告。
在理想情况下,“工作集”是内存中正在使用且在内存压力下无法释放的那部分内存量。然而,工作集的计算因主机操作系统而异,通常大量使用启发式方法来产生估算值。
Kubernetes 中容器工作集的模型期望容器运行时计算与相关容器关联的匿名内存。工作集指标通常也包含一些缓存的(文件支持的)内存,因为主机操作系统无法总是回收页。
要了解 Kubernetes 如何分配和测量内存资源,请参阅内存的含义。
Metrics Server
metrics-server 从 kubelet 获取资源指标,并通过 Metrics 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 满足 Deployment 中的标签选择器。
metrics-server 调用 kubelet API 从每个节点收集指标。根据 metrics-server 版本,它使用:
- v0.6.0+ 版本中的 Metrics resource 端点
/metrics/resource
,或者 - 旧版本中的 Summary API 端点
/stats/summary
接下来
要了解有关 metrics-server 的更多信息,请参阅 metrics-server 仓库。
你还可以查看以下内容:
要了解 kubelet 如何提供节点指标以及如何通过 Kubernetes API 访问这些指标,请阅读节点指标数据。