prometheus监控kubernetes
1829字约6分钟
2024-09-29
Prometheus 介绍
Prometheus(普罗米修斯)是一个最初在SoundCloud上构建的监控系统。自2012年成为社区开源项目, 拥有非常活跃的开发人员和用户社区。为强调开源及独立维护,Prometheus于2016年加入云原生云计算基 金会(CNCF),成为继Kubernetes之后的第二个托管项目。
https://prometheus.io/
https://github.com/prometheus
Prometheus组件与架构
Prometheus Server:收集指标和存储时间序列数据,并提供查询接口
ClientLibrary:客户端库
Push Gateway:短期存储指标数据。主要用于临时性的任务
Exporters:采集已有的第三方服务监控指标并暴露metrics
Alertmanager:告警
Web UI:简单的Web控制台
Prometheus基本使用:怎么来监控?
如果要想监控,前提是能获取被监控端指标数据,并且这个 数据格式必须遵循Prometheus数据模型,这样才能识别和 采集,一般使用exporter提供监控指标数据
exporter列表:
https://prometheus.io/docs/instrumenting/exporters
Prometheus Server:收集指标和存储时间序列数据,并提供查询接口
ClientLibrary:客户端库
Push Gateway:短期存储指标数据。主要用于临时性的任务
Exporters:采集已有的第三方服务监控指标并暴露metrics
Alertmanager:告警
Web UI:简单的Web控制台
Prometheus基本使用:部署
部署Prometheus:
docker run -d --name=prometheus -p 9090:9090 prom/prometheus
访问地址:http://ip:9090/
部署文档:https://prometheus.io/docs/prometheus/latest/installation/
部署Grafana:
docker run -d --name=grafana -p 3000:3000 grafana/grafana
访问地址:http://ip:3000/
部署文档:https://grafana.com/grafana/download
用户名/密码:admin/admin # 第一次需要重置密码
Prometheus基本使用:监控Linux服务器
node_exporter:用于监控Linux系统的指标采集器。
常用指标:
CPU
内存
硬盘
网络流量
文件描述符
系统负载
系统服务
数据接口:http://ip:9100/
使用文档:https://prometheus.io/docs/guides/node-exporter/
GitHub:https://github.com/prometheus/node_exporter
在Prometheus配置文件添加被监控端:
scrape_configs:
# The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
- job_name: 'prometheus'
# metrics_path defaults to '/metrics'
# scheme defaults to 'http'.
static_configs:
- targets: ['localhost:9090']
- job_name: 'Linux Server'
static_configs:
- targets: ['192.168.0.12:9100','192.168.0.13:9100']
使用Grafana展示node_exporter数据指标,仪表盘ID: 9276
Prometheus基本使用:查询数据
PromQL(Prometheus Query Language) 是 Prometheus 自己开发的数据查询 DSL 语言,语言表现力非常丰 富,支持条件查询、操作符,并且内建了大量内置函数,供我们针对监控数据的各种维度进行查询。
数据模型:
Prometheus将所有数据存储为时间序列;
具有相同度量名称以及标签属于同一个指标;
每个时间序列都由度量标准名称和一组键值对(称为标签)唯一标识, 通过标签查询指定指标。
指标格式:
<metric name>{<label name>=<label value>,...}
示例:
查询指标最新样本(称为瞬时向量):
node_cpu_seconds_total
可以通过附加一组标签来进一步过来这些时间序列:
node_cpu_seconds_total
查询指标近5分钟内样本(称为范围向量,时间单位 s,m,h,d,w,y): node_cpu_seconds_total{job="Linux Server"}[5m]
node_cpu_seconds_total{job="Linux Server"}[1h]
Kubernetes 监控指标
Kubernetes本身监控
Node资源利用率
Node数量
每个Node运行Pod数量
资源对象状态
Pod监控
Pod总数量及每个控制器预期数量
Pod状态
容器资源利用率:CPU、内存、网络
Kubernetes 监控实现思路
Pod
kubelet的节点使用cAdvisor提供的metrics接口获取该节点所有Pod和容器相关的性能指标数据。
指标接口:https://NodeIP:10250/metrics/cadvisor
Node
使用node_exporter收集器采集节点资源利用率。
项目地址:https://github.com/prometheus/node_exporter
K8s资源对象
kube-state-metrics采集了k8s中各种资源对象的状态信息。
项目地址:https://github.com/kubernetes/kube-state-metrics
在Kubernetes平台部署相关组件
prometheus-deployment.yaml # 部署Prometheus
prometheus-configmap.yaml # Prometheus配置文件,主要配置Kubernetes服务发现
prometheus-rules.yaml # Prometheus告警规则
grafana.yaml # 可视化展示
node-exporter.yml # 采集节点资源,通过DaemonSet方式部署,并声明让Prometheus收集
kube-state-metrics.yaml # 采集K8s资源,并声明让Prometheus收集
alertmanager-configmap.yaml # 配置文件,配置发件人和收件人
alertmanager-deployment.yaml # 部署Alertmanager告警组件
#安装nfs安装包(每个k8s节点都要安装)
yum install nfs-utils
#创建nfs共享目录
mkdir -p /nfs/kubernetes
#修改nfs配置文件
vim /etc/exports
/nfs/kubernetes *(rw,no_root_squash)
#启动nfs并加入开机自启
systemctl start nfs
systemctl enable nfs
#部署NFS实现自动创建PV插件:
git clone https://github.com/kubernetes-incubator/external-storage
cd nfs-client/deploy
kubectl apply -f rbac.yaml # 授权访问apiserver
kubectl apply -f deployment.yaml # 部署插件,需修改里面NFS服务器地址与共享目录
kubectl apply -f class.yaml # 创建存储类
kubectl get sc # 查看存储类
kubernetes-node-kubelet:获取kebelet暴露的指标,访问地址https://NodeIP:10250/metrics
kubernetes-node-cadvisor:获取kubelet暴露的cadvisor,访问地址https://NodeIP:10250/metrics/cadvisor
kubernetes-service-endpooints:从service列表只能endpoint发现pod为目标
kubernetes-pod:发现所有pod为目标
给pod重新标记标签
1.配置采集pod的默认采集信息,例如协议,端口,url
2.给pod添加标签,方便后面对数据多维度查询
#prometheus和altermanger手动热加载配置
curl -XPOST 10.244.169.152:9093/-/reload
Prometheus 告警
Prometheus报警功能利用Alertmanager组件完成,当Prometheus会对接收的指标数据比对告警规则,如果 满足条件,则将告警事件发送给Alertmanager组件,Alertmanager组件发送到接收人。
使用步骤:
部署Alertmanager
配置告警接收人
配置Prometheus与Alertmanager通信
在Prometheus中创建告警规则
global:
resolve_timeout: 5m
# 邮箱服务器
smtp_smarthost: 'smtp.163.com:25'
smtp_from: 'baojingtongzhi@163.com'
smtp_auth_username: 'baojingtongzhi@163.com'
smtp_auth_password: 'xxx'
smtp_require_tls: false
# 配置路由树
route:
group_by: [‘alertname’] # 根据告警规则组名进行分组
group_wait: 10s # 分组内第一个告警等待时间,10s内如有第二个告警会合并一个告警
group_interval: 10s # 发送新告警间隔时间
repeat_interval: 1h # 重复告警间隔发送时间
receiver: 'mail'
# 接收人
receivers:
- name: 'mail'
email_configs:
- to: 'zhenliang369@163.com'
# vi prometheus.yml
# 指定Alertmanager组件地址
alerting:
alertmanagers:
- static_configs:
- targets:
- 127.0.0.1:9093
# 执行告警规则
rule_files:
- "rules/*.yml"
# vi rules/general.yml
groups:
- name: example #告警规则组名称
rules:
# 任何实例5分钟内无法访问发出告警
- alert: InstanceDown # 告警规则名称
expr: up == 0 # 基于PromQL的触发条件
for: 5m # 等待评估时间
labels: # 自定义标签
severity: page
annotations: # 指定附加信息
summary: " {{ $labels.instance }} 停止工作"
description: "{{ $labels.instance }}:job {{ $labels.job }} 已经停止5分钟以上."
告警状态:
Inactive:这里什么都没有发生。
Pending:已触发阈值,但未满足告警持续时间
Firing:已触发阈值且满足告警持续时间。警报发送给接受者。
小结:
1.在k8s中部署应用,在service或者pod中配置注解
annotations:
prometheus.io/scrape: 'true'
2.数据被采集到,可以写任意告警规则,出现问题,第一时间通知你
3.如果grafana仪表盘无法满足需求,可以自定义
4.grafana图标没数据,数据没采集到,promq写的有问题,服务器时间没同步
5.altermanger和prometheus配置文件如果没生效,手动配置热加载
curl -XPOST 10.244.169.152:9093/-/reload
curl -XPOST 10.244.26.74:9090/-/reload