原创

prometheus基础

promethus基础

一、Prometheus概念

Prometheus 是一个开源的系统监控和报警系统,现在已经加入到 CNCF 基金会,成为继 k8s 之后第二 个在 CNCF 托管的项目,在 kubernetes 容器管理系统中,通常会搭配 prometheus 进行监控,同时也支持 多种 exporter 采集数据,还支持 pushgateway 进行数据上报, Prometheus 性能足够支撑上万台规模的集 群,使用go语言开发。

1.prometheus特点

Prometheus 是一个开源的监控和报警系统,具有以下几个主要特点:

多维数据模型:使用时间序列数据,配合标签(labels)进行灵活的查询和聚合。这使得用户可以对不同的维度进行监控,比如服务名称、实例、环境等。

强大的查询语言:PromQL(Prometheus Query Language)允许用户对存储的数据进行高级查询和分析,使得生成复杂的监控图表和报警条件更为直观。

拉取模型:通常使用拉取(pull)机制收集指标,Prometheus 定时从被监控的目标(如应用程序、服务等)获取数据,而不是由目标主动推送数据。

数据存储:具有高效的时间序列数据存储机制,支持本地存储和远程存储的集成。

告警功能:通过 Alertmanager 提供灵活的告警管理,支持多种通知方式(如邮件、Slack、PagerDuty 等)。

服务发现:支持多种服务发现机制(如 Kubernetes、Consul、EC2 等),能够动态发现和监控服务。

可扩展性:可以通过各种客户端库(如 Go、Java、Python 等)轻松集成到应用程序中,进行指标的采集。

图形界面:提供简单易用的界面,可以通过 Grafana 等工具进行可视化展示。

适用于云原生环境:特别适合于微服务架构和容器化环境(如 Kubernetes),能够很好地监控动态变化的服务。

2.Prometheus 组件

img

Prometheus Server

  • 负责从被监控的服务中抓取时间序列数据并存储。
  • 提供一个强大的查询语言(PromQL)以进行数据查询和分析。
  • 支持多种数据存储机制,主要为内存和磁盘。

Exporters

  • Exporters 是用来将应用程序和系统的指标转化为 Prometheus 适用格式的组件。
  • 有多种现成的 Exporter,如 Node Exporter(用于监控操作系统和硬件指标)、Blackbox Exporter(用于监控外部系统的可用性)等。
  • 用户也可以针对特定应用程序编写自定义 Exporter。

Push Gateway

  • 用于处理那些不能持久化在 Prometheus 服务器上的短期作业的监控数据。
  • Push Gateway 接收被监控目标的指标数据,并将这些数据存储,供 Prometheus 定时抓取。

Alertmanager

  • 处理来自 Prometheus 的告警信息,可以根据设定的规则进行告警路由、抑制和聚合。
  • 支持多种告警通知渠道,如 Email、Slack、PagerDuty 等。

Prometheus Query Language (PromQL)

  • 强大的查询语言,允许用户对存储的时间序列数据进行复杂的查询。
  • 支持多种操作,如切片、聚合、运算等,为用户提供灵活的数据分析能力。

Web UI

  • Prometheus 提供了简单的 web 界面,用户可以通过该界面查看监控数据、执行查询和配置告警。

Grafana

  • 虽然不是 Prometheus 的一部分,但 Grafana 是一个流行的可视化工具,可以与 Prometheus 集成,帮助用户创建动态仪表板,展示监控数据
3.Prometheus 工作流程

1.Prometheus server 可定期从活跃的( up)目标主机上( target)拉取监控指标数据,目标主机的监控数据可通过配置静态 job 或者服务发现的方式被 prometheus server 采集到,这种方式默认的 pull方式拉取指标;也可通过 pushgateway 把采集的数据上报到 prometheus server 中;还可通过一些组件自带的 exporter 采集相应组件的数据; 2.Prometheus server 把采集到的监控指标数据保存到本地磁盘或者数据库; 3.Prometheus 采集的监控指标数据按时间序列存储,通过配置报警规则,把触发的报警发送到alertmanager 4.Alertmanager 通过配置报警接收方,发送报警到邮件,微信或者钉钉等 5.Prometheus 自带的 web ui 界面提供 PromQL 查询语言,可查询监控数据 6.Grafana 可接入 prometheus 数据源,把监控数据以图形化形式展示出

4.Prometheus数据类型

Prometheus 提供了四种基本的数据类型,用于收集和存储监控指标。它们分别是:

  1. Counter(计数器)
  • 定义:只增值的数值,代表某个事件的总计。计数器可以递增,但不能减少(除非重启或清除)。
  • 常见应用:用于统计 HTTP 请求数、错误数、处理的任务数量等。
  1. Gauge(仪表值)
  • 定义:可以任意增减的数值,表示某一特定时刻的值。
  • 常见应用:用于监测当前温度、当前活跃用户数、内存使用量等。
  1. Histogram(直方图)
  • 定义:用于统计分布,记录了一组数值的分布情况。可以根据预定义的桶(buckets)来计算数值的频率。
  • 常见应用:测量请求延迟、响应时间等,可以获取不同延迟区间的请求数量。
  1. Summary(摘要)
  • 定义:用于计算一组数据的统计信息,尤其是快速计算百分位(如 90th、99th 分位数)。与 Histogram 相似,但 Summary 无需预定义桶。
  • 常见应用:用于监控请求延迟百分位数等。
5.prometheus能监控什么?

Prometheus 是一个强大的监控与报警系统,可以监控多种指标和应用类型。以下是一些常见的监控对象和使用场景:

  1. 基础设施监控
  • 服务器性能:CPU 使用率、内存使用量、磁盘 I/O、网络流量等。
  • 容器监控:Docker 和 Kubernetes 中运行的容器的资源使用情况。
  1. 应用监控
  • Web 应用:HTTP 请求数、响应时间、错误率、用户活跃度等。
  • 后台服务:任务处理的计数、处理时间、队列长度等。
  1. 数据库监控
  • 数据库性能:查询响应时间、连接池使用情况、错误数、事务数等。
  • 指标监控:如 MySQL、PostgreSQL、MongoDB 的性能指标。
  1. 网络监控
  • 网络流量:进出流量、丢包率、延迟等。
  • 网络服务:监控 DNS、HTTP、HTTPS 和其他网络服务的可用性和性能。
  1. 云服务监控
  • 云环境:监控 AWS、GCP、Azure 等提供的资源使用情况和服务状态。
  1. 自定义指标
  • 业务指标:根据具体业务需求定义并收集的指标,例如交易金额、用户注册数等。
  1. 告警系统
  • 自定义告警:基于监控数据创建自定义告警,根据阈值触发告警,发送通知。
  1. 分布式系统
  • 微服务监控:监控微服务架构中的服务健康状况、可用性和性能。

二、prometheus部署

prometheus是一个很大的体系,需要部署很多的插件。

1.node-exporter 组件安装和配置

node-exporter 可以采集机器(物理机、虚拟机、云主机等)的监控指标数据,能够采集到的指标包 括 CPU, 内存,磁盘,网络,文件数等信息。

由于我们是在k8s中部署,所以需要创建一个名称空间用于存放相关组件等

kubectl create ns kube-prometheus

组件的yml,vim node-export.yml

apiVersion: apps/v1
kind: DaemonSet #保证每个节点都能有完全一样的pod
metadata:
  name: node-exporter
  namespace: kube-prometheus
  labels:
    name: node-exporter
spec:
  selector:
    matchLabels:
     name: node-exporter
  template:
    metadata:
      labels:
        name: node-exporter
    spec:
    # hostNetwork、 hostIPC、 hostPID 都为 True 时,表示这个 Pod 里的所有容器,会直接使用宿主机的网络,直接与宿主机进行 IPC(进程间通信) 通信, 可以看到宿主机里正在运行的所有进程。加入了 hostNetwork:true 会直接将我们的宿主机的 9100 端口映射出来,从而不需要创建 service 在我们的宿主机上就会有一个 9100 的端口
      hostPID: true
      hostIPC: true
      hostNetwork: true
      containers:
      - name: node-exporter
        image: prom/node-exporter:v0.16.0
        ports:
        - containerPort: 9100
        resources:
          requests:
            cpu: 0.15
        securityContext:
          privileged: true #打开特权模式,这样容器才能有资源
        args: #配置需要加载的目录
        - --path.procfs
        - /host/proc
        - --path.sysfs
        - /host/sys
        - --collector.filesystem.ignored-mount-points
        - '"^/(sys|proc|dev|host|etc)($|/)"'
        volumeMounts:
        - name: dev
          mountPath: /host/dev
        - name: proc
          mountPath: /host/proc
        - name: sys
          mountPath: /host/sys
        - name: rootfs
          mountPath: /rootfs
      tolerations: #容忍度,主要是要让master节点运行
      - key: "node-role.kubernetes.io/master"
        operator: "Exists"
        effect: "NoSchedule"
      volumes: #去获取物理机的信息
        - name: proc
          hostPath:
            path: /proc
        - name: dev
          hostPath:
            path: /dev
        - name: sys
          hostPath:
            path: /sys
        - name: rootfs
          hostPath:
            path: /
#运行
kubectl apply -f node-export.yml

测试采集数据

curl http://ip:9100/metrics
#主机 cpu 的使用情况
curl http://ip:9100/metrics| grep node_cpu_seconds
2.Prometheus server 安装和配置
1.创建 sa 账号

创建 sa 账号, 对 sa 做 rbac 授权 ,因为我们需要很大的权限去采集数据,我们部署在k8s的pod中,运行在容器里所以需要做个最大的授权

#创建一个 sa 账号 monitor
kubectl create serviceaccount monitor -n kube-prometheus
#把 sa 账号 monitor 通过 clusterrolebing 绑定到 clusterrole 上
kubectl create clusterrolebinding monitor-clusterrolebinding -n kube-prometheus --clusterrole=cluster-admin --serviceaccount=kube-prometheus:monitor
2.创建 prometheus 数据存储目录
#在工作节点创建
mkdir /opt/data
chmod 777  /opt/data
3.安装 Prometheus server 服务

创建一个 configmap 存储卷,用来存放 prometheus 配置信息

#vim prometheus-cfg.yml
apiVersion: v1
kind: ConfigMap
metadata:
  labels:
    app: prometheus
  name: prometheus-config
  namespace: kube-prometheus
data:
  prometheus.yml: |
    global:
      scrape_interval: 15s #采集目标主机监控据的时间间隔
      scrape_timeout: 10s # 数据采集超时时间, 默认 10s
      evaluation_interval: 1m #触发告警检测的时间,默认是 1m
    scrape_configs: #配置数据源,称为 target每个target用job_name命名,又分为静态配置和服务发现
    - job_name: 'kubernetes-node'
      kubernetes_sd_configs:
      - role: node
      relabel_configs:
      - source_labels: [__address__]
        regex: '(.*):10250'
        replacement: '${1}:9100'
        target_label: __address__
        action: replace
      - action: labelmap
        regex: __meta_kubernetes_node_label_(.+)
    - job_name: 'kubernetes-node-cadvisor'
      kubernetes_sd_configs:
      - role:  node
      scheme: https
      tls_config:
        ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
      bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
      relabel_configs:
      - action: labelmap
        regex: __meta_kubernetes_node_label_(.+)
      - target_label: __address__
        replacement: kubernetes.default.svc:443
      - source_labels: [__meta_kubernetes_node_name]
        regex: (.+)
        target_label: __metrics_path__
        replacement: /api/v1/nodes/${1}/proxy/metrics/cadvisor
    - job_name: 'kubernetes-apiserver'
      kubernetes_sd_configs:
      - role: endpoints
      scheme: https
      tls_config:
        ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
      bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
      relabel_configs:
      - source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name]
        action: keep
        regex: default;kubernetes;https
    - job_name: 'kubernetes-service-endpoints'
      kubernetes_sd_configs:
      - role: endpoints
      relabel_configs:
      - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scrape]
        action: keep
        regex: true
      - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scheme]
        action: replace
        target_label: __scheme__
        regex: (https?)
      - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_path]
        action: replace
        target_label: __metrics_path__
        regex: (.+)
      - source_labels: [__address__, __meta_kubernetes_service_annotation_prometheus_io_port]
        action: replace
        target_label: __address__
        regex: ([^:]+)(?::\d+)?;(\d+)
        replacement: $1:$2
      - action: labelmap
        regex: __meta_kubernetes_service_label_(.+)
      - source_labels: [__meta_kubernetes_namespace]
        action: replace
        target_label: kubernetes_namespace
      - source_labels: [__meta_kubernetes_service_name]
        action: replace
        target_label: kubernetes_name
#运行
kubectl apply -f prometheus-cfg.yml
4.deployment 部署 prometheus
#vim prometheus-deploy.yml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: prometheus-server
  namespace: kube-prometheus
  labels:
    app: prometheus
spec:
  replicas: 1
  selector:
    matchLabels:
      app: prometheus
      component: server
    #matchExpressions:
    #- {key: app, operator: In, values: [prometheus]}
    #- {key: component, operator: In, values: [server]}
  template:
    metadata:
      labels:
        app: prometheus
        component: server
      annotations:
        prometheus.io/scrape: 'false'
    spec:
      nodeName: k8s-node1
      serviceAccountName: monitor
      containers:
      - name: prometheus
        image: prom/prometheus:v2.2.1
        imagePullPolicy: IfNotPresent
        command:
          - prometheus
          - --config.file=/etc/prometheus/prometheus.yml
          - --storage.tsdb.path=/prometheus
          - --storage.tsdb.retention=720h
          - --web.enable-lifecycle
        ports:
        - containerPort: 9090
          protocol: TCP
        volumeMounts:
        - mountPath: /etc/prometheus/prometheus.yml
          name: prometheus-config
          subPath: prometheus.yml
        - mountPath: /prometheus/
          name: prometheus-storage-volume
      volumes:
        - name: prometheus-config
          configMap:
            name: prometheus-config
            items:
              - key: prometheus.yml
                path: prometheus.yml
                mode: 0644
        - name: prometheus-storage-volume
          hostPath:
           path: /opt/data
           type: Directory
#执行
kubectl apply -f prometheus-deploy.yml
5.prometheus pod 创建一个 service
#vim prometheus-svc.yml
apiVersion: v1
kind: Service
metadata:
  name: prometheus
  namespace: kube-prometheus
  labels:
    app: prometheus
spec:
  type: NodePort
  ports:
    - port: 9090
      targetPort: 9090
      protocol: TCP
  selector:
    app: prometheus
    component: server
#执行
kubectl apply -f prometheus-svc.yml

访问

http://ip:port

3.Grafana安装和配置

Grafana 是一个跨平台的开源的度量分析和可视化工具,可以将采集的数据可视化的展示,并及时通知给告警接收方。 它主要有以下六大特点:

  1. 多数据源支持: Grafana 支持多种数据源,包括 Prometheus、InfluxDB、Elasticsearch、MySQL、PostgreSQL 等,用户可以轻松连接和查询不同类型的数据。
  2. 交互式仪表板: Grafana 提供强大的仪表板创建功能,用户可以自定义面板,进行拖放操作,创建符合需求的可视化视图。同时,支持多种图表类型,如折线图、仪表盘、表格等。
  3. 实时监控: Grafana 可以实时更新数据,并提供实时监控的能力。用户能够设置自动刷新间隔,以获取最新的监控数据。
  4. 丰富的插件生态: Grafana 拥有丰富的插件(如数据源插件、面板插件等),用户可以根据需求扩展功能,实现定制化的监控和可视化需求。
  5. 用户管理与权限控制: Grafana 提供多用户管理功能,支持创建用户、分组、设置权限,确保不同用户可以访问合适的数据和仪表板,提高数据安全性。
  6. 告警功能: Grafana 允许用户设置告警规则,并通过电子邮件、Slack、Webhook 等方式发送通知,帮助用户及时响应系统异常或关键指标变化。

安装 Grafana

#vim grafana.yml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: monitoring-grafana
  namespace: kube-system
spec:
  replicas: 1
  selector:
    matchLabels:
      task: monitoring
      k8s-app: grafana
  template:
    metadata:
      labels:
        task: monitoring
        k8s-app: grafana
    spec:
      containers:
      - name: grafana
        image: k8s.gcr.io/heapster-grafana-amd64:v5.0.4
        ports:
        - containerPort: 3000
          protocol: TCP
        volumeMounts:
        - mountPath: /etc/ssl/certs
          name: ca-certificates
          readOnly: true
        - mountPath: /var
          name: grafana-storage
        env:
        - name: INFLUXDB_HOST
          value: monitoring-influxdb
        - name: GF_SERVER_HTTP_PORT
          value: "3000"
          # The following env variables are required to make Grafana accessible via
          # the kubernetes api-server proxy. On production clusters, we recommend
          # removing these env variables, setup auth for grafana, and expose the grafana
          # service using a LoadBalancer or a public IP.
        - name: GF_AUTH_BASIC_ENABLED
          value: "false"
        - name: GF_AUTH_ANONYMOUS_ENABLED
          value: "true"
        - name: GF_AUTH_ANONYMOUS_ORG_ROLE
          value: Admin
        - name: GF_SERVER_ROOT_URL
          # If you're only using the API Server proxy, set this value instead:
          # value: /api/v1/namespaces/kube-system/services/monitoring-grafana/proxy
          value: /
      volumes:
      - name: ca-certificates
        hostPath:
          path: /etc/ssl/certs
      - name: grafana-storage
        emptyDir: {}
---
apiVersion: v1
kind: Service
metadata:
  labels:
    # For use as a Cluster add-on (https://github.com/kubernetes/kubernetes/tree/master/cluster/addons)
    # If you are NOT using this as an addon, you should comment out this line.
    kubernetes.io/cluster-service: 'true'
    kubernetes.io/name: monitoring-grafana
  name: monitoring-grafana
  namespace: kube-system
spec:
  # In a production setup, we recommend accessing Grafana through an external Loadbalancer
  # or through a public IP.
  # type: LoadBalancer
  # You could also use NodePort to expose the service at a randomly-generated port
  # type: NodePort
  ports:
  - port: 80
    targetPort: 3000
  selector:
    k8s-app: grafana
  type: NodePort
#执行
kubectl apply -f grafana.yml

访问

http://ip:port

img

配置

1.创建数据源

img

填写相应配置

img

导入监控模板

#下载地址
https://grafana.com/dashboards?dataSource=prometheus&search=kubernetes

点击左侧+号下面的 Import

img

点击上传下载的json模板

img

导入

1723729076698

完成后出现以下页面

1723729177127

创建ingress-nginx

#vim grafana-ingress.yml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: grafana-ingress #自定义ingress名称
  namespace: kube-system
  annotations:
    ingressclass.kubernetes.io/is-default-class: "true"
    kubernetes.io/ingress.class: nginx #指定控制器的类别为nginx
spec:
  rules: #定义主机列表
    - host: www.mygrafana.com #自定义域名
      http:
        paths:
          - pathType: Prefix #路径类型
            path: "/" #定义站点路径
            backend: #定义后端引用的服务
              service: #关联service
                name: monitoring-grafana #对应上面创建的service名称
                port:
                  number: 80 #service端口

三、prometheus传统部署

1.prometheus安装
1.下载普罗米修斯上传并解压
prometheus-2.27.1.linux-amd64.tar.gz
#解压
tar -zxvf prometheus-2.27.1.linux-amd64.tar.gz
#解压后移动到/usr/local/prometheus
mv prometheus-2.27.1.linux-amd64 /usr/local/prometheus
#切换到/usr/local/prometheus
cd /usr/local/prometheus

2.启动
#直接使用默认配置文件启动
./prometheus --config.file="prometheus.yml"

3.prometheus界面
ip:9090

2.node_exporter安装
1.下载客户端上传并解压
#node_exporter是被控端客户端
node_exporter-1.1.2.linux-amd64.tar.gz
#解压
tar -zxvf node_exporter-1.1.2.linux-amd64.tar.gz
#移动到/usr/local/node_exportter
mv node_exporter-1.1.2.linux-amd64 /usr/local/node_exportter
#切换到/usr/local/node_exportter
cd /usr/local/node_exportter

2.启动
nohup ./node_exporter &

3.浏览器访问
ip:9100/metrics

3.将客户端添加进监控
1.编辑配置文件
#在主配置文件最后加上下面三行
vim prometheus.yml
- job_name: 'agent1' #取一个job名称来代表被监控的机器
    static_configs:
    - targets: ['ip:9100'] # 这里改成被监控机器的IP,后面端口接9100

2.杀死所有prometheus进程
pkill prometheus

3.启动
nohup ./prometheus --config.file="prometheus.yml" &


4.监控mysql

在主配置文件最后加上下面三行

#mysql
  - job_name: 'local_mysql'
    static_configs:
    - targets: ['ip:3306']

4.grafana安装

Grafana是一个开源的度量分析和可视化工具,可以通过将采集的数据分析,查询,然后进行可视化的展示,并能实现报警

1.下载
#下载地址
https://grafana.com/grafana/download
wget https://dl.grafana.com/enterprise/release/grafana-enterprise-9.1.5-1.x86_64.rpm

2.安装
yum -y install grafana-enterprise-9.1.5-1.x86_64.rpm

3.启动服务
systemctl start grafana-server
systemctl enable grafana-server
#查看端口
netstat -anp|grep 3000

4.浏览器访问
ip:3000
默认的admin用户,admin密码

prometheus
  • 作者:shi(联系作者)
  • 发表时间:2024-08-15 22:26:12
  • 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)
  • 公众号转载:请在文末添加作者公众号二维码
  • 评论