介绍Metrics-Server以前,必需要提一下Metrics API的概念node
Metrics API相比于以前的监控采集方式(hepaster)是一种新的思路,官方但愿核心指标的监控应该是稳定的,版本可控的,且能够直接被用户访问(例如经过使用 kubectl top 命令),或由集群中的控制器使用(如HPA),和其余的Kubernetes APIs同样。git
官方废弃heapster项目,就是为了将核心资源监控做为一等公民对待,即像pod、service那样直接经过api-server或者client直接访问,再也不是安装一个hepater来汇聚且由heapster单独管理。github
假设每一个pod和node咱们收集10个指标,从k8s的1.6开始,支持5000节点,每一个节点30个pod,假设采集粒度为1分钟一次,则:api
由于k8s的api-server将全部的数据持久化到了etcd中,显然k8s自己不能处理这种频率的采集,并且这种监控数据变化快且都是临时数据,所以须要有一个组件单独处理他们,k8s版本只存放部分在内存中,因而metric-server的概念诞生了。bash
其实hepaster已经有暴露了api,可是用户和Kubernetes的其余组件必须经过master proxy的方式才能访问到,且heapster的接口不像api-server同样,有完整的鉴权以及client集成。这个api如今还在alpha阶段(18年8月),但愿能到GA阶段。类api-server风格的写法:generic apiserver架构
有了Metrics Server组件,也采集到了该有的数据,也暴露了api,但由于api要统一,如何将请求到api-server的/apis/metrics
请求转发给Metrics Server呢,解决方案就是:kube-aggregator,在k8s的1.7中已经完成,以前Metrics Server一直没有面世,就是耽误在了kube-aggregator这一步。app
kube-aggregator(聚合api)主要提供:ide
Provide an API for registering API servers.spa
Summarize discovery information from all the servers.设计
Proxy client requests to individual servers.
详细设计文档:参考连接
metric api的使用:
Metrics API 只能够查询当前的度量数据,并不保存历史数据
Metrics API URI 为 /apis/metrics.k8s.io/,在 k8s.io/metrics 维护
必须部署 metrics-server 才能使用该 API,metrics-server 经过调用 Kubelet Summary API 获取数据
如:
http://127.0.0.1:8001/apis/metrics.k8s.io/v1beta1/nodes http://127.0.0.1:8001/apis/metrics.k8s.io/v1beta1/nodes/<node-name> http://127.0.0.1:8001/apis/metrics.k8s.io/v1beta1/namespace/<namespace-name>/pods/<pod-name>
Metrics server定时从Kubelet的Summary API(相似/ap1/v1/nodes/nodename/stats/summary)采集指标信息,这些聚合过的数据将存储在内存中,且以metric-api的形式暴露出去。
Metrics server复用了api-server的库来实现本身的功能,好比鉴权、版本等,为了实现将数据存放在内存中吗,去掉了默认的etcd存储,引入了内存存储(即实现Storage interface)。由于存放在内存中,所以监控数据是没有持久化的,能够经过第三方存储来拓展,这个和heapster是一致的。
Metrics server出现后,新的Kubernetes 监控架构将变成上图的样子
核心流程(黑色部分):这是 Kubernetes正常工做所须要的核心度量,从 Kubelet、cAdvisor 等获取度量数据,再由metrics-server提供给 Dashboard、HPA 控制器等使用。
监控流程(蓝色部分):基于核心度量构建的监控流程,好比 Prometheus 能够从 metrics-server 获取核心度量,从其余数据源(如 Node Exporter 等)获取非核心度量,再基于它们构建监控告警系统。
官方地址:https://github.com/kubernetes-incubator/metrics-server
mkdir metrics;cd metics git clone https://github.com/kubernetes-incubator/metrics-server.git cd metrics-server/deploy/1.8+/
修改metrics-server-deployment.yaml,红色部分。
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: metrics-server
namespace: kube-system
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: metrics-server
namespace: kube-system
labels:
k8s-app: metrics-server
spec:
selector:
matchLabels:
k8s-app: metrics-server
template:
metadata:
name: metrics-server
labels:
k8s-app: metrics-server
spec:
serviceAccountName: metrics-server
volumes:
# mount in tmp so we can safely use from-scratch images and/or read-only containers
- name: tmp-dir
emptyDir: {}
containers:
- name: metrics-server
image: k8s.gcr.io/metrics-server-amd64:v0.3.3
command:
- /metrics-server
- --metric-resolution=30s
- --kubelet-preferred-address-types=InternalIP,Hostname,InternalDNS,ExternalDNS,ExternalIP
- --kubelet-insecure-tls
imagePullPolicy: Always
volumeMounts:
- name: tmp-dir
mountPath: /tmp
建立
[root@cn-hongkong 1.8+]# kubectl apply -f . clusterrole.rbac.authorization.k8s.io/system:aggregated-metrics-reader unchanged clusterrolebinding.rbac.authorization.k8s.io/metrics-server:system:auth-delegator unchanged rolebinding.rbac.authorization.k8s.io/metrics-server-auth-reader unchanged apiservice.apiregistration.k8s.io/v1beta1.metrics.k8s.io unchanged serviceaccount/metrics-server unchanged deployment.extensions/metrics-server configured
等待一会就能够看下集群的资源使用状况了!