Kubernetes Metrics-Server介绍及源码分析
kubernetes 1.8之前如果想要收集k8s集群中关于容器,pod以及kubernetes event相关的监控数据,最好的方案是使用官方提供的heapster,但是1.8之后,该版本被社区给废弃了,取而代替是的社区新孵化的项目metrics-server。本篇文章记录下metrics-server的基本功能,及社区对该服务的定位。
metrics-sever介绍
简单明了,直接使用官方的解释:
Metrics Server
is a cluster-wide aggregator of resource usage data. Starting from Kubernetes 1.8 it’s deployed by default in clusters created by kube-up.sh script as a Deployment object. If you use a different Kubernetes setup mechanism you can deploy it using the provided deployment yamls. It’s supported in Kubernetes 1.7+ (see details below).
Metric server collects metrics from the Summary API, exposed by Kubelet on each node.
Metrics Server registered in the main API server through Kubernetes aggregator, which was introduced in Kubernetes 1.7.
metrics-server实现
Metrics Server
代码的实现也是深度复制了kube-apiserver
和heapster
的代码,借鉴了kube-apiserver
服务的启动流程框架,并借鉴了heapster
内部获取各个Node节点的CPU
和Mem
的部分代码。具体的实现流程如下:
通过Manager数据结构来管理metrics-server服务:
1 | type Manager struct { |
其中Manager结构中的resource
主要是收集k8s集群中各个node节点的node及pod的cpu和mem监控数据。主要是调用k8s的这个接口:http://localhost:8001/api/v1/proxy/nodes/<node-name>:10255/stats/summary
并用下面的数据结构对数据进行组织:
1 | // MetricsBatch is a single batch of pod, container, and node metrics from some source. |
而Manager结构中的sink主要负责将source收集过来的数据存储在内存中,最终业务访问下面的接口即可获取相关的数据:
metrics-server部署
直接按照官方的部署方式进行部署:
1 | Kubernetes 1.7 |
但是部署完成之后,可能会遇到下面的错误:
1 | Error from server (Forbidden): nodes.metrics.k8s.io is forbidden: User "system:anonymous" cannot list nodes.metrics.k8s.io at the cluster scope. |
说明system:anonymous
用户没有权限,给该用户授权:
1 | apiVersion: rbac.authorization.k8s.io/v1 |
最终通过kubectl top
检查服务是否能正常工作:
补充
1.基于metrics-server提供的core system metrics以及prometheus提供的custome metrics可以方便的实现HPA(Horizontal Pod Autoscaler)。
2.heapster除了提供基础的cpu,mem等监控指标,还支持收集k8s event的功能,当前metrics-server建议使用eventrouter但是支持的sink只有s3,kafka,stdout等,我这边对增加了对influxdb sink的支持。