Kubernetes是一個流行的容器編排平臺,Metrics API是其提供的一種API,用于收集和暴露關(guān)于節(jié)點和Pod的資源使用情況的指標。這些指標可以用于支持自動擴展、監(jiān)控和調(diào)優(yōu)等用例。通過部署Metrics API到Kubernetes集群中,Kubernetes API客戶端可以查詢這些指標,并在必要時使用Kubernetes的訪問控制機制來管理權(quán)限。
Metrics API提供了一組基本的指標,包括CPU和內(nèi)存使用情況等,這些指標可以幫助管理員更好地了解他們的集群的性能和健康狀況。同時,這些指標也可以用于實現(xiàn)自動伸縮,根據(jù)實際負載情況動態(tài)調(diào)整集群中節(jié)點和Pod的數(shù)量。
HorizontalPodAutoscaler (HPA) 和 VerticalPodAutoscaler (VPA) 使用 metrics API 中的數(shù)據(jù)調(diào)整工作負載副本和資源,以滿足客戶需求。也可以通過 kubectl top 命令來查看資源指標。
注意:Metrics API 及其啟用的指標管道僅提供最少的 CPU 和內(nèi)存指標,以啟用使用 HPA 和/或 VPA 的自動擴展。 如果想提供更完整的指標集,可以通過部署使用 Custom Metrics API 的第二個指標管道來作為簡單的 Metrics API 的補充。
一、資源指標管道架構(gòu)
下圖說明了資源指標管道的架構(gòu):
圖中從右到左的架構(gòu)組件包括以下內(nèi)容:
1、cAdvisor: 用于收集、聚合和公開 Kubelet 中包含的容器指標的守護程序。
2、kubelet: 用于管理容器資源的節(jié)點代理。 可以使用 /metrics/resource 和 /stats kubelet API 端點訪問資源指標。
3、節(jié)點層面資源指標: kubelet 提供的 API,用于發(fā)現(xiàn)和檢索可通過 /metrics/resource 端點獲得的每個節(jié)點的匯總統(tǒng)計信息。
4、metrics-server: 集群插件組件,用于收集和聚合從每個 kubelet 中提取的資源指標。 API 服務(wù)器提供 Metrics API 以供 HPA、VPA 和 kubectl top 命令使用。Metrics Server 是 Metrics API 的參考實現(xiàn)。
5、Metrics API: Kubernetes API 支持訪問用于工作負載自動縮放的 CPU 和內(nèi)存。 要在集群中進行這項工作,需要一個提供 Metrics API 的 API 擴展服務(wù)器。
注意:cAdvisor 支持從 cgroups 讀取指標,它適用于 Linux 上的典型容器運行時。 如果使用基于其他資源隔離機制的容器運行時,例如虛擬化,那么該容器運行時必須支持 CRI 容器指標 以便 kubelet 可以使用指標。
二、Metrics API
metrics-server 實現(xiàn)了 Metrics API。此 API 允許訪問集群中節(jié)點和 Pod 的 CPU 和內(nèi)存使用情況。 它的主要作用是將資源使用指標提供給 K8s 自動縮放器組件。
下面是一個 minikube 節(jié)點的 Metrics API 請求示例,通過 jq 管道處理以便于閱讀:
kubectl get --raw "/apis/metrics.k8s.io/v1beta1/nodes/minikube" | jq '.'
這是使用 curl 來執(zhí)行的相同 API 調(diào)用:
curl http://localhost:8080/apis/metrics.k8s.io/v1beta1/nodes/minikube
響應(yīng)示例:
{ "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 的 Metrics API 請求示例, 通過 jq 管道處理以便于閱讀:
kubectl get --raw "/apis/metrics.k8s.io/v1beta1/namespaces/kube-system/pods/kube-scheduler-minikube" | jq '.'
這是使用 curl 來完成的相同 API 調(diào)用:
curl http://localhost:8080/apis/metrics.k8s.io/v1beta1/namespaces/kube-system/pods/kube-scheduler-minikube
響應(yīng)示例:
{ "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在Kubernetes的代碼庫中定義,具體路徑是k8s.io/metrics。為了使用Metrics API,需要在Kubernetes集群上啟用API聚合層,并注冊一個名為metrics.k8s.io的APIService。
三、度量資源用量
1、CPU
CPU 報告為以 cpu 為單位測量的平均核心使用率。在 Kubernetes 中, 一個 cpu 相當于云提供商的 1 個 vCPU/Core,以及裸機 Intel 處理器上的 1 個超線程。
該值是通過對內(nèi)核提供的累積 CPU 計數(shù)器(在 Linux 和 Windows 內(nèi)核中)取一個速率得出的。 用于計算 CPU 的時間窗口顯示在 Metrics API 的窗口字段下。
2、內(nèi)存
內(nèi)存報告為在收集度量標準的那一刻的工作集大小,以字節(jié)為單位。在理想情況下,“工作集”是在內(nèi)存壓力下無法釋放的正在使用的內(nèi)存量。 然而,工作集的計算因主機操作系統(tǒng)而異,并且通常大量使用啟發(fā)式算法來產(chǎn)生估計。
Kubernetes 模型中,容器工作集是由容器運行時計算的與相關(guān)容器關(guān)聯(lián)的匿名內(nèi)存。 工作集指標通常還包括一些緩存(文件支持)內(nèi)存,因為主機操作系統(tǒng)不能總是回收頁面。
四、Metrics服務(wù)器
metrics-server 從 kubelet 中獲取資源指標,并通過 Metrics API 在 Kubernetes API 服務(wù)器中公開它們,以供 HPA 和 VPA 使用。 還可以使用 kubectl top 命令查看這些指標。
metrics-server 使用 Kubernetes API 來跟蹤集群中的節(jié)點和 Pod。metrics-server 服務(wù)器通過 HTTP 查詢每個節(jié)點以獲取指標。 metrics-server 還構(gòu)建了 Pod 元數(shù)據(jù)的內(nèi)部視圖,并維護 Pod 健康狀況的緩存。 緩存的 Pod 健康信息可通過 metrics-server 提供的擴展 API 獲得。
例如,對于 HPA 查詢,metrics-server 需要確定哪些 Pod 滿足 Deployment 中的標簽選擇器。
metrics-server 調(diào)用 kubelet API 從每個節(jié)點收集指標。根據(jù)它使用的 metrics-server 版本:
- 版本 v0.6.0+ 中,使用指標資源端點 /metrics/resource
- 舊版本中使用 Summary API 端點 /stats/summary