前言
前面我们已经学习到了prometheus的服务发现了,我们也基于kubernetes_sd_config对集群的node节点进行发现与监控了。那个是针对node_export指标数据监控节点自身资源使用情况的。但是并没有针对K8s组件,资源对象等做监控,例如kubelet,apiserver,pod,service,ingress等等。我们此次主要继续使用kubernetes_sd_config对K8s集群的资源进行监控。
一、监控kubelet
kubelet自带了监控数据的,而且是内置支持prometheus的,在Kubernetes 1.11+ 版本以后,kubelet的默认metrics接口端口是10250。此端口只能通过https协议去访问。因此我们使用kubernetes_sd_config进行监控时,协议需要选择为https,并且挂载证书文件。(由于我们前面在创建prometheus时创建了ServiceAccount资源对象,因此API的凭证会自动挂载到prometheus的pods中)
[root@k8s-master ~]# netstat -lntup | grep 10250
tcp6 0 0 :::10250 :::* LISTEN 23423/kubelet
[root@k8s-master ~]# vim prometh_configmap.yaml
- job_name: 'k8s-kubelet(服务发现)'
kubernetes_sd_configs:
- role: node
scheme: https
tls_config:
ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
insecure_skip_verify: true
bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
scheme:指定为https协议 tls_config:配置 TLS 连接 ca_file:用于验证 API 服务器证书的 CA 证书。 insecure_skip_verify:禁用服务器证书的验证。 bearer_token_file:用于验证 API 服务器的令牌
[root@k8s-master ~]# kubectl apply -f prometh_configmap.yaml
[root@k8s-master ~]# curl -X POST http://10.244.219.114:9090/-/reload #热加载配置文件
访问Web UI查看Targets
可以看到,kubelet组件的状态及相关指标监控数据已经采集上了。例如我们可以在grup界面查看当前K8s集群每一个节点运行了多少个Pod(kubelet_running_pods)
二、监控Pods
我们使用prometheus对K8s的pod资源进行监控时,可以借助cAdvisor进行。cAdvisor是内置在kubelet中,负责对当前的节点实时进行性能的监控与采集,当kubelet启动时会自动启动cAdvisor,即一个cAdvisor仅对一台Node机器进行监控。cAdvisor的指标数据接口是/metrics/cadvisor。具体可查看官方文档:https://kubernetes.io/zh/docs/concepts/cluster-administration/system-metrics/
[root@k8s-master ~]# vim prometh_configmap.yaml
- job_name: 'k8s-cAdvisor(服务发现)'
kubernetes_sd_configs:
- role: node
scheme: https
tls_config:
ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
insecure_skip_verify: true
bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
metrics_path: /metrics/cadvisor
[root@k8s-master ~]# kubectl apply -f prometh_configmap.yaml
[root@k8s-master ~]# curl -X POST http://10.244.219.114:9090/-/reload #热加载配置文件
查看Targets:
我们在上面可以看到,cAdvisor的服务发现是监控上了,但是数据有什么呢。关于pod的指标数据都有什么呢?cAdvisor服务发现的指标名称都是container开始的。例如我们计算monitor命名空间下所有pod的CPU在5分钟内的平均使用率 avg by (pod) (irate(container_cpu_usage_seconds_total{image!="", pod!="", namespace=“monitor”}[5m]))
三、监控kube-apiserver
K8s的apiserver组件是整个集群的唯一入口,所有人访问资源,创建资源,管理资源都是从apiserver进来的。因此我们需要把apiserver也监控上了。prometheus监控apiserver的话,可以使用kubernetes_sd_config中的Endpoints发现模式。那么为什么apiserver可以使用Endpoints发现模式,由于apiserver是集群的统一入口,在集群内部的一些服务和资源对象需要访问apiserver的话,就得与之进行网络通信,因此kubernetes默认会在defalue命名空间下创建一个名为kubernetes的Service资源对象。而Service资源对象又是通过Endpoints去进行管理与转发的。我们可以查看一下
[root@k8s-master ~]# kubectl get svc,ep
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.1.0.1 <none> 443/TCP 70d
NAME ENDPOINTS AGE
endpoints/kubernetes 172.16.1.37:6443 70d
[root@k8s-master ~]# vim prometh_configmap.yaml
- job_name: 'k8s-apiserver'
kubernetes_sd_configs:
- role: endpoints
scheme: https
tls_config:
ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
insecure_skip_verify: true
bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
relabel_configs:
- source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_endpoints_name, __meta_kubernetes_endpoint_port_name]
regex: default;kubernetes;https
action: keep
[root@k8s-master ~]# kubectl apply -f prometh_configmap.yaml [root@k8s-master ~]# curl -X POST http://10.244.219.114:9090/-/reload #热加载配置文件
查看Target界面
可以看到apiserver也已经监控上了。我们可以尝试获取一下apiserver最近一分钟里处理了多少请求。
sum (irate(apiserver_request_duration_seconds_count[1m]))
到这里我们就完成了对 Kubernetes ApiServer 的监控了。 如果我们还需要监控其他系统组件,比如 kube-controller-manager、kube-scheduler 的话应该怎么做呢?其中 kube-sheduler 的指标数据端口为 10251,kube-controller-manager 对应的端口为 10252,大家可以尝试下自己来配置下这几个系统组件。可以在节点使用netstat命令查看一下这些端口有没有在监听,因为Master节点的组件大部分都是静态pod来的。有兴趣的朋友可以查看我的github项目第四章,里面有对应的yaml文件。https://github.com/shaxiaozz/prometheus
|