Kubernetes核心指标监控——Metrics Server详解

news2025/1/19 19:42:33

1、概述

从Kubernetes v1.8 开始,资源使用情况的监控可以通过 Metrics API的形式获取,例如容器CPU和内存使用率。这些度量可以由用户直接访问(例如,通过使用kubectl top命令),或者由集群中的控制器(例如,Horizontal Pod Autoscaler)使用来进行决策,具体的组件为Metrics Server,用来替换之前的heapster,heapster从1.11开始逐渐被废弃。

Metrics-Server是集群核心监控数据的聚合器。通俗地说,它存储了集群中各节点的监控数据,并且提供了API以供分析和使用。Metrics-Server作为一个 Deployment对象默认部署在Kubernetes集群中。不过准确地说,它是Deployment,Service,ClusterRole,ClusterRoleBinding,APIService,RoleBinding等资源对象的综合体。

项目地址:https://github.com/kubernetes-sigs/metrics-server ,目前稳定版本是v0.6.2。

img

metric-server主要用来通过aggregate api向其它组件(kube-scheduler、HorizontalPodAutoscaler、Kubernetes集群客户端等)提供集群中的pod和node的cpu和memory的监控指标,弹性伸缩中的podautoscaler就是通过调用这个接口来查看pod的当前资源使用量来进行pod的扩缩容的。

需要注意的是:

  • metric-server提供的是实时的指标(实际是最近一次采集的数据,保存在内存中),并没有数据库来存储
  • 这些数据指标并非由metric-server本身采集,而是由每个节点上的cadvisor采集,metric-server只是发请求给cadvisor并将metric格式的数据转换成aggregate api
  • 由于需要通过aggregate api来提供接口,需要集群中的kube-apiserver开启该功能(开启方法可以参考官方社区的文档)

2、部署Metrics Server

2.1 下载并部署Metrics Server

下载部署清单:

wget https://github.com/kubernetes-sigs/metrics-server/releases/download/v0.6.2/components.yaml

修改部署清单内容:

apiVersion: v1
kind: ServiceAccount
metadata:
  labels:
    k8s-app: metrics-server
  name: metrics-server
  namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  labels:
    k8s-app: metrics-server
    rbac.authorization.k8s.io/aggregate-to-admin: "true"
    rbac.authorization.k8s.io/aggregate-to-edit: "true"
    rbac.authorization.k8s.io/aggregate-to-view: "true"
  name: system:aggregated-metrics-reader
rules:
- apiGroups:
  - metrics.k8s.io
  resources:
  - pods
  - nodes
  verbs:
  - get
  - list
  - watch
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  labels:
    k8s-app: metrics-server
  name: system:metrics-server
rules:
- apiGroups:
  - ""
  resources:
  - nodes/metrics
  verbs:
  - get
- apiGroups:
  - ""
  resources:
  - pods
  - nodes
  verbs:
  - get
  - list
  - watch
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  labels:
    k8s-app: metrics-server
  name: metrics-server-auth-reader
  namespace: kube-system
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: extension-apiserver-authentication-reader
subjects:
- kind: ServiceAccount
  name: metrics-server
  namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  labels:
    k8s-app: metrics-server
  name: metrics-server:system:auth-delegator
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: system:auth-delegator
subjects:
- kind: ServiceAccount
  name: metrics-server
  namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  labels:
    k8s-app: metrics-server
  name: system:metrics-server
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: system:metrics-server
subjects:
- kind: ServiceAccount
  name: metrics-server
  namespace: kube-system
---
apiVersion: v1
kind: Service
metadata:
  labels:
    k8s-app: metrics-server
  name: metrics-server
  namespace: kube-system
spec:
  ports:
  - name: https
    port: 443
    protocol: TCP
    targetPort: https
  selector:
    k8s-app: metrics-server
---
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    k8s-app: metrics-server
  name: metrics-server
  namespace: kube-system
spec:
  selector:
    matchLabels:
      k8s-app: metrics-server
  strategy:
    rollingUpdate:
      maxUnavailable: 0
  template:
    metadata:
      labels:
        k8s-app: metrics-server
    spec:
      containers:
      - args:
        - --cert-dir=/tmp
        - --secure-port=4443
        - --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname
        - --kubelet-use-node-status-port
        - --metric-resolution=15s
        - --kubelet-insecure-tls
        image: k8s.gcr.io/metrics-server/metrics-server:v0.6.2
        imagePullPolicy: IfNotPresent
        livenessProbe:
          failureThreshold: 3
          httpGet:
            path: /livez
            port: https
            scheme: HTTPS
          periodSeconds: 10
        name: metrics-server
        ports:
        - containerPort: 4443
          name: https
          protocol: TCP
        readinessProbe:
          failureThreshold: 3
          httpGet:
            path: /readyz
            port: https
            scheme: HTTPS
          initialDelaySeconds: 20
          periodSeconds: 10
        resources:
          requests:
            cpu: 100m
            memory: 200Mi
        securityContext:
          allowPrivilegeEscalation: false
          readOnlyRootFilesystem: true
          runAsNonRoot: true
          runAsUser: 1000
        volumeMounts:
        - mountPath: /tmp
          name: tmp-dir
      nodeSelector:
        kubernetes.io/os: linux
      priorityClassName: system-cluster-critical
      serviceAccountName: metrics-server
      volumes:
      - emptyDir: {}
        name: tmp-dir
---
apiVersion: apiregistration.k8s.io/v1
kind: APIService
metadata:
  labels:
    k8s-app: metrics-server
  name: v1beta1.metrics.k8s.io
spec:
  group: metrics.k8s.io
  groupPriorityMinimum: 100
  insecureSkipTLSVerify: true
  service:
    name: metrics-server
    namespace: kube-system
  version: v1beta1
  versionPriority: 100

在deploy中,spec.template.containers.args字段中加上--kubelet-insecure-tls选项,表示不验证客户端证书;上述清单主要用deploy控制器将metrics server运行为一个pod,然后授权metrics-server用户能够对pod/node资源进行只读权限;然后把metrics.k8s.io/v1beta1注册到原生apiserver上,让其客户端访问metrics.k8s.io下的资源能够被路由至metrics-server这个服务上进行响应;

镜像被墙怎么办?

修改镜像 k8s.gcr.io/metrics-server/metrics-server:v0.6.2 -> admin4j/metrics-server:v0.6.2

或者参考 k8s镜像下载不下来?利用 github Action 自己动手一次性解决难题,丰衣足食

应用资源清单:

[root@master1 metrics-server]# kubectl apply -f components.yaml
serviceaccount/metrics-server created
clusterrole.rbac.authorization.k8s.io/system:aggregated-metrics-reader created
clusterrole.rbac.authorization.k8s.io/system:metrics-server created
rolebinding.rbac.authorization.k8s.io/metrics-server-auth-reader created
clusterrolebinding.rbac.authorization.k8s.io/metrics-server:system:auth-delegator created
clusterrolebinding.rbac.authorization.k8s.io/system:metrics-server created
service/metrics-server created
deployment.apps/metrics-server created
apiservice.apiregistration.k8s.io/v1beta1.metrics.k8s.io created

2.2 验证Metrics Server组件部署成功

(1)查看原生apiserver是否有metrics.k8s.io/v1beta1

[root@master1 metrics-server]# kubectl api-versions|grep metrics
metrics.k8s.io/v1beta1

可以看到metrics.k8s.io/v1beta1群组已经注册到原生apiserver上。

(2)查看metrics server pod是否运行正常

[root@master1 ~]# kubectl get pods -n=kube-system |grep metrics
metrics-server-855cc6b9d-g6xsf  1/1   Running  0     18h

可以看到对应pod已经正常运行,接着查看pod日志,只要metrics server pod没有出现错误日志,或者无法注册等信息,就表示pod里的容器运行正常。

(3)使用kubectl top 命令查看pod的cpu ,内存占比,看看对应命令是否可以正常执行,如果Metrics Server服务有异常的话会报Error from server (ServiceUnavailable): the server is currently unable to handle the request (get nodes.metrics.k8s.io)错误。

[root@master1 ~]# kubectl top nodes
NAME      CPU(cores)   CPU%   MEMORY(bytes)   MEMORY%  
master1   272m         3%     4272Mi          29%      
node1     384m         5%     9265Mi          30%      
node2     421m         5%     14476Mi         48%  

可以看到kubectl top命令可以正常执行,说明metrics server 部署成功没有问题。

3、原理

Metrics server定时从Kubelet的Summary API(类似/ap1/v1/nodes/nodename/stats/summary)采集指标信息,这些聚合过的数据将存储在内存中,且以metric-api的形式暴露出去。

Metrics server复用了api-server的库来实现自己的功能,比如鉴权、版本等,为了实现将数据存放在内存中吗,去掉了默认的etcd存储,引入了内存存储(即实现Storage interface)。

因为存放在内存中,因此监控数据是没有持久化的,可以通过第三方存储来拓展。

来看下Metrics-Server的架构:

Metrics-Server的架构

从 Kubelet、cAdvisor 等获取度量数据,再由metrics-server提供给 Dashboard、HPA 控制器等使用。本质上metrics-server相当于做了一次数据的转换,把cadvisor格式的数据转换成了kubernetes的apijson格式。由此我们不难猜测,metrics-server的代码中必然存在这种先从metric中获取接口中的所有信息,再解析出其中的数据的过程。我们给metric-server发送请求时,metrics-server中已经定期从中cadvisor获取好数据了,当请求发过来时直接返回缓存中的数据。

4、如何获取监控数据

Metrics-Server通过kubelet获取监控数据。

在1.7版本之前,k8s在每个节点都安装了一个叫做cAdvisor的程序,负责获取节点和容器的CPU,内存等数据;而在1.7版本及之后,k8s将cAdvisor精简化内置于kubelet中,因此可直接从kubelet中获取数据。

5、如何提供监控数据

img

Metrics-Server通过metrics API提供监控数据。

先说下API聚合机制,API聚合机制是kubernetes 1.7版本引入的特性,能将用户扩展的API注册至API Server上。

API Server在此之前只提供kubernetes资源对象的API,包括资源对象的增删查改功能。有了API聚合机制之后,用户可以发布自己的API,而Metrics-Server用到的metrics APIcustom metrics API均属于API聚合机制的应用。

用户可通过配置APIService资源对象以使用API聚合机制,如下是metrics API的配置文件:

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

如上,APIService提供了一个名为v1beta1.metrics.k8s.io的API,并绑定至一个名为metrics-server的Service资源对象。

可以通过kubectl get apiservices命令查询集群中的APIService。

因此,访问Metrics-Server的方式如下:

/apis/metrics.k8s.io/v1beta1  --->   metrics-server.kube-system.svc  --->   x.x.x.x
 
+---------+       +-----------+                   +------------------------+        +-----------------------------+
| 发起请求 +----->+ API Server +----------------->+ Service:metrics-server +-------->+ Pod:metrics-server-xxx-xxx |

有了访问Metrics-Server的方式,HPA,kubectl top等对象就可以正常工作了。

6、总结

kubernetes的新监控体系中,metrics-server属于Core metrics(核心指标),提供API metrics.k8s.io,仅提供Node和Pod的CPU和内存使用情况。而其他Custom Metrics(自定义指标)由Prometheus等组件来完成,后续文章将对自定义指标进行解析。

参考:https://staight.github.io/2019/09/12/metrics-server%E6%B5%85%E8%B0%88/

参考:http://yost.top/2020/05/17/about-metric-server/

参考:https://yasongxu.gitbook.io/container-monitor/yi-.-kai-yuan-fang-an/di-1-zhang-cai-ji/metrics-server

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/93154.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Simulink|电动汽车、永磁电动机建模与仿真

目录 1 永磁同步电机 1.1 概述 1.2 PMSM 的建模 1.3 PMSM 的矢量控制 1.4 使用 SIMSCAPE 块建模 1.5 子系统ECU 2 直流电机 3 电动车 1 永磁同步电机 1.1 概述 本文旨在模拟永磁同步电机的性能,该电机使用 Rinehart 运动系统-交流电机控制器进行控制。首先收…

基于C+++Oracle11实现(PC)学生成绩教务管理系统【100010050】

学生成绩教务管理系统 一.分析与建模 系统业务流程图 项目用例图: 功能需求分析与建模 数据需求分析与建模 体之间的联系:学生信息表(student)、教师信息表(teacher)、管理员信息表(Administ…

Redisson夺命15连问

在一个分布式系统中,由于涉及到多个实例同时对同一个资源加锁的问题,像传统的synchronized、ReentrantLock等单进程情况加锁的api就不再适用,需要使用分布式锁来保证多服务实例之间加锁的安全性。常见的分布式锁的实现方式有zookeeper和redis…

深入Java线程池:从设计思想到源码解读

1. 前言 线程池深入详解 2. 初识线程池 我们知道,线程的创建和销毁都需要映射到操作系统,因此其代价是比较高昂的。出于避免频繁创建、销毁线程以及方便线程管理的需要,线程池应运而生。 2.1. 线程池优势 降低资源消耗:线程池…

【观察】亚马逊云科技:探索Serverless创新的“无人区”

毫无疑问,从2006年发展至今的公有云,堪称是云计算的黄金时代。在此过程中,云计算领域涌现出了很多改变传统IT架构和运维方式的新技术,特别是Serverless(无服务器计算)架构的出现,更带来了一次跨…

re:Invent|亚马逊云科技如何赋能广告、游戏、医疗

亚马逊云科技是如何高效利用海量跨域数据进行广告营销的同时,保障用户数据安全隐私呢?亚马逊云科技又在游戏行业、医疗与生命科学、汽车、金融等等行业和领域纷纷推出哪些关键发布和创新应用呢?应行业需求而生,解业务场景之痛&…

用 Footprint Analytics 的数据 API 快速建立你的项目

Footprint 有一个独特的、非常灵活的API,允许你为数据分析建立成熟的数据管道,以及机器学习应用。这是通过提供两种类型的接口来实现的:第一种是用于将数据上传到平台(Upload API);第二种是用于从平台获取数…

C语言函数全解

文章目录一.函数的概念二.C语言中函数的分类2.1库函数C语言库函数的大致分类C语言学习/查找途径2.2自定义函数函数的实参函数的形参函数的传值调用函数的传址调用三.函数的返回值四.函数的链式访问五.函数的嵌套调用六.函数的定义和声明七.函数的递归7.1例题.递归求字符串长度7…

如何使用 FastReport VCL 对文件进行数字签名?

FastReport VCL是用于在软件中集成商务智能的现代解决方案。它提供了可视化模板设计器,可以访问最受欢迎的数据源,报告引擎,预览,将过滤器导出为30多种格式,并可以部署到云,Web,电子邮件和打印中…

MySQL主从复制太慢,怎么办?

本文分析了MySQL主从延迟的原因以及介绍了MTS方案。点击上方“后端开发技术”,选择“设为星标” ,优质资源及时送达mysql主从同步延迟原因导致备库延迟的原因主要有如下几种:通常备库所在机器的性能要比主库所在的机器性能差,执行…

用DIV+CSS技术设计的体育主题网站(足球介绍)

🎉精彩专栏推荐 💭文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业: 【📚毕设项目精品实战案例 (10…

STM32F4 | 窗口门狗(WWDG)实验

文章目录一、STM32F4 窗口看门狗简介二、硬件设计三、软件设计四、实验现象五、STM32CubeMX 配置 WWDG在本章中,我们将使用窗口看门狗的 中断功能来喂狗,通过 DS0 和 DS1 提示程序的运行状态。一、STM32F4 窗口看门狗简介 窗口看门狗(WWDG&…

【机器学习】算法术语、决策函数、概率模型、神经网络的详细讲解(图文解释)

一、机器学习算法术语 1)数据集(Data Set),训练集(Training Set),验证集(Validation Set)和测试集(Test Set) 数据集分为训练数据和测试数据。测…

100%都会感染,第一波症状最重,后面会轻。家里一定要备这些东西!

这是某医院院长在医院内部会议上关于新冠防治的强调内容,我听了很受教育,觉得非常有必要普及开来,我相信这位院长的专业性。这段会议发言的录音已经在网上流传,由于录音听起来费时且不宜传播,我已将录音转为文字&#…

Kibana入门教程

一、什么是Kibana   Kibana 是一个开源的分析和可视化平台,Kibana 提供搜索、查看和与存储在 Elasticsearch 索引中的数据进行交互的功能。开发者或运维人员可以轻松地执行高级数据分析,并在各种图表、表格和地图中可视化数据 二、安装使用 ①&#xf…

社招前端常考手写面试题总结

手写 Promise const PENDING "pending"; const RESOLVED "resolved"; const REJECTED "rejected";function MyPromise(fn) {// 保存初始化状态var self this;// 初始化状态this.state PENDING;// 用于保存 resolve 或者 rejected 传入的值…

【Python机器学习】使用决策树模型预测消费者未来消费行为实战(附源码和数据集 超详细)

需要源码和数据集请点赞关注收藏后评论区留言私信~~~ 一个预测未来消费行为的示例,即已经采集了过去消费行为的信息,并用来建立一个模型以对未来的消费行为进行预测。该示例简要演示了数据预处理、提取特征、选择模型、训练模型、评估模型、应用等阶段&a…

ModStartCMS v5.4.0 输入过滤增强,导入导出支持

ModStart 是一个基于 Laravel 模块化极速开发框架。模块市场拥有丰富的功能应用,支持后台一键快速安装,让开发者能快的实现业务功能开发。 系统完全开源,基于 Apache 2.0 开源协议,免费且不限制商业使用。 功能特性 丰富的模块市…

【Java初阶】面向对象三大特性之继承

一、继承 理解继承 Cat继承了Animal类,其中:Animal类称为父类/基类或超类,Cat可以称为Animal的 子类/派生类,继承之后,子类可以复用父类中成员,子类在实现时只需关心自己新增加的成员即可 Java中不支持多继…

DBCO-PEG24-O-amine,DBCO-PEG24-O-NH2,二苯并环辛炔-二十四聚乙二醇-O-氨基

DBCO-PEG24-O-amine中叠氮化物和DBCO基团,DBCO 点击化学可以在水性缓冲液中运行,也可以在有机溶剂取决于底物分子的性质。带有 PEG 臂的试剂会增加化合物的亲水性。DBCO 试剂已应用于生物偶联、标记和化学生物学。 DBCO系列产品包括可用于进一步连接的DB…