k8s-Prometheus

Prometheus组件与架构

• Prometheus Server:收集指标和存储时间序列数据,并提供查询接口
• ClientLibrary:客户端库
• Push Gateway:短期存储指标数据。主要用于临时性的任务
• Exporters:采集已有的第三方服务监控指标并暴露metrics
• Alertmanager:告警
• Web UI:简单的Web控制台
1637994777975.png

Prometheus监控

如果要想监控,前提是能获取被监控端指标数据,并且这个数据格式必须遵循Prometheus数据模型,这样才能识别和
采集,一般使用exporter提供监控指标数据
1637995053148.png

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
1638000447006.png

target

1638000496638.png

数据收集

http://192.168.153.27:9090/metrics
1638000667922.png

grafana展示

1638001087272.png
1638001478670.png

监控Linux服务器

node_exporter

[root@es3 ~]# nohup ./node_exporter >/dev/null 2>&1

数据收集

http://192.168.153.27:9100/metrics
1638002820037.png

修改配置文件

[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

查看是否被监控

1638003400302.png

grafana展示

1638003603978.png

1638003640093.png
1638003691539.png
1638003740239.png

查询数据

数据模型

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 监控实现思路

1638006644157.png
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/
1638011017978.png
1638011045930.png

1638011412522.png

1638011451559.png

1638011478498.png

grafana展示

K8S工作节点监控

1638013359877.png

1638013259925.png

K8S集群资源监控

1638014619625.png

1638014580316.png

K8S资源对象状态监控

1638014983605.png
1638014856056.png

Prometheus 告警

概述

Prometheus报警功能利用Alertmanager组件完成,当Prometheus会对接收的指标数据比对告警规则,如果
满足条件,则将告警事件发送给Alertmanager组件,Alertmanager组件发送到接收人。
使用步骤:
001 部署Alertmanager
002 配置告警接收人
003 配置Prometheus与Alertmanager通信
004 在Prometheus中创建告警规则
1638018709858.png

告警状态

• Inactive:这里什么都没有发生。
• Pending:已触发阈值,但未满足告警持续时间
• Firing:已触发阈值且满足告警持续时间。警报发送给接受者。
1638018769729.png

配置告警规则

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
1638018621143.png

1638018539272.png

小结

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


你可能感兴趣的:(k8s-Prometheus)