Kubernetes可观测之Metrics API,什么是Metrics API?

原创 吴就业 179 1 2024-03-18

本文为博主原创文章,未经博主允许不得转载。

本文链接:https://wujiuye.com/article/8e671212750848bc895881bbe9b1e80e

作者:吴就业
链接:https://wujiuye.com/article/8e671212750848bc895881bbe9b1e80e
来源:吴就业的网络日记
本文为博主原创文章,未经博主允许不得转载。

此为文章配套视频,如阅读本篇文章有不理解的地方,可观看此讲解视频!

k8s提供Metrics API 可用来获取Pod的cpu和内存指标,k8s提供这个能力其实主要是为了实现HPA和VPA的。k8s内置的HPA和VPA使用Metrics API获取指标实现水平/垂直自动扩缩容。

我们通过kubectl top命令查询的node和pod指标,就是通过Metrics API 查询的数据。

使用Metrics API 前提是集群已经安装Metrics Server组件。

那么,为什么要安装Metrics Server组件,以及Metrics API到底是什么?

下图是来自官方文档的关于Metrics API的架构图。

img

其中Metrics Server组件就是提供Metrics API的服务,Metrics Server会定时请求每个节点上的kubelet获取Node和Node上的Pod的cpu和内存指标,Metrics Server负责聚合数据,并存储在内存中。Metrics Server不会持久化指标数据。

Metrics Server需要注册成apiservice,HPA(client-go)、kubectl才能够通过请求kube-apiserver读取指标数据。而注册成Metrics Server,其实就是创建一个APIService资源,Metrics Server注册的APIService资源如下。

apiVersion: apiregistration.k8s.io/v1
kind: APIService
metadata:
  name: v1beta1.metrics.k8s.io
spec:
  group: metrics.k8s.io
  groupPriorityMinimum: 100
  insecureSkipTLSVerify: true
  service:
    name: metrics-server
    namespace: kube-system
    port: 443
  version: v1beta1
  versionPriority: 100

怎么理解apiservice以及APIService资源呢?

【Metrics API的架构图】图中的API服务器就是k8s的kube-apiserver,也就是一个https服务器,我们使用的kubectl命令,以及使用client-go组件访问资源(CRUD),都是通过请求这个kube-apiserver。

kube-apiserver包含aggregator组件和原生apiservice组件,aggregator这个组件主要作用是用来路由client请求。client请求首先到达aggregator,aggregator根据client请求的资源的group+version,将请求路由至对应的apiserver。aggregator默认情况会把所有请求都路由至原生的apiserver上进行响应。

如果我们需要自定义apiserver,就需要使用APIService这个资源将自定义apiserver注册到aggregator,这样aggregator才能根据APIService资源的定义,知道将满足该APIService定义的group+version的资源的请求路由至自定义apiserver进行响应。

whiteboard_exported_image

APIService资源spec的关键字段:

此处的APIService资源清单表示在aggregator上注册group为metrics.k8s.io和version为v1beta1的资源的自定义apiservice,而apiserver是kube-system名称空间下的metrics-server。即client访问v1beta1.metrics.k8s.io的资源的请求都会被路由至kube-system名称空间下的metrics-server进行响应。

至此,什么是Metrics API?

通过上面的理解,我们已经知道,HPA控制器和kubectl命令都是通过kubernetes API访问Metrics Server的“crd资源”来查询指标,Metrics Server通过注册APIService,让kube-apiserver知道请求group为metrics.k8s.io和version为v1beta1的资源的请求转发给Metrics Server。

根据官方文档介绍,假如我们自定义的Pod调度器想使用Metrics API,我们需要为自定义的Pod调度器申请资源的访问权限,如下:

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: sched-plugins-metrics-api-reader-role
rules:
  - apiGroups:
      - "metrics.k8s.io"
    resources:
      - pods # PodMetrics
      - nodes # NodeMetrics
    verbs:
      - get
      - list
      - watch

所以,Metrics Server提供了NodeMetrics和PodMetrics这两种资源。

我们可以通过kubectl get PodMetrics pod名称 -o yaml查询一个PodMetrics资源,例如:

wujiuye@wujiuyedeMacBook-Pro ~ % kubectl get PodMetrics hello-pod -o yaml
apiVersion: metrics.k8s.io/v1beta1
containers:
- name: count
  usage:
    cpu: 2074764n
    memory: 572Ki
kind: PodMetrics
metadata:
  creationTimestamp: "2024-03-18T11:47:54Z"
  name: hello-pod
  namespace: default
timestamp: "2024-03-18T11:47:16Z"
window: 17s

可以看到,PodMetrics资源的group为metrics.k8s.io,version为v1beta。

然后我们通过kubectl查询是否存在这样一个crd。

wujiuye@wujiuyedeMacBook-Pro ~ % kubectl get crd|grep "metrics.k8s.io"
wujiuye@wujiuyedeMacBook-Pro ~ % 

输出结果是空的。

说明,Metrics Server提供的资源并不实际存在,并没有对应的CRD(自定义资源定义)。资源也并不存在于etcd,而是crud请求到Metrics Server后,由Metrics Server动态生成资源对象返回。

不禁感叹,k8s这个底座设计的太牛了,我们不仅可以通过CRD + 控制台做扩展,还可以自定义APIService去做扩展。k8s,牛啊!


参考文献:【容器编排系统K8s之APIService资源https://www.cnblogs.com/qiuhom-1874/p/14279850.html

本文经「原本」原创认证,作者吴就业,访问yuanben.io查询【N9GH5TE5】获取授权信息。

#云原生

声明:公众号、CSDN、掘金的曾用名:“Java艺术”,因此您可能看到一些早期的文章的图片有“Java艺术”的水印。

文章推荐

使用Grafana Agent收集Pod的cpu和内存指标,以及标准输出日志的完整案例

通常指标和日志收集这两者是一起的,可观测即离不开指标,也离不开日记。当两者都需要的时候,就没必要部署两个DaemonSet了。本篇将两者结合成一个完整的案例,大家可以直接拿去部署使用。

如何获取Pod的CPU和内存指标,使用Grafana Agent收集指标,上传到Prometheus

本篇是作者在云原生PaaS平台项目中实战可观测能力做的技术调研,将关键技术知识点讲透,涉及:如何获取Pod的cpu和内存指标、使用Grafana Agent收集指标、上传到Prometheus。

如何获取Pod标准输出(stdout)日志,使用Grafana Agent收集,最后上传到Grafana Loki

本篇是作者在云原生PaaS平台项目中实战可观测能力做的技术调研,将关键技术知识点讲透,涉及:如何获取Pod的标准输出(stdout)日志、如何使用Grafana Agent收集日志(附配置案例讲解)、如何将日志上传Grafana Loki。

通过预测Pod的request实现超卖,如果是java感觉容易大面积重启?

超卖其实就是赌徒思想,堵的就是概率。一个节点上的个别Pod异常突增的概率都很小,同时很多Pod一起异常突增的概率更小。

k8s 自定义调度器禁用了某个评分插件,对默认调度器是否有影响?

不会影响到默认调度器,只会影响到scheduler-plugins调度器本身。默认调度器不会因为自定义调度器的配置而改变。

版本回滚是否应该把配置也一起回滚?

最近跟同事们争论的一个问题:一个应用发布平台,版本回滚是否应该支持把配置一同回滚?针对这个事情的讨论,我们分成了两派,一边是赞成派,一边反对派。