k8s部署prometheus+grafana监控系统

prometheus+grafana监控系统

一、简介

监控对于业务系统的正常运行有着极其重要的作用,本文将介绍prometheus+grafana监控系统的原理架构、功能及部署流程。promethues是一套开源的监控告警系统,被越来越多的公司所接受,并于2016年加入CNCF。其官方系统架构如下:

promethues生态中有丰富的采集插件,通常称为exporter,prometheus通过主动拉取(pull)的方式将exporter暴露的metrics信息存储到自带的TSDB,可视化插件grafana通过promQL查询存储在prometheus的指标数据并展示出来。同时prometheus根据配置好的告警规则,与采集到的指标信息对比,若满足告警信息,则将告警推送到告警组件alertmanager,进而将告警信息通过邮件、钉钉、短信等方式告知相关负责人。

二、当前场景监控架构

一个完整的监控告警系统通常包含指标采集、数据存储、可视化展示、告警通知几个方面。github上的kube-prometheus项目(https://github.com/coreos/kube-prometheus)整合了上述几个方面的内容,以下为结合当前应用场景对kube-prometheus项目的实际应用,如下图为当前应用场景的监控架构图:

相关模块作用说明:

  • prometheus
  • grafana
  • prometheus-adapter
  • node-exporter
  • mysqld-exporter
  • kube-state-metrics
  • blackbox
  • kafka-exporter
  • redis-exporter
  • php-fpm-exporter
  • prometheus-operator
    其中,针对tidb的监控,tidb官方提供监控、tidb应用为一体的部署方式,监控内容包括数据库性能、binlog、服务器性能、tidb服务存活状态等,因其采用二进制部署的方式,所以tidb的监控没有其对应的ServiceMonitor。
    相反,在上图中,有ServiceMonitor对应的采集组件均为k8s方式编排部署。

1、采集

ServiceMonitor服务发现
如prometheus要刮到不同的命名空间下的exporter采集的metrics信息,则需要将metrics信息暴露在集群外,一方面增加了配置的复杂度,也增加了安全风险。这时候,ServiceMonitor应运而生。ServiceMonitor是Kubernetes自定义资源,该资源描述了Prometheus Server的Target列表,能通过Selector来依据 Labels 选取对应的Service的endpoints,并让 Prometheus Server 通过 Service 进行拉取,从而实现跨命名空间的动态服务发现。一个ServiceMonitor可对应一类service,如下图所示:
image.png
只需要将exporter用k8s的方式部署,每个exporter对应一个service,ServiceMonitor根据labelSelector发现相关联的service,进而prometheus可以从service中拉取Metrics信息。如下为创建中间件的serviceMonitor资源生命文件:

apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: middlewares-exporter
  namespace: monitoring
spec:
  endpoints:
  - interval: 15s
    port: http
  selector:
    matchLabels:
      app: middlewares-exporter

label定义为app: middlewares-exporter的service都能被该serviceMonitor发现。
基于文件的文件的服务发现
对于不采用serviceMonitor做服务发现的exporter,需要在promethues.yaml文件配置服务发现,配置步骤请参考第三章第3小节。

2、存储

时序存储:prometheus server用于收集和存储时序数据,当prometheus拉取到metrics信息之后以时间序列保存在数据库中,并暴露接口提供查询。
数据持久化:kube-prometheus默认的存储方式是emptyDir,其生命周期与pod一样,重启pod后数据会丢失,因此需要修改持久化方案,这里使用的是pv/pvc。

volumeMounts:
- mountPath: /prometheus
  name: prometheus-k8s-db
  subPath: prometheus-db
volumes:
- name: prometheus-k8s-db
  persistentVolumeClaim:
  claimName: prometheus-k8s-db-prometheus-k8s-0

3、展示

本系统采用grafana为监控系统的展示模块,在官方提供了丰富的展示模板,在grafana中配置数据源(此处为prometheus数据库),并导入官方提供的模板文件(可参考:https://grafana.com/grafana/dashboards),就能展示对应的数据指标。其模板文件是一个json文件,文件中定义了面板的样式、查询指标的SQL,以及当前面板的告警规则。

4、告警

方式一:alertmanager是独立的告警模块,prometheus根据告警规则将告警信息发送至alertmanager,经过alertmanager处理之后,通过邮件、钉钉等方式将告警信息发送给接收人。此方式可自定义告警模板,支持更多的定制化场景,可对告警静默、抑制,同时也增大了告警规则配置的复杂度,不易维护。
方式二:监控可视化模块grafana自带告警功能,可在展示面板中配置告警规则,告警信息可通过邮件、钉钉等方式通知对应的负责人,grafana的告警功能仅支持graph面板。
grafana自带的告警模块已能满足当前的应用场景,而且方便配置管理。因此本系统使用grafana自带的告警功能

三、部署

1、准备安装所需文件

下载资源文件

git clone https://github.com/coreos/kube-prometheus.git
整理分类文件
将官方提供的资源生命文件根据需要进行分类,本文中已适当裁剪不需要的组件,如:alertmanager。

mkdir prometheus
cp kube-prometheus/manifests/* prometheus/
cd prometheus/
mkdir -p node-exporter grafana kube-state-metrics prometheus serviceMonitor adapter redis-exporter、kafka-exporter、mysqld-exporter、black_box、ecs
mv *-serviceMonitor* serviceMonitor/
mv grafana-* grafana/
mv kube-state-metrics-* kube-state-metrics/
mv node-exporter-* node-exporter/
mv prometheus-adapter* adapter/
mv prometheus-* prometheus/

其中redis-exporter、mysqld-exporter、kafka-exporter、ecs、black_box是根据场景需要而创建的,里面存放对应exporter服务的资源生命文件。其中ecs厘米存放的是ecs主机监控的node-exporter资源生命文件,其好处是便于对集群外的监控对象更好的管理。另外black_box可实现http、dns、tcp、icmp的探测,可对应用服务的存活状态检测。需要注意的是,上述新创建的exporter中,除了black_box都需要在serviceMonitor文件夹中创建对应的serviceMonitor。

2、安装部署

#创建namespace与CustomResourceDefinitions(自定义资源)
kubectl create -f manifests/setup
#创建serviceMonitor
kubectl create -f serviceMonitor
#创建exporter
kubectl create -f node-exporter
kubectl create -f grafana
kubectl create -f kube-state-metrics
kubectl create -f prometheus
kubectl create -f adapter
kubectl create -f redis-exporter
kubectl create -f kafka-exporter
kubectl create -f mysqld-exporter
kubectl create -f black_box
kubectl create -f ecs
#创建后monitoring命名空间的pod如下,查看命令:
kubectl -n monitoring get pod

其中redis、kafka的exporter部署在redis、kafka所在的命名空间下,php应用监控的exporter已集成在应用的容器中,只需创建对应的serviceMonitor即可。

3、配置

配置prometheus服务发现
对于部署好的prometheus,我们常需要对其添加配置。在此,prometheus使用配置文件(prometheus-additional.yaml)创建secret然后挂载到prometheus的pod内的方式实现配置的改动。对于不采用serviceMonitor做服务发现的exporter,可以在prometheus-additional.yaml文件中添加发现的配置,然后重新生成secret。例如:添加dm的exporter的监控。
prometheus-additional.yaml:

- job_name: "http_2xx-api"
  scrape_interval: 10s
  scrape_timeout: 5s
  metrics_path: /probe
  params:
    module: [http_2xx]
  static_configs:
  - targets:
    - https://www.baidu.com
  relabel_configs:
  - source_labels: [__address__]
    target_label: __param_target
  - source_labels: [__param_target]
    target_label: instance
  - target_label: __address__
    replacement: blackbox-exporter:9115

创建secret对象:

kubectl create secret generic additional-configs --from-file=prometheus-additional.yaml -n monitoring
promethues资源生命对象文件中配置如下(prometheus-prometheus.yaml)

 apiVersion: monitoring.coreos.com/v1
    kind: Prometheus
    metadata:
      name: prometheus
    spec:
      replicas: 2
      resources:
        requests:
          memory: 400Mi
      additionalScrapeConfigs:
        name: additional-scrape-configs
        key: prometheus-additional.yaml

配置完成后,prometheus UI的target列表会新增dm_exporter的信息:
image.png
配置grafana告警
Notification channels配置
即配置告警途径,Grafana支持多种方式的告警:钉钉、Email、webhook等。
image.png

配置钉钉告警通道:
获取钉钉告警机器人的webhook:
在钉钉新建告警的群组,然后一次点击群设置–>智能群助手–>添加机器人,如下图所示:
image.png

添加之后在新添加的机器人上获取webhook:
image.png

将webhook添加到grafana钉钉告警配置页面中:
image.png
至此,钉钉告警的channel配置完成,对于邮件告警,则需在grafana.ini文件配置邮件服务器所需信息,然后新增email类型的channel,添加邮件接收人即可,本文不做赘述。grafana.ini添加的配置如下:

#################################### SMTP / Emailing ##########################

[smtp]
enabled = true
host = smtp.mxhichina.com:25
user = 发件人
password = your password

from_address = 发件人邮件地址
配置告警规则
针对具体的监控项,配置告警通知,以下对k8s主机磁盘使用率告警为例:
创建仪表盘,如下图,“A”代表k8s主机的磁盘使用率:

配置告警阈值、内容以及告警的方式:
其中Rule栏定义了此规则的名称,平均每1min计算A的值,并与condictions栏的阈值做比较,5min内如果仍然大于0.8,则将notifications中的message内容根据配置好的告警方式通知相关负责人。

4、测试验证

grafana接入并显示数据
在prometheus UI中查看target中是否存在已配置好的expoter

导入显示模板

上传显示的模板后,就能显示模板的样式,但是没数据,还需要配置prometheus数据源。下图为数据源的配置:

填写prometheus的url:

最后将dashboard的模板的数据源改成对应的prometheus数据库即可,最后效果如下:

grafana告警测试
根据第三章第3小节的配置grafana告警内容配置完成告警后,可手动调整告警的阈值使其满足告警条件,稍后查看是否有对应的告警信息。

你可能感兴趣的:(数据库,系统架构)