多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
[TOC] ## **Kubelet的指标** kubelet通过`/metrics`暴露自身的指标数据。kubelet有两个端口都提供了这个url,一个是安全端口(10250),一个是非安全端口(10255,kubeadm安装的集群该端口是关闭的)。安全端口使用https协议,而且还需要认证与授权,所以我们通过浏览器直接访问 https://nodeip:10250/metrics, 会返回401 Unauthorized。 有两种方法可以在浏览器访问到这个Url:一个是开启kubelet的非安全端口;二是通过apiserver的代理API去访问:`/api/v1/nodes/{nodeName}/proxy/metrics`。 比如,我们一个集群有两个节点 ``` $ kubectl get node -o wide NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME peng01 Ready master 35d v1.17.3 192.168.2.101 <none> CentOS Linux 7 (Core) 4.19.12-1.el7.elrepo.x86_64 docker://18.9.9 peng02 Ready <none> 28s v1.17.3 192.168.2.102 <none> CentOS Linux 7 (Core) 4.19.12-1.el7.elrepo.x86_64 docker://19.3.12 ``` 我们可以通过以下两种方式,在浏览器中都可以访问到`peng02`的kubelet指标 方法一:kubelet的非安全端口 ![](https://img.kancloud.cn/84/57/8457b0379a5e2e895c58b94120d43219_1225x309.png) 方法二:apiserver的代理API ![](https://img.kancloud.cn/4a/12/4a12191089d9b271ef61c655c832d37c_1224x305.png) ## **监控Kubelet的指标** 假设我们直接使用如下的配置: ``` - job_name: kubelet kubernetes_sd_configs: - role: node ``` 由于prometheus中默认设置的kubelet的端口为10255,所以服务发现得到的Target的监听地址会是`http://nodeip:10255/metrics`,如下,很显然这是访问不通的 ![](https://img.kancloud.cn/2f/c2/2fc22415b0df4805ca2a7447b8027900_1355x293.png) kubelet的安全端口需要认证与授权(参考[《kubelet的认证》](https://www.kancloud.cn/pshizhsysu/kubernetes/1827158)),kubelet的认证机制有两种,kubeadm安装集群使用的是x509客户证书认证。 在使用prometheus监控kubelet时,由于prometheus容器中没有客户端证书,所我们通过Apiserver的代理API去采集kubelet的指标。 编辑prometheus-config.yaml,在采集任务中添加以下内容: ``` - job_name: kubelet scheme: https tls_config: ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token kubernetes_sd_configs: - role: node relabel_configs: - action: replace target_label: __address__ replacement: kubernetes.default.svc:443 - action: replace source_labels: [__meta_kubernetes_node_name] regex: (.+) target_label: __metrics_path__ replacement: /api/v1/nodes/${1}/proxy/metrics ``` 解释一下上面的配置。prometheus去采集kubelet时,kubelet指标的完整地址应该为 ``` https://kubernetes.default.svc:443/api/v1/nodes/{nodeName}/proxy/metrics ``` 所以,`scheme`应该为`https`;`tls_config`与`bearer_token_file`的原理参考Kubernetes的[《ServiceAccount》](https://www.kancloud.cn/pshizhsysu/kubernetes/1827155)。 对于`relabel_configs`,`__address__`可以直接重置为`kubernetes.default.svc:443`。然后是`__metrics_path__`,值应该为`/api/v1/nodes/{nodeName}/proxy/metrics`,这个`nodeName`的值,我们要如何获取呢? 我们先看一下每个Target的初始指标有哪些,如下: ![](https://img.kancloud.cn/d2/7d/d27d77600d51d4bda5d9c3eb6ffb4ecd_631x560.png) 从上面可以发现,通过`__meta_kubernetes_node_name`可以拿到`nodeName`的值。 对于`relabel_configs`的原理,请阅读第五章的《Prometheus的relabel-config》。