Prometheus组件与架构
• Prometheus Server:收集指标和存储时间序列数据,并提供查询接口
• ClientLibrary:客户端库
• Push Gateway:短期存储指标数据。主要用于临时性的任务
• Exporters:采集已有的第三方服务监控指标并暴露metrics
• Alertmanager:告警
• Web UI:简单的Web控制台
Prometheus监控
如果要想监控,前提是能获取被监控端指标数据,并且这个数据格式必须遵循Prometheus数据模型,这样才能识别和
采集,一般使用exporter提供监控指标数据
Prometheus部署
格式
global:
scrape_interval: 15s
evaluation_interval: 15s
alerting:
alertmanagers:
- static_configs:
- targets:
- alertmanager:9093
rule_files:
- "first_rules.yml"
- "second_rules.yml"
scrape_configs:
- job_name: 'prometheus'
# metrics_path defaults to '/metrics'
# scheme defaults to 'http'.
static_configs:
- targets: ['localhost:9090']
-----------------------------------------------------------------------------
global:全局配置
scrape_interval: 15s # 采集数据时间间隔
evaluation_interval: 15s # 评估告警规则时间间隔,默认1分钟
scrape_timeout: 5s # 采集数据超时时间,默认10秒
alerting:告警配置
rule_files:告警规则
scrape_configs:配置被监控端,称为target,每个target用job_name分组管理,又分为静态配置和服务发现
remote_write/remote_read:从远程数据库读写
目标(targets):被监控端
实例(Instances):每个被监控端称为实例
作业(Job):具有相同目标的实例集合称为作业
相关安装
#安装时间同步
[root@es3 ~]# yum install ntpdate -y
[root@es3 ~]# ntpdate time.windows.com
http://192.168.153.27:9090/
#安装prometheus
[root@es3 ~]# docker run -d --name=prometheus -p 9090:9090 prom/prometheus
http://192.168.153.27:3000
监控自身
指标
prometheus_http_requests_total
target
数据收集
http://192.168.153.27:9090/metrics
grafana展示
监控Linux服务器
node_exporter
[root@es3 ~]# nohup ./node_exporter >/dev/null 2>&1
数据收集
http://192.168.153.27:9100/metrics
修改配置文件
[root@es3 ~]# docker exec -it prometheus sh
/prometheus $ vi /etc/prometheus/prometheus.yml
--------------------------------------------------------------------
- job_name: 'Linux Server'
static_configs:
- targets: ['192.168.199.17:9100']
重启服务
[root@es3 ~]# docker restart prometheus
prometheus
查看是否被监控
grafana展示
查询数据
数据模型
001 Prometheus将所有数据存储为时间序列;
002 具有相同度量名称以及标签属于同一个指标;
003 每个时间序列都由度量标准名称和一组键值对(称为标签)唯一标识,通过标签查询指定指标。
指标格式
{=,...}
示例
查询指标最新样本(称为瞬时向量):
node_cpu_seconds_total
可以通过附加一组标签来进一步过来这些时间序列:
node_cpu_seconds_total{job="Linux Server"}
查询指标近5分钟内样本(称为范围向量,时间单位 s,m,h,d,w,y):
node_cpu_seconds_total{job="Linux Server"}[5m]
node_cpu_seconds_total{job="Linux Server"}[1h]
Prometheus监控K8S
Kubernetes监控指标
监控指标
具体实现
举例
Pod性能
cAdvisor
CPU、内存、网络等
Node性能
node-exporter
CPU、内存、网络等
K8S资源对象
kube-state-metrics
Pod、Deployment、Service等
Kubernetes 监控实现思路
Pod
kubelet的节点使用cAdvisor提供的metrics接口获取该节点所有Pod和容器相关的性能指标数据。
Node
使用node_exporter收集器采集节点资源利用率。
K8s资源对象
kube-state-metrics采集了k8s中各种资源对象的状态信息。
prometheus-configmap
kubernetes-nodes-kubelet:
• 获取kubectl暴露的节点指标(kubectl get node)
• https://NodeIP:10250/metrics
----------------------------------------------------------------------
kubernetes-nodes-cadvisor:
• 获取kubectl暴露的cadvisor中容器的指标
• https://NodeIP:10250/metrics/cadvisor
----------------------------------------------------------------------
kubernetes-service-endpoints:
• 从service列表中的endpoint发现pod为目标
• kubectl get ep
• target_label: kubernetes_name(重新标记标签)
----------------------------------------------------------------------
kubernetes-pods:
• 发现所有pod为目标
• kubectl get pod
• target_label: kubernetes_pod_name(重新标记标签)
----------------------------------------------------------------------
给pod重新标记标签的意义:
• 方便后面对数据多维度查询
kube-state-metrics
• 声明让prometheus收集
name: kube-state-metrics
namespace: ops
annotations:
prometheus.io/scrape: 'true'
----------------------------------------------------------------------
• 采集
apiserver > kube-metrics>http://NodeIP:8080或http://NodeIP:8081
• 监控pod状态,如果不是running(pending 资源不足,污点,拉取镜像 )
• 监控deployment副本数量
启动相关配置
[root@k8smaster prometheusk8s]# kubectl create ns ops
namespace/ops created
[root@k8smaster prometheusk8s]# ls
alertmanager-configmap.yaml grafana.yaml node-exporter.yml prometheus-deployment.yaml
alertmanager-deployment.yaml kube-state-metrics.yaml prometheus-configmap.yaml prometheus-rules.yaml
[root@k8smaster prometheusk8s]# kubectl apply -f ./
[root@k8smaster prometheusk8s]# kubectl get pods -n ops -o wide
NAME READY STATUS RESTARTS AGE IP NODE
alertmanager-7d5fb96b7b-xpnrj 2/2 Running 10.244.249.9 k8snode1
grafana-757fcd5f7c-v6k4p 1/1 Running 10.244.249.25 k8snode1
kube-state-metrics-667bc48f47-b48qz 2/2 Running 10.244.249.10 k8snode1
node-exporter-d2xcr 1/1 Running 192.168.153.22 k8snode1
prometheus-859dbbc5f7-ztw56 2/2 Running 10.244.249.7 k8snode1
访问prometheus
http://192.168.153.22:30090/
grafana展示
K8S工作节点监控
K8S集群资源监控
K8S资源对象状态监控
Prometheus 告警
概述
Prometheus报警功能利用Alertmanager组件完成,当Prometheus会对接收的指标数据比对告警规则,如果
满足条件,则将告警事件发送给Alertmanager组件,Alertmanager组件发送到接收人。
使用步骤:
001 部署Alertmanager
002 配置告警接收人
003 配置Prometheus与Alertmanager通信
004 在Prometheus中创建告警规则
告警状态
• Inactive:这里什么都没有发生。
• Pending:已触发阈值,但未满足告警持续时间
• Firing:已触发阈值且满足告警持续时间。警报发送给接受者。
配置告警规则
apiVersion: v1
kind: ConfigMap
metadata:
name: alertmanager-config
namespace: ops
data:
alertmanager.yml: |
global:
resolve_timeout: 5m
smtp_smarthost: 'smtp.163.com:25'
smtp_from: '[email protected] '
smtp_auth_username: '[email protected] '
smtp_auth_password: 'FEVZPREWIFKVLBMI'
receivers:
- name: default-receiver
email_configs:
- to: "lql_h@[email protected] "
route:
group_interval: 1m
group_wait: 10s
receiver: default-receiver
repeat_interval: 1m
--------------------------------------------------------------
- alert: PodPending
expr: |
sum(kube_pod_status_phase{phase="Pending"}) by (pod,namespace) > 0
for: 1m
labels:
severity: error
annotations:
summary: "命名空间: {{ $labels.namespace }} | Pod名称: {{ $labels.pod }} Pod状态Pending (当前值: {{ $value }})"
模拟pod的pending
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: null
labels:
run: nginx
name: nginx
spec:
containers:
- image: nginx
name: nginx
resources:
requests:
cpu: 40
-----------------------------------------------------------------------
nginx 0/1 Pending 0 21m
小结
001 在service或pod配置注解:
annotations:
prometheus.io/scrape: 'true'
kube-state-metrics.yaml中有
002 数据被采集,可以写任意告警规则,出问题第一时间通知
003 如果grafana仪表盘无法满足你的需求,可以自定义
004 grafana图表没有数据:数据没采集到、promql有问题、服务器时间没同步
005 alertmanager和promet配置文件如果没有生效,可手动热加载
curl -XPOST 10.244.113.162:9093/-/reload
curl -XPOST 10.244.113.156:9090/-/reload