监控告警平台

Zabbix、Prometheus

CI/CD平台

Jenkins+glab+sq+argoCD+tekton

自动化运维平台

监控告警是个非常重要的平台

Prometheus

13-[信创]-K8s的监控-kube-prometheus-安装_服务发现

prometheus有很多组件组成

上图中间部分Prometheus server 就是我们所安装运行的Prometheus服务,这个Prometheus本身需要后端的存储:TSDB

Prometheus本身是一种数据库,TSDB就是一种数据库类型,这种数据库叫时序数据库,它本身就是一个横轴和数轴,xy轴。采集的数据存储在TSDB数据库里面 TSDB是Prometheus底层使用的数据的机制,叫TSDB,数据最终还是存储在对应Prometheus server对应的 硬盘上面,只是读取的方式是数据库读取,和文件系统读取不大一样,不是一个可读的文件方式 prometheus除了TSDB以外还给提供了 HTTP Server 有个UI界面 Prometheus只能负责采集数据和存储数据,本身没有报警和展示的功能,提供的HTTP Server不是展示ui界面,只是提供了查询界面,本身没有告警功能,没有生成绚丽的图形化的功能,针对这俩功能,有另外两个组件,上图右上,Alert manager:能够发报警的,短信微信钉钉,发送报警的组件 上图右下 Grafana 提供绚丽的ui,展示的组件,Grafana展示的数据是通过 Prometheus内部的查询语言叫Prom QL (Prom就是Prometheus,QL就是查询语言的意思,比如之前的SQL,S就是结构化的意思,QL是查询语言,SQL结构化查询语言) Prom QL 就是prometheus 创造的,之后还有很多应用采用了这种语言 整个Prometheus最主要的三个组件就是:Prometheus server 和Alert manager 还有 Grafana 还有一些服务发现组件,上图中上 Service discovery 服务发现组件,这个服务发现组件事实上我们呢可以基于文件系统级别的,可能就弄个文件, 什么叫服务发现:比如我们要监控主机,k8s集群有master节点和node节点,在我们这怎么知道集群有多少node节点,有多少master节点呢?我们是把节点加到集群上来,不管是master节点还是node节点,都是通过etcd存储,通过apiserver通信,所有的添加的组件都是添加剂etcd数据库里面的,etcd就类似一个服务发现,它能够通过注册到etcd服务里面来,知道你有多少个node,多少个pod,多少个kubelet kubeproxy 组件 prometheus 未来加监控,我们要动态知道有那些节点要加入到 prometheus server 里面来,我们可以通过服务发现的组件,服务发现的组件可以是我们的k8s集群,我们待会就基于k8s集群来做服务发现,也就是基于etcd的,第二种还有基于file_sd 一个文件系统的,整个文件的,就是我从文件里面定义好我把那些东西加进来,他就可以自动的去监控文件的变化。通过监控一个静态的文件的变化来实现服务的发现,除了这个以外还有很多。 我们这次基于k8s环境来做服务发现 上图中间和右面是常用的组件 上图左面 Pushgateway 就是我们prometheus server默认情况下怎么发现服务的呢?他是主动的方式,prometheus自己主动去发现那些监控的各种各样的角色,这叫主动模式,还有一些情况比较特殊,比如我现在有一个节点需要监控但是节点本身和prometheus主机本身网络不通,不在一个网络下,那prometheus无法主动去发现它,获取不到数据,然后就有这个Phshgatway的组件,这个组件是去发现node节点,或者node节点把想要监控的数据传给pushgateway 然后由pushgateway主动的把数据传给prometheus ,push方式 上传 ,就是pushgateway 主动的把采集的主机传给prometheusserver 这是被动的方式

prometheus 最主要的还是主动的方式,

上图左下 Jobs就是添加的各种各样的监控项,比如监控pod是否运行。jobs是通过exporters来去采集数据 如果想去自己写exporters 就需要自己懂开发的内容,但是现在不需要去写,都有对应的写好的

这就是prometheus的架构模型

➢ Prometheus Server:Prometheus 生态最重要的组件, 主要用于抓取和存储时间序 列数据, 同时
提供数据的查询和告警策略的配置管理;

➢ Alertmanager:Prometheus 生态用于告警的组件,Prometheus Server 会将告警发 送给

Alertmanager ,Alertmanager 根据路由配置,将告警信息发送给指定的人或 组。Alertmanager 支持邮件、Webhook、微信、钉钉、短信等媒介进行告警通知;

➢ Grafana:用于展示数据, 便于数据的查询和观测;

➢ Push Gateway:Prometheus 本身是通过 Pull 的方式拉取数据, 但是有些监控数据 可能是短期的, 如果没有采集数据可能会出现丢失。Push Gateway 可以用来解决 此类问题,它可以用来接收数据,也就是客户端可以通过 Push 的方式将数据推送 到 Push Gateway,之后 Prometheus 可以通过 Pull拉取该数据;

➢ Exporter:主要用来采集监控数据, 比如主机的监控数据可以通过 node_exporter 采集, MySQL的监控数据可以通过 mysql_exporter 采集,之后 Exporter 暴露一个 接口,比如/metrics ,Prometheus 可以通过该接口采集到数据;

➢ PromQL:PromQL 其实不算 Prometheus 的组件, 它是用来查询数据的一种语法, 比如查询数据库的数据,可以通过 SQL 语句,查询 Loki 的数据,可以通过 LogQL, 查询 Prometheus 数据的叫做

PromQL;

➢ Service Discovery:用来发现监控目标的自动发现,常用的有基于 Kubernetes、 Consul 、Eureka 、文件的自动发现等。

Prometheus安装

https://ghub.com/prometheus-operator

我们用的k8s集群是1.21的,我们使用prometheus最低版本是0.8

operator是一种包

如果是虚拟机安装那么更简单了,直接下载二进制包就行,都不需要安装

二进制官网下载地址

https://prometheus.io/download/

k8s安装方法

https://ghub.com/prometheus-operator/kube-prometheus

wget https://github.com/prometheus-operator/kube-prometheus/archive/refs/tags/v0.8.0.tar.gz
[root@master01 kube-prometheus]# tar xf kube-prometheus-0.8.0.tar.gz
[root@master01 kube-prometheus]# cd kube-prometheus-0.8.0/
[root@master01 kube-prometheus-0.8.0]# cd manifests/
[root@master01 manifests]# kubectl apply -f setup/
[root@master01 manifests]# kubectl apply -f .

登录Prometheus UI界面

[root@master01 manifests]# vim ./prometheus-service.yaml
[root@master01 manifests]# kubectl apply -f ./prometheus-service.yaml
apiVersion: v1
kind: Service
metadata:
  labels:
    app.kubernetes.io/component: prometheus
    app.kubernetes.io/name: prometheus
    app.kubernetes.io/part-of: kube-prometheus
    app.kubernetes.io/version: 2.26.0
    prometheus: k8s
  name: prometheus-k8s
  namespace: monitoring
spec:
  type: NodePort #添加类型为NodePort
  ports:
  - name: web
    port: 9090
    targetPort: web
  selector:
    app: prometheus
    app.kubernetes.io/component: prometheus
    app.kubernetes.io/name: prometheus
    app.kubernetes.io/part-of: kube-prometheus
    prometheus: k8s
#  sessionAffinity: ClientIP
# 注释掉
[root@master01 manifests]# kubectl apply -f ./prometheus-service.yaml

[root@master01 manifests]# kubectl get svc -n monitoring  prometheus-k8s
NAME             TYPE       CLUSTER-IP     EXTERNAL-IP   PORT(S)          AGE
prometheus-k8s   NodePort   10.105.1.233   <none>        9090:32330/TCP   10h

浏览器访问IP+32330

13-[信创]-K8s的监控-kube-prometheus-安装_数据_02

登录Garafana UI界面

apiVersion: v1
kind: Service
metadata:
  labels:
    app.kubernetes.io/component: grafana
    app.kubernetes.io/name: grafana
    app.kubernetes.io/part-of: kube-prometheus
    app.kubernetes.io/version: 7.5.4
  name: grafana
  namespace: monitoring
spec:
  type: NodePort  #增加这个
  ports:
  - name: http
    port: 3000
    targetPort: http
  selector:
    app.kubernetes.io/component: grafana
    app.kubernetes.io/name: grafana
    app.kubernetes.io/part-of: kube-prometheus
[root@master01 manifests]# kubectl apply -f grafana-service.yaml

[root@master01 manifests]# kubectl get svc -n monitoring grafana
NAME      TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
grafana   NodePort   10.101.232.40   <none>        3000:27477/TCP   11h

浏览器访问IP+27477

13-[信创]-K8s的监控-kube-prometheus-安装_IP_03

这个先不管,先把k8s所有组件都监控起来