十五. 资源指标API以及自定义指标API

时间:2021-11-28 00:58:33

资源指标: Metrics-Server 资源指标: Metric-Server介绍

从k8s v1.8之后, 引入了Metric-API, 以前在使用heapster获取资源指标时, heapster有自己的获取路径, 没有通过apiServer, 所以之前资源指标的数据并不能通过apiServer直接获取, 用户和Kubernetes的其他组件必须通过master proxy的方式才能访问到. 后来k8s引入了资源指标API(Metrics API),有了Metrics Server组件,也采集到了该有的数据,也暴露了api,但因为api要统一,如何将请求到api-server的/apis/metrics请求转发给Metrics Server呢,解决方案就是:kube-aggregator, 于是资源指标的数据就从k8s的api中的直接获取,不必再通过其它途径。

Metrics API 只可以查询当前的度量数据,并不保存历史数据

Metrics API URI 为 /apis/metrics.k8s.io/,在 k8s.io/metrics 维护

必须部署 metrics-server 才能使用该 API,metrics-server 通过调用 Kubelet Summary API 获取数据

Metrics-Server收集指标数据的方式是从各节点上kubelet提供的Summary API 收集数据,收集Node和Pod核心资源指标数据,主要是内存和cpu方面的使用情况,并将收集的信息存储在内存中,所以当通过kubectl top不能查看资源数据的历史情况,其它资源指标数据则通过prometheus采集了。

k8s中很多组件是依赖于资源指标API的功能 ,比如kubectl top 、hpa,如果没有一个资源指标API接口,这些组件是没法运行的;

新一代监控系统由核心指标流水线和监控指标流水线协同组成

核心指标流水线:由kubelet、metrics-server以及由API server提供的api组成;cpu累计利用率、内存实时利用率、pod的资源占用率及容器的磁盘占用率

监控流水线:用于从系统收集各种指标数据并提供给终端用户、存储系统以及HPA,他们包含核心指标以及许多非核心指标。非核心指标不能被k8s所解析

Metric-Server部署 下载yaml文件 for i in auth-delegator.yaml auth-reader.yaml metrics-apiservice.yaml metrics-server-deployment.yaml metrics-server-service.yaml resource-reader.yaml;do wget https://raw.githubusercontent.com/kubernetes/kubernetes/master/cluster/addons/metrics-server/$i; done 因为有墙, 所以提前下载image镜像, 当然也可以手动修改yaml相关文件 docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/metrics-server-amd64:v0.3.5 docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/metrics-server-amd64:v0.3.5 k8s.gcr.io/metrics-server-amd64:v0.3.5 docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/addon-resizer:1.8.5 docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/addon-resizer:1.8.5 k8s.gcr.io/addon-resizer:1.8.5 修改文件, 不然报错

修改resource-reader.yaml

# 在resources下添加一行nodes/stats, 下列代码为部分代码 apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: system:metrics-server labels: kubernetes.io/cluster-service: "true" addonmanager.kubernetes.io/mode: Reconcile rules: - apiGroups: - "" resources: - pods - nodes/stats #添加此行 - nodes - namespaces

修改metrics-server-deployment.yaml

默认会从kubelet的基于HTTP的10255端口获取指标数据,但出于安全通信目的,kubeadm在初始化集群时会关掉10255端口,导致无法正常获取数据

# 第一个container metrics-server的command只留下以下三行 containers: - name: metrics-server image: k8s.gcr.io/metrics-server-amd64:v0.3.5 command: - /metrics-server - --kubelet-insecure-tls # 不验证客户端证书 - --kubelet-preferred-address-types=InternalIP # 直接使用节点IP地址获取数据 # 第二个container metrics-server-nanny的command中内存和CPU修改为自己需要的具体的数值 command: - /pod_nanny - --config-dir=http://www.mamicode.com/etc/config - --cpu=20m - --extra-cpu=0.5m - --memory=200Mi #{{ base_metrics_server_memory }} - --extra-memory=50Mi - --threshold=5 - --deployment=metrics-server-v0.3.5 - --container=metrics-server - --poll-period=300000 - --estimator=exponential - --minClusterSize=10 创建Metric-Server # 进入到yaml文件目录执行命令 kubectl apply -f ./ # 可以看到pod已经运行起来了 kubectl get pods -n kube-system |grep metrics-server [[email protected] ~]# kubectl api-versions|grep metrics #已经可以看到metric的api了 metrics.k8s.io/v1beta1 [[email protected] ~]# kubectl proxy --port=8080 [[email protected] ~]# curl :8080/apis/metrics.k8s.io/v1beta1 [[email protected] ~]# curl :8080/apis/metrics.k8s.io/v1beta1/nodes # kubectl可以使用了 [[email protected] ~]# kubectl top node NAME CPU(cores) CPU% MEMORY(bytes) MEMORY% master 513m 25% 1348Mi 78% node01 183m 18% 1143Mi 66% 自定义资源指标: Prometheus