原创 吴就业 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的架构图。
其中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
【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进行响应。
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进行响应。
通过上面的理解,我们已经知道,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艺术”的水印。
通常指标和日志收集这两者是一起的,可观测即离不开指标,也离不开日记。当两者都需要的时候,就没必要部署两个DaemonSet了。本篇将两者结合成一个完整的案例,大家可以直接拿去部署使用。
本篇是作者在云原生PaaS平台项目中实战可观测能力做的技术调研,将关键技术知识点讲透,涉及:如何获取Pod的cpu和内存指标、使用Grafana Agent收集指标、上传到Prometheus。
本篇是作者在云原生PaaS平台项目中实战可观测能力做的技术调研,将关键技术知识点讲透,涉及:如何获取Pod的标准输出(stdout)日志、如何使用Grafana Agent收集日志(附配置案例讲解)、如何将日志上传Grafana Loki。
订阅
订阅新文章发布通知吧,不错过精彩内容!
输入邮箱,提交后我们会给您发送一封邮件,您需点击邮件中的链接完成订阅设置。