prometheus监控k8s集群
实现思路
pod性能:
使用cadvisor进行实现,监控容器的CPU、内存利用率
Node性能:
使用node-exporter实现,主要监控节点CPU、内存利用率
K8S资源对象:
使用kube-state-metrics实现,主要用于监控pod、deployment、service
事情是这样子,公司培训性能测试,讲师讲了容器监控的环节,涉及到jmeter监听器、k8s容器监控、主机监控、jmeter性能测试展示各个工具的展示,心想着我也是搞过k8s的人,是不是也可以搭建下。
首先是grafana已经搭建了,而且已经集成Prometheus进行主机的监控了,错就错在此处,后面我会再提到这个事情。
其次,我就开始寻找教程,容器监控目前有三种,cadvsior、metrics-server、kube-state-metrics,
各种博客也有介绍它们三个的区别,还有一个heapster工具,说是k8s1.16后废弃的功能,可是我目前在是使用的k8s才1.14版本,只能硬着头皮试下了。目前我这个环境的k8s也安装了merics-server、heapster、cadvsior,这三个软件我就没有动了。从grafana模板入手,
1 K8S for Prometheus Dashboard 20211010 dashboard for Grafana | Grafana Labs
从这个模板入手,就看到作者的github教程里说的要安装kube-state-metrics_v1.9.8
特别提示如下问题: 请看三遍、请看三遍、请看三遍!!!!!!
- 兼容kube-state-metrics_v1.9.x、kube-state-metrics_v2.x
- 支持Grafana 7.5.11、Grafana 8.x
Grafana7的用户请更新到
7.5.11+
(K8S v1.16及以下的版本建议使用kube-state-metrics_v1.9.8)
我刚入手就看到这么几个字,然后下载作者提供的kube-state-metrics部署文件进行安装。
https://github.com/starsliao/Prometheus/tree/master/kubernetes
创建命名空间 ops-minit,把软件部署到这个容器里面。后面的的后面就是暴露这个端口给在外部安装的Prometheus,这里有个疑问就是作者并没有提到他的Prometheus是不是安装到容器内,这个地方跟我的环境不同。
从github issue上留言看到是配置到kube-cadvisor的任务上
https://github.com/starsliao/Prometheus/issues/122
我猜测作者的Prometheus是安装在k8s内的,注意看配置Prometheus的配置
注意:Prometheus需要能采集到
cadvisor
与kube-state-metrics
的指标。
- cAdvisor作为kubelet内置的一部分程序可以直接使用。
- kube-state-metrics部署可参考:Prometheus/kubernetes at master · starsliao/Prometheus · GitHub
Prometheus job配置参考(kube-state-metrics部署在ops-monit命名空间):
- job_name: 'k8s-cadvisor'
metrics_path: /metrics/cadvisor
kubernetes_sd_configs:
- role: node
relabel_configs:
- source_labels: [__address__]
regex: '(.*):10250'
replacement: '${1}:10255'
target_label: __address__
action: replace
- action: labelmap
regex: __meta_kubernetes_node_label_(.+)
metric_relabel_configs:
- source_labels: [instance]
separator: ;
regex: (.+)
target_label: node
replacement: $1
action: replace
- source_labels: [pod_name]
separator: ;
regex: (.+)
target_label: pod
replacement: $1
action: replace
- source_labels: [container_name]
separator: ;
regex: (.+)
target_label: container
replacement: $1
action: replace
- job_name: kube-state-metrics
kubernetes_sd_configs:
- role: endpoints
namespaces:
names:
- ops-monit
relabel_configs:
- source_labels: [__meta_kubernetes_service_label_app_kubernetes_io_name]
regex: kube-state-metrics
replacement: $1
action: keep
- action: labelmap
regex: __meta_kubernetes_service_label_(.+)
- source_labels: [__meta_kubernetes_namespace]
action: replace
target_label: k8s_namespace
- source_labels: [__meta_kubernetes_service_name]
action: replace
target_label: k8s_sname
这个配置我不能用,因为我的prometheus是独立安装的,获取不到k8s的信息。
然后我找到了这个文章
Kubernetes云原生监控之kube-state-metrics集群资源监控 - 大军军军之技术落地 - 博客园
文章提到了:
由于
Kube State Metrics
组件需要通过与kube-apiserver
连接,并调用相应的接口去获取kubernetes
集群数据,这个过程需要Kube State Metrics
组件拥有一定的权限才能成功执行这些操作。在Kubernetes
中默认使用RBAC
方式管理权限。所以,我们需要创建相应的 RBAC 资源来提供该组件使用。
Prometheus 接入
kube-state-metrics创建的svc是
ClusterIP
类型,默认只能被集群内部访问。如果 prometheus部署在外部就需要配置认证。
cat prometheus.yml
- job_name: "kube-state-metrics"
scheme: http
kubernetes_sd_configs:
- api_server: https://k8sapi的ip:6443/
role: endpoints
## 指定kube-state-metrics组件所在的Namespace名称
namespaces:
names: ["kube-system"]
## names: ["monitoring"]
bearer_token_file: /data/k8s_token #访问k8s集群的认证文件
tls_config:
insecure_skip_verify: true
tls_config:
insecure_skip_verify: true
bearer_token_file: /data/k8s_token
relabel_configs:
## 指定从 app.kubernetes.io/name 标签等于 kube-state-metrics 的 service 服务获取指标信息
- action: keep
source_labels: [__meta_kubernetes_service_label_app_kubernetes_io_name]
regex: kube-state-metrics
## 下面配置也是为了适配 Grafana Dashboard 模板(编号13105图表)
- action: labelmap
regex: __meta_kubernetes_service_label_(.+)
- action: replace
source_labels: [__meta_kubernetes_namespace]
target_label: kubernetes_namespace
- action: replace
source_labels: [__meta_kubernetes_service_name]
target_label: kubernetes_service_name
获取api用户的token后保存文件,重新配置了Prometheus的配置。
获取token步骤:
获取密匙
$ kubectl get sa kube-state-metrics -n ops-monit -o yaml
$ kubectl get sa prometheus -n kube-mon -o yaml
......
secrets:
- name: prometheus-token-wj7fb
$ kubectl describe secret prometheus-token-wj7fb -n kube-mon
Name: prometheus-token-wj7fb
Namespace: kube-mon
......
Data
====
namespace: 8 bytes
token: <token string>
ca.crt: 1025 bytes
下面附上我的Prometheus配置:
- job_name: "kube-state-metrics"
scheme: https
kubernetes_sd_configs:
- api_server: https://k8s-api的ip:6443/
role: endpoints
namespaces:
names: ["ops-monit"]
bearer_token_file: k8s.token
tls_config:
insecure_skip_verify: true
tls_config:
insecure_skip_verify: true
bearer_token_file: k8s.token
relabel_configs:
- action: keep
source_labels: [__meta_kubernetes_service_label_app_kubernetes_io_name]
regex: kube-state-metrics
- action: labelmap
regex: __meta_kubernetes_service_label_(.+)
- action: replace
source_labels: [__meta_kubernetes_namespace]
target_label: kubernetes_namespace
- action: replace
source_labels: [__meta_kubernetes_service_name]
target_label: kubernetes_service_name
- job_name: k8s-cadvisor
honor_timestamps: true
metrics_path: /metrics
scheme: https
kubernetes_sd_configs:
- api_server: https:///k8s-api的ip:6443/
role: node # node 类型的自动发现
bearer_token_file: k8s.token
tls_config:
insecure_skip_verify: true
bearer_token_file: k8s.token
tls_config:
insecure_skip_verify: true
relabel_configs:
- action: labelmap
regex: __meta_kubernetes_node_label_(.+)
- separator: ;
regex: (.*)
target_label: __address__
replacement: k8s-api的ip:6443
action: replace
- source_labels: [__meta_kubernetes_node_name]
separator: ;
regex: (.+)
target_label: __metrics_path__
replacement: /api/v1/nodes/${1}/proxy/metrics/cadvisor
action: replace
最后配置Prometheus后,grafana的监控看板还是没有出来数据。再回到开头提到的问题,怀疑是grafana的版本问题,然后找了台机器重新安装grafana7.5.11。安装步骤参考如下教程:
grafana 安装配置详解_康建华的技术博客_51CTO博客
安装grafana7.5.11后重新导入模板,看板的数据立马出来了,至此我们也搭建好容器的监控,然后跑一个性能压测的脚本试下。性能压力测试截图如下:
总结以上问题:
1.先入为主的错误想法,grafana的版本问题太低,没有重新安装最新版本的grafana
2.Prometheus的独立安装配置抓取的方法,需要使用k8s的api-server接口
3.重新安装grafana导入模板,监控数据就出来。
遗留问题
1.Prometheus容器内安装的实践、配置
2.Prometheus使用k8s-api接口对k8s性能有没有影响
权威文档还是在官网github、博客园等社区找。高质量的文档还是很少,需要查阅大量文档才能实践成功。
参考引用:
1 K8S for Prometheus Dashboard 20211010 dashboard for Grafana | Grafana Labs
grafana 安装配置详解_康建华的技术博客_51CTO博客
Kubernetes云原生监控之kube-state-metrics集群资源监控 - 大军军军之技术落地 - 博客园
知其然,知其所以然,刨根问底!!
留个问题:kubernetes_sd_configs是个什么配置
参考其他完整安装的监控步骤:
prometheus监控k8s集群_fengge55的博客-CSDN博客_prometheus监控k8s容器
Prometheus部署 - Prometheus 入门到实战
吐槽下csdn的问题:
csdn博客编辑没有定时备份的bug,导致这个博客重写编写了一遍,可恶!!!
编辑博客的封面摘要,这些是跟微信公众号后台编辑学的吗?无脑的抄袭,垃圾的产品经理!