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/-/reloadPrometheus 告警
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
